pkgsrc-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: pkg/45047: pkgtools/pkg_install minix support



On Fri, Jun 10, 2011 at 03:55:00PM +0000, tcort%minix3.org@localhost wrote:
> diff --git a/pkgtools/pkg_install/Makefile b/pkgtools/pkg_install/Makefile
> index 392093c..b262265 100644
> --- a/pkgtools/pkg_install/Makefile
> +++ b/pkgtools/pkg_install/Makefile
> @@ -142,6 +142,10 @@ LIBS+=           -larchive
>  CPPFLAGS+=   -I${WRKDIR}/libfetch
>  LDFLAGS+=    -L${WRKDIR}/libfetch
>  
> +.  if ${OPSYS} == "Minix"
> +LIBS+=               -larchive -lbz2 -lz
> +.  endif
> +
>  CONFIGURE_ENV+=      LIBS=${LIBS:Q}
>  
>  do-extract:

This is wrong, it shouldn't be needed.

> diff --git a/pkgtools/pkg_install/files/add/perform.c 
> b/pkgtools/pkg_install/files/add/perform.c
> index aa3dff3..cf7a5c5 100644
> --- a/pkgtools/pkg_install/files/add/perform.c
> +++ b/pkgtools/pkg_install/files/add/perform.c
> @@ -52,6 +52,7 @@ __RCSID("$NetBSD: perform.c,v 1.98 2010/09/14 22:26:18 gdt 
> Exp $");
>  #include <stdlib.h>
>  #include <string.h>
>  #include <unistd.h>
> +#include <assert.h>
>  
>  #include <archive.h>
>  #include <archive_entry.h>
> @@ -126,7 +127,12 @@ static const struct pkg_meta_desc {
>       { 0, NULL, 0, 0 },
>  };
>  
> -static int pkg_do(const char *, int, int);
> +struct dependency_stack {
> +     struct dependency_stack *prev;
> +     const char *pkgpath;
> +};
> +
> +static int pkg_do(const char *, int, int, struct dependency_stack *);
>  
>  static int
>  end_of_version(const char *opsys, const char *version_end)
> @@ -738,7 +744,7 @@ extract_files(struct pkg_task *pkg)
>                       continue;
>  
>               case PLIST_CMD:
> -                     if (format_cmd(cmd, sizeof(cmd), p->name, pkg->prefix, 
> last_file))
> +                     if (format_cmd(cmd, sizeof(cmd), p->name, 
> pkg->install_prefix, last_file))
>                               return -1;
>                       printf("Executing '%s'\n", cmd);
>                       if (!Fake && system(cmd))

What are you trying to do here?

> @@ -858,6 +864,35 @@ pkg_register_depends(struct pkg_task *pkg)
>       free(text);
>  }
>  
> +#ifdef __minix
> +static void
> +normalise_version(char *release, char *version)
> +{
> +     char actual_version[50];
> +     int l1, l2;
> +
> +     assert(release && version);
> +
> +     l1 = strlen(release);
> +     l2 = strlen(version);
> +
> +     assert(l1 + l2 + 2 < sizeof(actual_version));
> +
> +     if(l1 > 0 && l2 > 0)
> +             snprintf(actual_version, sizeof(actual_version),
> +                     "%s.%s", release, version);
> +        else if(strlen(release) > 0)
> +             strncpy(actual_version, release, sizeof(actual_version)-1);
> +     else if(strlen(version) > 0)
> +             strncpy(actual_version, version, sizeof(actual_version)-1);
> +     else
> +             errx(EXIT_FAILURE, "no version info");
> +
> +     strcpy(release, actual_version);
> +     version[0] = '\0';
> +}
> +#endif
> +
>  /*
>   * Reduce the result from uname(3) to a canonical form.
>   */
> @@ -870,6 +905,9 @@ normalise_platform(struct utsname *host_name)
>       span = strspn(host_name->release, "0123456789.");
>       host_name->release[span] = '\0';
>  #endif
> +#ifdef __minix
> +     normalise_version(host_name->release, host_name->version);
> +#endif
>  }
>  
>  /*
> @@ -880,7 +918,7 @@ check_platform(struct pkg_task *pkg)
>  {
>       struct utsname host_uname;
>       const char *effective_arch;
> -     int fatal;
> +     int fatal = 0;
>  
>       if (uname(&host_uname) < 0) {
>               if (Force) {
> @@ -906,6 +944,10 @@ check_platform(struct pkg_task *pkg)
>       else
>               fatal = 0;
>  
> +#ifdef __minix
> +     normalise_version(host_uname.release, host_uname.version);
> +#endif
> +
>       if (fatal ||
>           compatible_platform(OPSYS_NAME, host_uname.release,
>                               pkg->buildinfo[BI_OS_VERSION]) != 1) {
> @@ -1093,7 +1135,7 @@ check_implicit_conflict(struct pkg_task *pkg)
>  }
>  
>  static int
> -check_dependencies(struct pkg_task *pkg)
> +check_dependencies(struct pkg_task *pkg, struct dependency_stack 
> *dependency_stack)
>  {
>       plist_t *p;
>       char *best_installed;
> @@ -1124,7 +1166,7 @@ check_dependencies(struct pkg_task *pkg)
>                                   p->name);
>                               continue;
>                       }
> -                     if (pkg_do(p->name, 1, 0)) {
> +                     if (pkg_do(p->name, 1, 0, dependency_stack)) {
>                               if (ForceDepends) {
>                                       warnx("Can't install dependency %s, "
>                                           "continuing", p->name);
> @@ -1373,12 +1415,33 @@ check_license(struct pkg_task *pkg)
>   * Install a single package.
>   */
>  static int
> -pkg_do(const char *pkgpath, int mark_automatic, int top_level)
> +pkg_do(const char *pkgpath, int mark_automatic, int top_level, 
> +     struct dependency_stack *dependency_stack)
>  {
>       char *archive_name;
>       int status, invalid_sig;
>       struct pkg_task *pkg;
>  
> +     /* workaround 2010-12-10: prevent endless recursion for circular 
> dependencies */
> +     struct dependency_stack dependency_stack_top;

Please don't. If you want to catch circular dependencies, just use a
counter. Bigger question of course is, why you ended up here in first
place...

> +
> +     dependency_stack_top.prev = dependency_stack;
> +     dependency_stack_top.pkgpath = pkgpath;
> +
> +     while (dependency_stack) {
> +             if (strcmp(dependency_stack->pkgpath, pkgpath) == 0) {
> +                     fprintf(stderr, "warning: ignoring circular 
> dependency:\n");
> +                     dependency_stack = &dependency_stack_top;
> +                     while (dependency_stack) {
> +                             fprintf(stderr, "- %s\n", 
> dependency_stack->pkgpath);
> +                             dependency_stack = dependency_stack->prev;
> +                     }
> +                     return 0;
> +             }
> +             dependency_stack = dependency_stack->prev;
> +     }
> +     /* end workaround */
> +     
>       pkg = xcalloc(1, sizeof(*pkg));
>  
>       status = -1;
> @@ -1490,7 +1553,7 @@ pkg_do(const char *pkgpath, int mark_automatic, int 
> top_level)
>                       pkg->install_logdir_real = NULL;
>               }
>  
> -             if (check_dependencies(pkg))
> +             if (check_dependencies(pkg, &dependency_stack_top))
>                       goto nuke_pkgdb;
>       } else {
>               /*
> @@ -1498,7 +1561,7 @@ pkg_do(const char *pkgpath, int mark_automatic, int 
> top_level)
>                * Install/update dependencies first and
>                * write the current package to disk afterwards.
>                */ 
> -             if (check_dependencies(pkg))
> +             if (check_dependencies(pkg, &dependency_stack_top))
>                       goto clean_memory;
>  
>               if (write_meta_data(pkg))
> @@ -1582,7 +1645,7 @@ pkg_perform(lpkg_head_t *pkgs)
>       lpkg_t *lpp;
>  
>       while ((lpp = TAILQ_FIRST(pkgs)) != NULL) {
> -             if (pkg_do(lpp->lp_name, Automatic, 1))
> +             if (pkg_do(lpp->lp_name, Automatic, 1, NULL))
>                       ++errors;
>               TAILQ_REMOVE(pkgs, lpp, lp_link);
>               free_lpkg(lpp);
> diff --git a/pkgtools/pkg_install/files/configure 
> b/pkgtools/pkg_install/files/configure

Please don't include generated files in diffs, they just provide noise.

> diff --git a/pkgtools/pkg_install/files/info/show.c 
> b/pkgtools/pkg_install/files/info/show.c
> index e44a6c9..89940e3 100644
> --- a/pkgtools/pkg_install/files/info/show.c
> +++ b/pkgtools/pkg_install/files/info/show.c
> @@ -60,6 +60,9 @@ __RCSID("$NetBSD: show.c,v 1.31 2010/11/22 09:00:12 joerg 
> Exp $");
>  #if HAVE_ERR_H
>  #include <err.h>
>  #endif
> +#if HAVE_SYS_PARAM_H
> +#include <sys/param.h>
> +#endif
>  
>  #include "defs.h"
>  #include "lib.h"

Why?

> diff --git a/pkgtools/pkg_install/files/lib/plist.c 
> b/pkgtools/pkg_install/files/lib/plist.c
> index f1b6c6d..d171ad4 100644
> --- a/pkgtools/pkg_install/files/lib/plist.c
> +++ b/pkgtools/pkg_install/files/lib/plist.c
> @@ -514,6 +514,7 @@ delete_package(Boolean ign_err, package_t *pkg, Boolean 
> NoDeleteFiles,
>       int     fail = SUCCESS;
>       Boolean preserve;
>       char    tmp[MaxPathSize];
> +     char    cmd[MaxPathSize];
>       const char *prefix = NULL, *name = NULL;
>  
>       if (!pkgdb_open(ReadWrite)) {
> @@ -580,10 +581,12 @@ delete_package(Boolean ign_err, package_t *pkg, Boolean 
> NoDeleteFiles,
>               case PLIST_UNEXEC:
>                       if (NoDeleteFiles)
>                               break;
> -                     format_cmd(tmp, sizeof(tmp), p->name, prefix, 
> last_file);
> -                     printf("Executing `%s'\n", tmp);
> -                     if (!Fake && system(tmp)) {
> -                             warnx("unexec command for `%s' failed", tmp);
> +                     (void) snprintf(tmp, sizeof(tmp), "%s%s%s",
> +                                     destdir ? destdir : "", destdir ? "/" : 
> "", prefix);
> +                     format_cmd(cmd, sizeof(cmd), p->name, tmp, last_file);
> +                     printf("Executing `%s'\n", cmd);
> +                     if (!Fake && system(cmd)) {
> +                             warnx("unexec command for `%s' failed", cmd);
>                               fail = FAIL;
>                       }
>                       break;
> 

Why?

Joerg


Home | Main Index | Thread Index | Old Index