Bring in the latest pkg_install sources from FreeBSD-5.
authorMatthew Dillon <dillon@dragonflybsd.org>
Fri, 30 Jul 2004 04:46:14 +0000 (04:46 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Fri, 30 Jul 2004 04:46:14 +0000 (04:46 +0000)
Note that the only substantive DragonFly changes, apart from adding our
CVS id and doing a few other cleanups, are in add/main.c:getpackagesite().

68 files changed:
usr.sbin/pkg_install/Makefile
usr.sbin/pkg_install/Makefile.inc
usr.sbin/pkg_install/add/Makefile
usr.sbin/pkg_install/add/add.h
usr.sbin/pkg_install/add/extract.c
usr.sbin/pkg_install/add/futil.c
usr.sbin/pkg_install/add/main.c
usr.sbin/pkg_install/add/perform.c
usr.sbin/pkg_install/add/pkg_add.1
usr.sbin/pkg_install/create/Makefile
usr.sbin/pkg_install/create/create.h
usr.sbin/pkg_install/create/main.c
usr.sbin/pkg_install/create/perform.c
usr.sbin/pkg_install/create/pkg_create.1
usr.sbin/pkg_install/create/pl.c
usr.sbin/pkg_install/delete/Makefile
usr.sbin/pkg_install/delete/delete.h
usr.sbin/pkg_install/delete/main.c
usr.sbin/pkg_install/delete/perform.c
usr.sbin/pkg_install/delete/pkg_delete.1
usr.sbin/pkg_install/info/Makefile
usr.sbin/pkg_install/info/info.h
usr.sbin/pkg_install/info/main.c
usr.sbin/pkg_install/info/perform.c
usr.sbin/pkg_install/info/pkg_info.1
usr.sbin/pkg_install/info/show.c
usr.sbin/pkg_install/lib/Makefile
usr.sbin/pkg_install/lib/deps.c
usr.sbin/pkg_install/lib/exec.c
usr.sbin/pkg_install/lib/file.c
usr.sbin/pkg_install/lib/global.c
usr.sbin/pkg_install/lib/lib.h
usr.sbin/pkg_install/lib/match.c
usr.sbin/pkg_install/lib/msg.c
usr.sbin/pkg_install/lib/pen.c
usr.sbin/pkg_install/lib/pkgwrap.c
usr.sbin/pkg_install/lib/plist.c
usr.sbin/pkg_install/lib/str.c
usr.sbin/pkg_install/lib/url.c [new file with mode: 0644]
usr.sbin/pkg_install/lib/version.c
usr.sbin/pkg_install/sign/Makefile
usr.sbin/pkg_install/sign/README
usr.sbin/pkg_install/sign/check.c
usr.sbin/pkg_install/sign/common.c
usr.sbin/pkg_install/sign/extern.h
usr.sbin/pkg_install/sign/gzip.c
usr.sbin/pkg_install/sign/gzip.h
usr.sbin/pkg_install/sign/main.c
usr.sbin/pkg_install/sign/pgp.h
usr.sbin/pkg_install/sign/pgp_check.c
usr.sbin/pkg_install/sign/pgp_sign.c
usr.sbin/pkg_install/sign/pkg_sign.1
usr.sbin/pkg_install/sign/sha1.c
usr.sbin/pkg_install/sign/sign.c
usr.sbin/pkg_install/sign/stand.c
usr.sbin/pkg_install/sign/stand.h
usr.sbin/pkg_install/sign/x509.c
usr.sbin/pkg_install/tkpkg
usr.sbin/pkg_install/update/Makefile [deleted file]
usr.sbin/pkg_install/update/pkg_update.1 [deleted file]
usr.sbin/pkg_install/update/pkg_update.pl [deleted file]
usr.sbin/pkg_install/version/Makefile
usr.sbin/pkg_install/version/main.c [new file with mode: 0644]
usr.sbin/pkg_install/version/perform.c [new file with mode: 0644]
usr.sbin/pkg_install/version/pkg_version.1
usr.sbin/pkg_install/version/pkg_version.pl [deleted file]
usr.sbin/pkg_install/version/test-pkg_version.sh
usr.sbin/pkg_install/version/version.h [new file with mode: 0644]

index ef173b7..3faa79d 100644 (file)
@@ -1,11 +1,10 @@
-# $FreeBSD: src/usr.sbin/pkg_install/Makefile,v 1.5.2.7 2003/01/09 12:05:52 des Exp $
-# $DragonFly: src/usr.sbin/pkg_install/Attic/Makefile,v 1.3 2003/08/03 16:45:16 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/Makefile,v 1.15 2004/01/17 13:41:16 ru Exp $
+# $DragonFly: src/usr.sbin/pkg_install/Attic/Makefile,v 1.4 2004/07/30 04:46:11 dillon Exp $
 
-SUBDIR=        lib add create delete info update version
+SUBDIR=        lib add create delete info ${_sign} version
 
 .if !defined(NOCRYPT) && !defined(NO_OPENSSL)
-DISTRIBUTION=  crypto
-SUBDIR+= sign
+_sign= sign
 .endif
 
 .include <bsd.subdir.mk>
index 5e78548..5ed4556 100644 (file)
@@ -1,5 +1,5 @@
-# $FreeBSD: src/usr.sbin/pkg_install/Makefile.inc,v 1.5 1999/08/28 01:17:53 peter Exp $
-# $DragonFly: src/usr.sbin/pkg_install/Attic/Makefile.inc,v 1.2 2003/06/17 04:29:59 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/Makefile.inc,v 1.10 2004/01/17 13:41:16 ru Exp $
+# $DragonFly: src/usr.sbin/pkg_install/Attic/Makefile.inc,v 1.3 2004/07/30 04:46:11 dillon Exp $
 
 .if exists(${.OBJDIR}/../lib)
 LIBINSTALL=    ${.OBJDIR}/../lib/libinstall.a
@@ -7,5 +7,17 @@ LIBINSTALL=    ${.OBJDIR}/../lib/libinstall.a
 LIBINSTALL=    ${.CURDIR}/../lib/libinstall.a
 .endif
 
+.if !defined(NOCRYPT) && !defined(NO_OPENSSL) && \
+    defined(LDADD) && ${LDADD:M-lfetch} != ""
+DISTRIBUTION=  crypto
+DPADD+=                ${LIBSSL} ${LIBCRYPTO}
+LDADD+=                -lssl -lcrypto
+.endif
+
+# turn off for now (fails w/ gcc34)
+WFORMAT=0
+
 # Inherit BINDIR from one level up.
-.include "../Makefile.inc"
+.if exists(${.CURDIR}/../../Makefile.inc)
+.include "${.CURDIR}/../../Makefile.inc"
+.endif
index ba1f6e4..4225145 100644 (file)
@@ -1,19 +1,15 @@
-# $FreeBSD: src/usr.sbin/pkg_install/add/Makefile,v 1.11.2.4 2003/01/09 12:05:53 des Exp $
-# $DragonFly: src/usr.sbin/pkg_install/add/Attic/Makefile,v 1.3 2003/08/03 16:45:16 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/add/Makefile,v 1.20 2004/07/28 07:19:15 kan Exp $
+# $DragonFly: src/usr.sbin/pkg_install/add/Attic/Makefile,v 1.4 2004/07/30 04:46:12 dillon Exp $
 
 PROG=  pkg_add
 SRCS=  main.c perform.c futil.c extract.c
 
 CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
 
-WARNS?=        2
+WARNS?=        3
+WFORMAT?=      1
 
 DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD}
 LDADD= ${LIBINSTALL} -lfetch -lmd
 
-.if !defined(NOCRYPT) && !defined(NO_OPENSSL)
-DPADD+=        ${LIBSSL} ${LIBCRYPTO}
-LDADD+=        -lssl -lcrypto
-.endif
-
 .include <bsd.prog.mk>
index 196036c..a83e53f 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/add/add.h,v 1.9.2.1 2001/10/23 09:16:03 sobomax Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/add/Attic/add.h,v 1.2 2003/06/17 04:29:59 dillon Exp $ */
-
 /*
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
@@ -19,6 +16,9 @@
  *
  * Include and define various things wanted by the add command.
  *
+ * $FreeBSD: src/usr.sbin/pkg_install/add/add.h,v 1.11 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/add/Attic/add.h,v 1.3 2004/07/30 04:46:12 dillon Exp $
+ *
  */
 
 #ifndef _INST_ADD_H_INCLUDE
@@ -29,12 +29,12 @@ typedef enum { NORMAL, MASTER, SLAVE } add_mode_t;
 extern char    *Prefix;
 extern Boolean NoInstall;
 extern Boolean NoRecord;
-extern Boolean Force;
 extern char    *Mode;
 extern char    *Owner;
 extern char    *Group;
 extern char    *Directory;
 extern char    *PkgName;
+extern char    *PkgAddCmd;
 extern char    FirstPen[];
 extern add_mode_t AddMode;
 
index 98a602d..34607c3 100644 (file)
  *
  * This is the package extraction code for the add module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/add/extract.c,v 1.25.2.6 2002/08/31 18:45:32 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/add/Attic/extract.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/add/extract.c,v 1.42 2004/07/28 07:19:15 kan Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/add/Attic/extract.c,v 1.3 2004/07/30 04:46:12 dillon Exp $
  */
 
+#include <ctype.h>
 #include <err.h>
 #include "lib.h"
 #include "add.h"
 
 
-#define STARTSTRING "tar cf - "
-#define TOOBIG(str) (((int)strlen(str) + FILENAME_MAX + where_count > maxargs) \
-               || ((int)strlen(str) + FILENAME_MAX + perm_count > maxargs))
+#define STARTSTRING "/usr/bin/tar cf -"
+#define TOOBIG(str) \
+    (((int)strlen(str) + FILENAME_MAX + where_count > maxargs) ||\
+       ((int)strlen(str) + FILENAME_MAX + perm_count > maxargs))
 
 #define PUSHOUT(todir) /* push out string */ \
-        if (where_count > (int)sizeof(STARTSTRING)-1) { \
-                   strcat(where_args, "|tar --unlink -xpf - -C "); \
-                   strcat(where_args, todir); \
-                   if (system(where_args)) { \
-                       cleanup(0); \
-                       errx(2, \
-                           "%s: can not invoke %ld byte tar pipeline: %s", \
-                            __func__, \
-                            (long)strlen(where_args), where_args); \
-                   } \
-                   strcpy(where_args, STARTSTRING); \
-                   where_count = sizeof(STARTSTRING)-1; \
+    if (where_count > (int)sizeof(STARTSTRING)-1) { \
+       strcat(where_args, "|/usr/bin/tar --unlink -xpf - -C "); \
+       strcat(where_args, todir); \
+       if (system(where_args)) { \
+           cleanup(0); \
+           errx(2, "%s: can not invoke %ld byte tar pipeline: %s", \
+                __func__, (long)strlen(where_args), where_args); \
        } \
-       if (perm_count) { \
-                   apply_perms(todir, perm_args); \
-                   perm_args[0] = 0;\
-                   perm_count = 0; \
-       }
+       strcpy(where_args, STARTSTRING); \
+       where_count = sizeof(STARTSTRING)-1; \
+    } \
+    if (perm_count) { \
+       apply_perms(todir, perm_args); \
+       perm_args[0] = 0;\
+       perm_count = 0; \
+    }
 
 static void
 rollback(const char *name, const char *home, PackingList start, PackingList stop)
@@ -76,6 +76,28 @@ rollback(const char *name, const char *home, PackingList start, PackingList stop
     }
 }
 
+#define add_char(buf, len, pos, ch) do {\
+    if ((pos) < (len)) { \
+        buf[(pos)] = (ch); \
+        buf[(pos) + 1] = '\0'; \
+    } \
+    ++(pos); \
+} while (0)
+
+static int
+add_arg(char *buf, int len, const char *str)
+{
+    int i = 0;
+
+    add_char(buf, len, i, ' ');
+    for (; *str != '\0'; ++str) {
+       if (!isalnum(*str) && *str != '/' && *str != '.' && *str != '-')
+           add_char(buf, len, i, '\\');
+       add_char(buf, len, i, *str);
+    }
+    return (i);
+}
+
 void
 extract_plist(const char *home, Package *pkg)
 {
@@ -109,7 +131,7 @@ extract_plist(const char *home, Package *pkg)
     Group = NULL;
     Mode = NULL;
     last_file = NULL;
-    (const char *)Directory = home;
+    Directory = (char *)home;
 
     /* Do it */
     while (p) {
@@ -129,11 +151,6 @@ extract_plist(const char *home, Package *pkg)
            if (!Fake) {
                char try[FILENAME_MAX];
 
-               if (strrchr(p->name,'\'')) {
-                 cleanup(0);
-                 errx(2, "%s: Bogus filename \"%s\"", __func__, p->name);
-               }
-               
                /* first try to rename it into place */
                snprintf(try, FILENAME_MAX, "%s/%s", Directory, p->name);
                if (fexists(try)) {
@@ -157,8 +174,8 @@ extract_plist(const char *home, Package *pkg)
                    if (p->name[0] == '/' || TOOBIG(p->name)) {
                        PUSHOUT(Directory);
                    }
-                   add_count = snprintf(&perm_args[perm_count], maxargs - perm_count, "'%s' ", p->name);
-                   if (add_count < 0 || add_count > maxargs - perm_count) {
+                   add_count = add_arg(&perm_args[perm_count], maxargs - perm_count, p->name);
+                   if (add_count < 0 || add_count >= maxargs - perm_count) {
                        cleanup(0);
                        errx(2, "%s: oops, miscounted strings!", __func__);
                    }
@@ -177,16 +194,14 @@ extract_plist(const char *home, Package *pkg)
                    else if (p->name[0] == '/' || TOOBIG(p->name)) {
                        PUSHOUT(Directory);
                    }
-                   add_count = snprintf(&where_args[where_count], maxargs - where_count, " '%s'", p->name);
-                   if (add_count < 0 || add_count > maxargs - where_count) {
+                   add_count = add_arg(&where_args[where_count], maxargs - where_count, p->name);
+                   if (add_count < 0 || add_count >= maxargs - where_count) {
                        cleanup(0);
                        errx(2, "%s: oops, miscounted strings!", __func__);
                    }
                    where_count += add_count;
-                   add_count = snprintf(&perm_args[perm_count],
-                                        maxargs - perm_count,
-                                        "'%s' ", p->name);
-                   if (add_count < 0 || add_count > maxargs - perm_count) {
+                   add_count = add_arg(&perm_args[perm_count], maxargs - perm_count, p->name);
+                   if (add_count < 0 || add_count >= maxargs - perm_count) {
                        cleanup(0);
                        errx(2, "%s: oops, miscounted strings!", __func__);
                    }
@@ -207,7 +222,7 @@ extract_plist(const char *home, Package *pkg)
                Directory = p->name;
            }
            else
-               (const char *)Directory = home;
+               Directory = (char *)home;
            break;
 
        case PLIST_CMD:
@@ -222,7 +237,7 @@ extract_plist(const char *home, Package *pkg)
                errx(2, "%s: no directory specified for '%s' command",
                    __func__, p->name);
            }
-           format_cmd(cmd, p->name, Directory, last_file);
+           format_cmd(cmd, FILENAME_MAX, p->name, Directory, last_file);
            PUSHOUT(Directory);
            if (Verbose)
                printf("extract: execute '%s'\n", cmd);
index c1b9bce..d4860b6 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Miscellaneous file access utilities.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/add/futil.c,v 1.9.2.4 2002/08/20 06:35:07 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/add/Attic/futil.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/add/futil.c,v 1.14 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/add/Attic/futil.c,v 1.3 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include <err.h>
@@ -49,7 +49,7 @@ make_hierarchy(char *dir)
            }
        }
        else {
-           if (vsystem("mkdir %s", dir)) {
+           if (vsystem("/bin/mkdir %s", dir)) {
                if (cp2)
                    *cp2 = '/';
                return FAIL;
@@ -77,20 +77,20 @@ apply_perms(const char *dir, const char *arg)
        cd_to = dir;
 
     if (Mode)
-       if (vsystem("cd %s && chmod -R %s %s", cd_to, Mode, arg))
+       if (vsystem("cd %s && /bin/chmod -R %s %s", cd_to, Mode, arg))
            warnx("couldn't change modes of '%s' to '%s'", arg, Mode);
     if (Owner && Group) {
-       if (vsystem("cd %s && chown -R %s:%s %s", cd_to, Owner, Group, arg))
+       if (vsystem("cd %s && /usr/sbin/chown -R %s:%s %s", cd_to, Owner, Group, arg))
            warnx("couldn't change owner/group of '%s' to '%s:%s'",
                   arg, Owner, Group);
        return;
     }
     if (Owner) {
-       if (vsystem("cd %s && chown -R %s %s", cd_to, Owner, arg))
+       if (vsystem("cd %s && /usr/sbin/chown -R %s %s", cd_to, Owner, arg))
            warnx("couldn't change owner of '%s' to '%s'", arg, Owner);
        return;
     } else if (Group)
-       if (vsystem("cd %s && chgrp -R %s %s", cd_to, Group, arg))
+       if (vsystem("cd %s && /usr/bin/chgrp -R %s %s", cd_to, Group, arg))
            warnx("couldn't change group of '%s' to '%s'", arg, Group);
 }
 
index 096e76b..43a6a9c 100644 (file)
@@ -17,8 +17,8 @@
  *
  * This is the add module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/add/main.c,v 1.29.2.20 2002/10/08 05:35:46 bmah Exp $
- * $DragonFly: src/usr.sbin/pkg_install/add/Attic/main.c,v 1.6 2004/05/28 20:30:18 drhodus Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/add/main.c,v 1.59 2004/07/28 07:19:15 kan Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/add/Attic/main.c,v 1.7 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include <err.h>
 #include "lib.h"
 #include "add.h"
 
-static char Options[] = "hvIRfnrp:SMt:";
+static char Options[] = "hvIRfnrp:SMt:C:";
 
 char   *Prefix         = NULL;
+char   *Chroot         = NULL;
 Boolean        NoInstall       = FALSE;
 Boolean        NoRecord        = FALSE;
 Boolean Remote         = FALSE;
@@ -38,6 +39,7 @@ char  *Mode           = NULL;
 char   *Owner          = NULL;
 char   *Group          = NULL;
 char   *PkgName        = NULL;
+char   *PkgAddCmd      = NULL;
 char   *Directory      = NULL;
 char   FirstPen[FILENAME_MAX];
 add_mode_t AddMode     = NORMAL;
@@ -51,7 +53,6 @@ struct {
        int hiver;      /* Highest version number to match */
        const char *directory;  /* Directory it lives in */
 } releases[] = {
-       { 0, 9999999, "/packages-4-stable" },
        { 410000, 410000, "/packages-4.1-release" },
        { 420000, 420000, "/packages-4.2-release" },
        { 430000, 430000, "/packages-4.3-release" },
@@ -60,9 +61,18 @@ struct {
        { 460000, 460001, "/packages-4.6-release" },
        { 460002, 460099, "/packages-4.6.2-release" },
        { 470000, 470099, "/packages-4.7-release" },
+       { 480000, 480099, "/packages-4.8-release" },
+       { 490000, 490099, "/packages-4.9-release" },
+       { 491000, 491099, "/packages-4.10-release" },
+       { 492000, 492099, "/packages-4.11-release" },
+       { 500000, 500099, "/packages-5.0-release" },
+       { 501000, 501099, "/packages-5.1-release" },
+       { 502000, 502009, "/packages-5.2-release" },
+       { 502010, 502099, "/packages-5.2.1-release" },
+       { 503000, 503099, "/packages-5.3-release" },
        { 300000, 399000, "/packages-3-stable" },
        { 400000, 499000, "/packages-4-stable" },
-       { 510000, 599000, "/packages-5-stable" },
+       { 502100, 599000, "/packages-5-current" },
        { 0, 9999999, "/packages-current" },
        { 0, 0, NULL }
 };
@@ -79,6 +89,12 @@ main(int argc, char **argv)
     char **start;
     char *cp, *packagesite = NULL, *remotepkg = NULL, *ptr;
     static char temppackageroot[MAXPATHLEN];
+    static char pkgaddpath[MAXPATHLEN];
+
+    if (*argv[0] != '/' && strchr(argv[0], '/') != NULL)
+       PkgAddCmd = realpath(argv[0], pkgaddpath);
+    else
+       PkgAddCmd = argv[0];
 
     start = argv;
     while ((ch = getopt(argc, argv, Options)) != -1) {
@@ -125,6 +141,10 @@ main(int argc, char **argv)
            AddMode = MASTER;
            break;
 
+       case 'C':
+           Chroot = optarg;
+           break;
+
        case 'h':
        case '?':
        default:
@@ -157,12 +177,17 @@ main(int argc, char **argv)
                if (!((ptr = strrchr(remotepkg, '.')) && ptr[1] == 't' && 
                        (ptr[2] == 'b' || ptr[2] == 'g') && ptr[3] == 'z' &&
                        !ptr[4]))
-                   if (strlcat(remotepkg, ".tgz", sizeof(temppackageroot))
-                       >= sizeof(temppackageroot))
+                   if (strlcat(remotepkg,
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+                       ".tbz",
+#else
+                       ".tgz",
+#endif
+                       sizeof(temppackageroot)) >= sizeof(temppackageroot))
                        errx(1, "package name too long");
            }
            if (!strcmp(*argv, "-"))    /* stdin? */
-               (const char *)pkgs[ch] = "-";
+               pkgs[ch] = (char *)"-";
            else if (isURL(*argv)) {    /* preserve URLs */
                if (strlcpy(pkgnames[ch], *argv, sizeof(pkgnames[ch]))
                    >= sizeof(pkgnames[ch]))
@@ -205,6 +230,11 @@ main(int argc, char **argv)
        warnx("only one package name may be specified with master mode");
        usage();
     }
+    /* Perform chroot if requested */
+    if (Chroot != NULL) {
+       if (chroot(Chroot))
+           errx(1, "chroot to %s failed", Chroot);
+    }
     /* Make sure the sub-execs we invoke get found */
     setenv("PATH", 
           "/sbin:/usr/sbin:/bin:/usr/bin:/usr/X11R6/bin",
@@ -249,10 +279,12 @@ getpackagesite(void)
     if (strlcat(sitepath, "/packages", sizeof(sitepath))
        >= sizeof(sitepath))
        return NULL;
-/*
+
+#if 0
     uname(&u);
     if (strlcat(sitepath, u.machine, sizeof(sitepath)) >= sizeof(sitepath))
        return NULL;
+#endif
 
     reldate = getosreldate();
     for(i = 0; releases[i].directory != NULL; i++) {
@@ -263,7 +295,6 @@ getpackagesite(void)
            break;
        }
     }
-*/
 
     if (strlcat(sitepath, "/Latest/", sizeof(sitepath)) >= sizeof(sitepath))
        return NULL;
@@ -276,7 +307,7 @@ static void
 usage()
 {
     fprintf(stderr, "%s\n%s\n",
-               "usage: pkg_add [-vInrfRMS] [-t template] [-p prefix]",
-               "               pkg-name [pkg-name ...]");
+       "usage: pkg_add [-vInrfRMS] [-t template] [-p prefix] [-C chrootdir]",
+       "               pkg-name [pkg-name ...]");
     exit(1);
 }
index ee7d066..83d107a 100644 (file)
@@ -16,8 +16,8 @@
  *
  * This is the main body of the add module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/add/perform.c,v 1.57.2.15 2002/09/25 23:22:13 bmah Exp $
- * $DragonFly: src/usr.sbin/pkg_install/add/Attic/perform.c,v 1.3 2003/11/19 15:17:29 hmp Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/add/perform.c,v 1.77 2004/07/28 16:03:13 stefanf Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/add/Attic/perform.c,v 1.4 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include <err.h>
@@ -136,7 +136,7 @@ pkg_do(char *pkg)
            }
            Home = make_playpen(playpen, sb.st_size * 4);
            if (!Home)
-               errx(1, "unable to make playpen for %qd bytes", (long long)sb.st_size * 4);
+               errx(1, "unable to make playpen for %lld bytes", (long long)sb.st_size * 4);
            where_to = Home;
            /* Since we can call ourselves recursively, keep notes on where we came from */
            if (!getenv("_TOP"))
@@ -166,7 +166,7 @@ pkg_do(char *pkg)
                    if (!isdir(p->name) && !Fake) {
                        if (Verbose)
                            printf("Desired prefix of %s does not exist, creating..\n", p->name);
-                       vsystem("mkdir -p %s", p->name);
+                       vsystem("/bin/mkdir -p %s", p->name);
                        if (chdir(p->name) == -1) {
                            warn("unable to change directory to '%s'", p->name);
                            goto bomb;
@@ -190,7 +190,7 @@ pkg_do(char *pkg)
             */
 
            if (!extract && !inPlace && min_free(playpen) < sb.st_size * 4) {
-               warnx("projected size of %qd exceeds available free space.\n"
+               warnx("projected size of %lld exceeds available free space.\n"
 "Please set your PKG_TMPDIR variable to point to a location with more\n"
                       "free space and try again", (long long)sb.st_size * 4);
                warnx("not extracting %s\ninto %s, sorry!",
@@ -242,7 +242,7 @@ pkg_do(char *pkg)
      * See if we're already registered either with the same name (the same
      * version) or some other version with the same origin.
      */
-    if ((isinstalledpkg(Plist.name) ||
+    if ((isinstalledpkg(Plist.name) > 0 ||
          matchbyorigin(Plist.origin, NULL) != NULL) && !Force) {
        warnx("package '%s' or its older version already installed",
              Plist.name);
@@ -253,19 +253,18 @@ pkg_do(char *pkg)
     /* Now check the packing list for conflicts */
     for (p = Plist.head; p != NULL; p = p->next) {
        if (p->type == PLIST_CONFLICTS) {
+           int i;
            conflict[0] = strdup(p->name);
            conflict[1] = NULL;
            matched = matchinstalled(MATCH_GLOB, conflict, &errcode);
            free(conflict[0]);
-           if (errcode == 0 && matched != NULL) {
-               int i;
+           if (errcode == 0 && matched != NULL)
                for (i = 0; matched[i] != NULL; i++)
-                   if (isinstalledpkg(matched[i])) {
+                   if (isinstalledpkg(matched[i]) > 0) {
                        warnx("package '%s' conflicts with %s", Plist.name,
                                matched[i]);
                        conflictsfound = 1;
                    }
-           }
 
            continue;
        }
@@ -292,7 +291,7 @@ pkg_do(char *pkg)
                printf(" with '%s' origin", deporigin);
            printf(".\n");
        }
-       if (!isinstalledpkg(p->name) &&
+       if (isinstalledpkg(p->name) <= 0 &&
            !(deporigin != NULL && matchbyorigin(deporigin, NULL) != NULL)) {
            char path[FILENAME_MAX], *cp = NULL;
 
@@ -302,7 +301,11 @@ pkg_do(char *pkg)
 
                    ext = strrchr(pkg_fullname, '.');
                    if (ext == NULL)
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+                       ext = ".tbz";
+#else
                        ext = ".tgz";
+#endif
                    snprintf(path, FILENAME_MAX, "%s/%s%s", getenv("_TOP"), p->name, ext);
                    if (fexists(path))
                        cp = path;
@@ -311,7 +314,7 @@ pkg_do(char *pkg)
                    if (cp) {
                        if (Verbose)
                            printf("Loading it from %s.\n", cp);
-                       if (vsystem("pkg_add %s'%s'", Verbose ? "-v " : "", cp)) {
+                       if (vsystem("%s %s'%s'", PkgAddCmd, Verbose ? "-v " : "", cp)) {
                            warnx("autoload of dependency '%s' failed%s",
                                cp, Force ? " (proceeding anyway)" : "!");
                            if (!Force)
@@ -334,7 +337,7 @@ pkg_do(char *pkg)
                        if (!Force)
                            ++code;
                    }
-                   else if (vsystem("(pwd; cat +CONTENTS) | pkg_add %s-S", Verbose ? "-v " : "")) {
+                   else if (vsystem("(pwd; /bin/cat +CONTENTS) | %s %s-S", PkgAddCmd, Verbose ? "-v " : "")) {
                        warnx("pkg_add of dependency '%s' failed%s",
                                p->name, Force ? " (proceeding anyway)" : "!");
                        if (!Force)
@@ -365,7 +368,7 @@ pkg_do(char *pkg)
 
     /* Look for the requirements file */
     if (fexists(REQUIRE_FNAME)) {
-       vsystem("chmod +x %s", REQUIRE_FNAME);  /* be sure */
+       vsystem("/bin/chmod +x %s", REQUIRE_FNAME);     /* be sure */
        if (Verbose)
            printf("Running requirements file first for %s..\n", Plist.name);
        if (!Fake && vsystem("./%s %s INSTALL", REQUIRE_FNAME, Plist.name)) {
@@ -398,7 +401,7 @@ pkg_do(char *pkg)
 
     /* If we're really installing, and have an installation file, run it */
     if (!NoInstall && fexists(pre_script)) {
-       vsystem("chmod +x %s", pre_script);     /* make sure */
+       vsystem("/bin/chmod +x %s", pre_script);        /* make sure */
        if (Verbose)
            printf("Running pre-install for %s..\n", Plist.name);
        if (!Fake && vsystem("./%s %s %s", pre_script, Plist.name, pre_arg)) {
@@ -427,7 +430,7 @@ pkg_do(char *pkg)
 
     /* Run the installation script one last time? */
     if (!NoInstall && fexists(post_script)) {
-       vsystem("chmod +x %s", post_script);    /* make sure */
+       vsystem("/bin/chmod +x %s", post_script);       /* make sure */
        if (Verbose)
            printf("Running post-install for %s..\n", Plist.name);
        if (!Fake && vsystem("./%s %s %s", post_script, Plist.name, post_arg)) {
@@ -457,7 +460,7 @@ pkg_do(char *pkg)
            goto success;       /* close enough for government work */
        }
        /* Make sure pkg_info can read the entry */
-       vsystem("chmod a+rx %s", LogDir);
+       vsystem("/bin/chmod a+rx %s", LogDir);
        move_file(".", DESC_FNAME, LogDir);
        move_file(".", COMMENT_FNAME, LogDir);
        if (fexists(INSTALL_FNAME))
index 82559bd..b94f931 100644 (file)
 .\"
 .\" Jordan K. Hubbard
 .\"
+.\" $FreeBSD: src/usr.sbin/pkg_install/add/pkg_add.1,v 1.64 2004/07/03 18:35:52 ru Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/add/Attic/pkg_add.1,v 1.4 2004/07/30 04:46:12 dillon Exp $
 .\"
-.\"     @(#)pkg_add.1
-.\" $FreeBSD: src/usr.sbin/pkg_install/add/pkg_add.1,v 1.35.2.14 2002/12/29 16:35:43 schweikh Exp $
-.\" $DragonFly: src/usr.sbin/pkg_install/add/Attic/pkg_add.1,v 1.3 2003/11/19 15:17:29 hmp Exp $
-.\"
-.Dd November 25, 1994
+.Dd March 1, 2004
 .Dt PKG_ADD 1
 .Os
 .Sh NAME
@@ -29,6 +27,7 @@
 .Op Fl vInfrRMS
 .Op Fl t Ar template
 .Op Fl p Ar prefix
+.Op Fl C Ar chrootdir
 .Ar pkg-name Op Ar pkg-name ...
 .Sh DESCRIPTION
 The
@@ -48,10 +47,12 @@ or other subtle
 attacks from miscreants who create dangerous package files.
 .Pp
 You are advised to verify the competence and identity of those who
-provide installable package files.  For extra protection, use the
+provide installable package files.
+For extra protection, use the
 .Fl M
 flag to extract the package file, and inspect its contents and scripts to
-ensure it poses no danger to your system's integrity.  Pay particular
+ensure it poses no danger to your system's integrity.
+Pay particular
 attention to any +INSTALL, +POST-INSTALL, +DEINSTALL, +POST-DEINSTALL,
 +REQUIRE or +MTREE_DIRS files, and inspect the +CONTENTS file for
 .Cm @cwd ,
@@ -69,7 +70,10 @@ command to examine the package file.
 The following command line arguments are supported:
 .Bl -tag -width indent
 .It Ar pkg-name Op Ar pkg-name ...
-The named packages are installed.  A package name of - will cause
+The named packages are installed.
+A package name of
+.Fl
+will cause
 .Nm
 to read from stdin.
 If the packages are not found in the current
@@ -80,13 +84,14 @@ will search them in each directory named by
 .It Fl v
 Turn on verbose output.
 .It Fl I
-If a installation scripts (pre-install or post-install) exist for a given
+If an installation scripts (pre-install or post-install) exist for a given
 package, do not execute them.
 .It Fl n
 Don't actually install a package, just report the steps that
 would be taken if it was.
 .It Fl R
-Do not record the installation of a package.  This means
+Do not record the installation of a package.
+This means
 that you cannot deinstall it later, so only use this option if
 you know what you are doing!
 .It Fl r
@@ -95,7 +100,8 @@ This will determine the appropriate
 objformat and release and then fetch and install the package.
 .It Fl f
 Force installation to proceed even if prerequisite packages are not
-installed or the requirements script fails.  Although
+installed or the requirements script fails.
+Although
 .Nm
 will still try to find and auto-install missing prerequisite packages,
 a failure to find one will not be fatal.
@@ -104,12 +110,14 @@ Set
 .Ar prefix
 as the directory in which to extract files from a package.
 If a package has set its default directory, it will be overridden
-by this flag.  Note that only the first
+by this flag.
+Note that only the first
 .Cm @cwd
 directive will be replaced, since
 .Nm
 has no way of knowing which directory settings are relative and
-which are absolute.  It is rare in any case to see more than one
+which are absolute.
+It is rare in any case to see more than one
 directory transition made, but when such does happen and you wish
 to have control over *all* directory transitions, then you
 may then wish to look into the use of
@@ -133,7 +141,8 @@ By default, this is the string
 but it may be necessary to override it in the situation where
 space in your
 .Pa /var/tmp
-directory is limited.  Be sure to leave some number of `X' characters
+directory is limited.
+Be sure to leave some number of `X' characters
 for
 .Xr mktemp 3
 to fill in with a unique ID.
@@ -146,11 +155,13 @@ file installation; often this is
 .It Fl M
 Run in
 .Cm MASTER
-mode.  This is a very specialized mode for running
+mode.
+This is a very specialized mode for running
 .Nm
 and is meant to be run in conjunction with
 .Cm SLAVE
-mode.  When run in this mode,
+mode.
+When run in this mode,
 .Nm
 does no work beyond extracting the package into a temporary staging
 area (see the
@@ -166,29 +177,58 @@ before acting on its contents.
 .It Fl S
 Run in
 .Cm SLAVE
-mode.  This is a very specialized mode for running
+mode.
+This is a very specialized mode for running
 .Nm
 and is meant to be run in conjunction with
 .Cm MASTER
-mode.  When run in this mode,
+mode.
+When run in this mode,
 .Nm
 expects the release contents to be already extracted and waiting
 in the staging area, the location of which is read as a string
-from stdin.  The complete packing list is also read from stdin,
+from stdin.
+The complete packing list is also read from stdin,
 and the contents then acted on as normal.
+.It Fl C Ar chrootdir
+Before doing any operations,
+.Xr chroot 2
+to the
+.Ar chrootdir
+directory so that all package files, and the package database, are
+installed to
+.Ar chrootdir .
+Note that
+.Ar chrootdir
+needs to be a fairly complete file system, including everything normally
+needed by
+.Nm
+to run.
+This flag was added to help support operations done by
+.Xr sysinstall 8
+and is not expected to be useful for much else.
+Be careful that
+.Ar chrootdir
+is properly configured and cannot be modified by normal users,
+versions of commands like
+.Xr fetch 1
+may be run inside
+.Ar chrootdir
+as a side effect.
 .El
 .Pp
 One or more
 .Ar pkg-name
 arguments may be specified, each being either a file containing the
 package (these usually end with a
-.Dq .tgz
+.Dq .tbz
 suffix) or a
-URL pointing at a file available on an ftp site.  Thus you may
+URL pointing at a file available on an ftp site.
+Thus you may
 extract files directly from their anonymous ftp locations (e.g.\&
 .Nm
-.Li ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1.14.7.tgz ) .
-Note:  If you wish to use
+.Li ftp://ftp.FreeBSD.org/pub/FreeBSD/ports/packages/shells/bash-1.14.7.tbz ) .
+Note: If you wish to use
 .Bf -emphasis
 passive mode
 .Ef
@@ -197,8 +237,10 @@ the variable
 .Bf -emphasis
 FTP_PASSIVE_MODE
 .Ef
-to some value in your environment.  Otherwise, the more standard
-ACTIVE mode may be used.  If
+to some value in your environment.
+Otherwise, the more standard
+ACTIVE mode may be used.
+If
 .Nm
 consistently fails to fetch a package from a site known to work,
 it may be because you have a firewall that demands the usage of
@@ -209,8 +251,8 @@ ftp.
 .Sh TECHNICAL DETAILS
 The
 .Nm
-utility extracts each package's "packing list" into a special staging 
-directory in /tmp (or $PKG_TMPDIR if set), parses it, and then runs 
+utility extracts each package's "packing list" into a special staging
+directory in /tmp (or $PKG_TMPDIR if set), parses it, and then runs
 through the following sequence to fully extract the contents of the package:
 .Bl -enum
 .It
@@ -380,7 +422,8 @@ All the scripts are called with the environment variable
 .Ev PKG_PREFIX
 set to the installation prefix (see the
 .Fl p
-option above).  This allows a package author to write a script
+option above).
+This allows a package author to write a script
 that reliably performs some action on the directory where the package
 is installed, even if the user might change it with the
 .Fl p
@@ -389,8 +432,10 @@ flag to
 .Sh ENVIRONMENT
 The value of the
 .Ev PKG_PATH
-is used if a given package can't be found.  The environment variable
-should be a series of entries separated by colons.  Each entry
+is used if a given package can't be found.
+The environment variable
+should be a series of entries separated by colons.
+Each entry
 consists of a directory name.
 The current directory may be indicated
 implicitly by an empty directory name, or explicitly by a single
@@ -470,7 +515,6 @@ Default location of the installed package database.
 .Xr pkg_create 1 ,
 .Xr pkg_delete 1 ,
 .Xr pkg_info 1 ,
-.Xr pkg_update 1 ,
 .Xr pkg_version 1 ,
 .Xr mktemp 3 ,
 .Xr sysconf 3 ,
index 4d21d79..0bd4015 100644 (file)
@@ -1,20 +1,15 @@
-# $FreeBSD: src/usr.sbin/pkg_install/create/Makefile,v 1.11.2.3 2003/01/09 12:05:53 des Exp $
-# $DragonFly: src/usr.sbin/pkg_install/create/Attic/Makefile,v 1.3 2003/08/03 16:45:16 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/create/Makefile,v 1.21 2004/07/28 07:19:15 kan Exp $
+# $DragonFly: src/usr.sbin/pkg_install/create/Attic/Makefile,v 1.4 2004/07/30 04:46:12 dillon Exp $
 
-PROG= pkg_create
+PROG=  pkg_create
+SRCS=  main.c perform.c pl.c
 
-CFLAGS+=       ${DEBUG} -I${.CURDIR}/../lib
+CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
 
-WARNS?=        2
+WARNS?=        3
+WFORMAT?=      1
 
-DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD}
-LDADD= ${LIBINSTALL} -lfetch -lmd
-
-.if !defined(NOCRYPT) && !defined(NO_OPENSSL)
-DPADD+=        ${LIBSSL} ${LIBCRYPTO}
-LDADD+=        -lssl -lcrypto
-.endif
-
-SRCS= main.c perform.c pl.c
+DPADD= ${LIBINSTALL} ${LIBMD}
+LDADD= ${LIBINSTALL} -lmd
 
 .include <bsd.prog.mk>
index 5258c56..771c9f1 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/create/create.h,v 1.15.2.5 2002/05/29 18:31:11 obrien Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/create/Attic/create.h,v 1.2 2003/06/17 04:29:59 dillon Exp $ */
-
 /*
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
@@ -19,6 +16,8 @@
  *
  * Include and define various things wanted by the create command.
  *
+ * $FreeBSD: src/usr.sbin/pkg_install/create/create.h,v 1.24 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/create/Attic/create.h,v 1.3 2004/07/30 04:46:12 dillon Exp $
  */
 
 #ifndef _INST_CREATE_H_INCLUDE
@@ -35,9 +34,11 @@ extern char  *PostDeInstall;
 extern char    *Contents;
 extern char    *Require;
 extern char    *SrcDir;
+extern char    *BaseDir;
 extern char    *ExcludeFrom;
 extern char    *Mtree;
 extern char    *Pkgdeps;
+extern char    *Conflicts;
 extern char    *Origin;
 extern char    *InstalledPkg;
 extern char    PlayPen[];
@@ -47,8 +48,8 @@ extern int    PlistOnly;
 enum zipper {NONE, GZIP, BZIP, BZIP2 };
 extern enum zipper     Zipper;
 
+void           add_cksum(Package *, PackingList, const char *);
 void           check_list(const char *, Package *);
-int            pkg_perform(char **);
 void           copy_plist(const char *, Package *);
 
 #endif /* _INST_CREATE_H_INCLUDE */
index 8fc93b8..0dc22fd 100644 (file)
@@ -7,20 +7,21 @@
  *
  * This is the create module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/create/main.c,v 1.21.2.7 2002/05/29 18:31:11 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/create/Attic/main.c,v 1.3 2003/11/03 19:31:39 eirikn Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/create/main.c,v 1.35 2004/06/29 18:56:59 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/create/Attic/main.c,v 1.4 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include <err.h>
 #include "lib.h"
 #include "create.h"
 
-static char Options[] = "YNOhjvyzf:p:P:c:d:i:I:k:K:r:t:X:D:m:s:o:b:";
+static char Options[] = "YNOhjvyzf:p:P:C:c:d:i:I:k:K:r:t:X:D:m:s:S:o:b:";
 
 char   *Prefix         = NULL;
 char   *Comment        = NULL;
 char   *Desc           = NULL;
 char   *SrcDir         = NULL;
+char   *BaseDir        = NULL;
 char   *Display        = NULL;
 char   *Install        = NULL;
 char   *PostInstall    = NULL;
@@ -31,6 +32,7 @@ char  *Require        = NULL;
 char   *ExcludeFrom    = NULL;
 char   *Mtree          = NULL;
 char   *Pkgdeps        = NULL;
+char   *Conflicts      = NULL;
 char   *Origin         = NULL;
 char   *InstalledPkg   = NULL;
 char   PlayPen[FILENAME_MAX];
@@ -73,10 +75,18 @@ main(int argc, char **argv)
            SrcDir = optarg;
            break;
 
+       case 'S':
+           BaseDir = optarg;
+           break;
+
        case 'f':
            Contents = optarg;
            break;
 
+       case 'C':
+           Conflicts = optarg;
+           break;
+
        case 'c':
            Comment = optarg;
            break;
@@ -193,12 +203,13 @@ main(int argc, char **argv)
 static void
 usage()
 {
-    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n",
-"usage: pkg_create [-YNOhvy] [-P pkgs] [-p prefix] [-f contents] [-i iscript]",
-"                  [-I piscript] [-k dscript] [-K pdscript] [-r rscript] ",
-"                  [-t template] [-X excludefile] [-D displayfile] ",
-"                  [-m mtreefile] [-o origin] -c comment -d description ",
-"                  -f packlist pkg-filename",
-"       pkg_create [-YNhvy] -b pkg-name [pkg-filename]");
+    fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n%s\n%s\n",
+"usage: pkg_create [-YNOhvyz] [-P pkgs] [-C conflicts] [-p prefix] ",
+"                  [-i iscript] [-I piscript] [-k dscript] [-K pdscript] ",
+"                  [-r rscript] [-t template] [-X excludefile] ",
+"                  [-D displayfile] [-m mtreefile] [-o origin] ",
+"                  [-s srcdir] [-S basedir] ",
+"                  -c comment -d description -f packlist pkg-filename",
+"       pkg_create [-YNhvyz] -b pkg-name [pkg-filename]");
     exit(1);
 }
index 4c0d097..d389532 100644 (file)
@@ -16,8 +16,8 @@
  *
  * This is the main body of the create module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/create/perform.c,v 1.49.2.18 2002/08/31 19:25:54 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/create/Attic/perform.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/create/perform.c,v 1.79 2004/07/28 07:19:15 kan Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/create/Attic/perform.c,v 1.3 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include "lib.h"
@@ -144,6 +144,22 @@ pkg_perform(char **pkgs)
            printf(".\n");
     }
 
+    /* Put the conflicts directly after the dependencies, if any */
+    if (Conflicts) {
+       if (Verbose && !PlistOnly)
+           printf("Registering conflicts:");
+       while (Conflicts) {
+          cp = strsep(&Conflicts, " \t\n");
+          if (*cp) {
+               add_plist(&plist, PLIST_CONFLICTS, cp);
+               if (Verbose && !PlistOnly)
+                   printf(" %s", cp);
+          }
+       }
+       if (Verbose && !PlistOnly)
+           printf(".\n");
+    }
+
     /* If a SrcDir override is set, add it now */
     if (SrcDir) {
        if (Verbose && !PlistOnly)
@@ -205,45 +221,54 @@ pkg_perform(char **pkgs)
     write_file(COMMENT_FNAME, Comment);
     add_plist(&plist, PLIST_IGNORE, NULL);
     add_plist(&plist, PLIST_FILE, COMMENT_FNAME);
+    add_cksum(&plist, plist.tail, COMMENT_FNAME);
     write_file(DESC_FNAME, Desc);
     add_plist(&plist, PLIST_IGNORE, NULL);
     add_plist(&plist, PLIST_FILE, DESC_FNAME);
+    add_cksum(&plist, plist.tail, DESC_FNAME);
 
     if (Install) {
        copy_file(home, Install, INSTALL_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, INSTALL_FNAME);
+       add_cksum(&plist, plist.tail, INSTALL_FNAME);
     }
     if (PostInstall) {
        copy_file(home, PostInstall, POST_INSTALL_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, POST_INSTALL_FNAME);
+       add_cksum(&plist, plist.tail, POST_INSTALL_FNAME);
     }
     if (DeInstall) {
        copy_file(home, DeInstall, DEINSTALL_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, DEINSTALL_FNAME);
+       add_cksum(&plist, plist.tail, DEINSTALL_FNAME);
     }
     if (PostDeInstall) {
        copy_file(home, PostDeInstall, POST_DEINSTALL_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, POST_DEINSTALL_FNAME);
+       add_cksum(&plist, plist.tail, POST_DEINSTALL_FNAME);
     }
     if (Require) {
        copy_file(home, Require, REQUIRE_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, REQUIRE_FNAME);
+       add_cksum(&plist, plist.tail, REQUIRE_FNAME);
     }
     if (Display) {
        copy_file(home, Display, DISPLAY_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, DISPLAY_FNAME);
+       add_cksum(&plist, plist.tail, DISPLAY_FNAME);
        add_plist(&plist, PLIST_DISPLAY, DISPLAY_FNAME);
     }
     if (Mtree) {
        copy_file(home, Mtree, MTREE_FNAME);
        add_plist(&plist, PLIST_IGNORE, NULL);
        add_plist(&plist, PLIST_FILE, MTREE_FNAME);
+       add_cksum(&plist, plist.tail, MTREE_FNAME);
        add_plist(&plist, PLIST_MTREE, MTREE_FNAME);
     }
 
@@ -367,6 +392,8 @@ make_dist(const char *homedir, const char *pkg, const char *suff, Package *plist
     for (p = plist->head; p; p = p->next) {
        if (p->type == PLIST_FILE)
            fprintf(totar, "%s\n", p->name);
+       else if (p->type == PLIST_CWD && BaseDir && p->name && p->name[0] == '/')
+           fprintf(totar, "-C\n%s%s\n", BaseDir, p->name);
        else if (p->type == PLIST_CWD || p->type == PLIST_SRC)
            fprintf(totar, "-C\n%s\n", p->name);
        else if (p->type == PLIST_IGNORE)
@@ -444,13 +471,15 @@ create_from_installed(const char *pkg, const char *suf)
     read_plist(&plist, fp);
     fclose(fp);
 
-    (const char *)Install = isfile(INSTALL_FNAME) ? INSTALL_FNAME : NULL;
-    (const char *)PostInstall = isfile(POST_INSTALL_FNAME) ? POST_INSTALL_FNAME : NULL;
-    (const char *)DeInstall = isfile(DEINSTALL_FNAME) ? DEINSTALL_FNAME : NULL;
-    (const char *)PostDeInstall = isfile(POST_DEINSTALL_FNAME) ? POST_DEINSTALL_FNAME : NULL;
-    (const char *)Require = isfile(REQUIRE_FNAME) ? REQUIRE_FNAME : NULL;
-    (const char *)Display = isfile(DISPLAY_FNAME) ? DISPLAY_FNAME : NULL;
-    (const char *)Mtree = isfile(MTREE_FNAME) ?  MTREE_FNAME : NULL;
+    Install = isfile(INSTALL_FNAME) ? (char *)INSTALL_FNAME : NULL;
+    PostInstall = isfile(POST_INSTALL_FNAME) ?
+       (char *)POST_INSTALL_FNAME : NULL;
+    DeInstall = isfile(DEINSTALL_FNAME) ? (char *)DEINSTALL_FNAME : NULL;
+    PostDeInstall = isfile(POST_DEINSTALL_FNAME) ?
+       (char *)POST_DEINSTALL_FNAME : NULL;
+    Require = isfile(REQUIRE_FNAME) ? (char *)REQUIRE_FNAME : NULL;
+    Display = isfile(DISPLAY_FNAME) ? (char *)DISPLAY_FNAME : NULL;
+    Mtree = isfile(MTREE_FNAME) ?  (char *)MTREE_FNAME : NULL;
 
     make_dist(homedir, pkg, suf, &plist);
 
index def6fad..993a8b8 100644 (file)
@@ -15,8 +15,8 @@
 .\"
 .\"
 .\"     @(#)pkg_create.1
-.\" $FreeBSD: src/usr.sbin/pkg_install/create/pkg_create.1,v 1.35.2.16 2002/12/29 16:35:43 schweikh Exp $
-.\" $DragonFly: src/usr.sbin/pkg_install/create/Attic/pkg_create.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
+.\" $FreeBSD: src/usr.sbin/pkg_install/create/pkg_create.1,v 1.61 2004/07/02 23:12:52 ru Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/create/Attic/pkg_create.1,v 1.3 2004/07/30 04:46:12 dillon Exp $
 .\"
 .\" hacked up by John Kohl for NetBSD--fixed a few bugs, extended keywords,
 .\" added dependency tracking, etc.
@@ -24,7 +24,7 @@
 .\" [jkh] Took John's changes back and made some additional extensions for
 .\" better integration with FreeBSD's new ports collection.
 .\"
-.Dd April 21, 1995
+.Dd June 29, 2004
 .Dt PKG_CREATE 1
 .Os
 .Sh NAME
 .Sh SYNOPSIS
 .Nm
 .Op Fl YNOhjvyz
+.Op Fl C Ar conflicts
 .Op Fl P Ar pkgs
 .Op Fl p Ar prefix
-.Op Fl f Ar contents
 .Op Fl i Ar iscript
 .Op Fl I Ar piscript
 .Op Fl k Ar dscript
 .Op Fl K Ar pdscript
 .Op Fl r Ar rscript
 .Op Fl s Ar srcdir
+.Op Fl S Ar basedir
 .Op Fl t Ar template
 .Op Fl X Ar excludefile
 .Op Fl D Ar displayfile
 The
 .Nm
 command is used to create packages that will subsequently be fed to
-one of the package extraction/info utilities.  The input description
+one of the package extraction/info utilities.
+The input description
 and command line arguments for the creation of a package are not
 really meant to be human-generated, though it is easy enough to
-do so.  It is more expected that you will use a front-end tool for
-the job rather than muddling through it yourself.  Nonetheless, a short
+do so.
+It is more expected that you will use a front-end tool for
+the job rather than muddling through it yourself.
+Nonetheless, a short
 description of the input syntax is included in this document.
 .Sh OPTIONS
 The following command line options are supported:
@@ -89,7 +93,8 @@ from file
 .Ar desc
 or, if preceded by
 .Cm - ,
-the argument itself.  This string should also
+the argument itself.
+This string should also
 give some idea of which version of the product (if any) the package
 represents.
 .It Fl d Xo
@@ -105,7 +110,8 @@ Assume a default answer of `Yes' for any questions asked.
 .It Fl N
 Assume a default answer of `No' for any questions asked.
 .It Fl O
-Go into a `packing list Only' mode.  This is a custom hack for the
+Go into a `packing list Only' mode.
+This is a custom hack for the
 .Fx
 .Em "Ports Collection"
 and is used to do `fake pkg_add' operations when a port is installed.
@@ -119,8 +125,10 @@ are dumped, rather than the links themselves.
 .It Fl i Ar iscript
 Set
 .Ar iscript
-to be the pre-install procedure for the package.  This can be any executable
-program (or shell script).  It will be invoked automatically when the
+to be the pre-install procedure for the package.
+This can be any executable
+program (or shell script).
+It will be invoked automatically when the
 package is later installed.
 It will be passed the package's name as the
 first argument.
@@ -134,15 +142,24 @@ functionality by passing the keywords
 .Ar PRE-INSTALL
 and
 .Ar POST-INSTALL
-respectively, along with the package's name.
+respectively, after the package's name.
 .It Fl I Ar piscript
 Set
 .Ar piscript
-to be the post-install procedure for the package.  This can be any
-executable program (or shell script).  It will be invoked automatically
+to be the post-install procedure for the package.
+This can be any
+executable program (or shell script).
+It will be invoked automatically
 when the package is later installed.
 It will be passed the package's name as
 the first argument.
+.It Fl C Ar conflicts
+Set the initial package conflict list to
+.Ar conflicts .
+This is assumed to be a whitespace separated list of package names
+and is meant as a convenient shorthand for specifying multiple
+.Cm @conflicts
+directives in the packing list (see PACKING LIST DETAILS section below).
 .It Fl P Ar pkgs
 Set the initial package dependency list to
 .Ar pkgs .
@@ -174,8 +191,10 @@ the package.
 .It Fl k Ar dscript
 Set
 .Ar dscript
-to be the de-install procedure for the package.  This can be any executable
-program (or shell script).  It will be invoked automatically when the
+to be the de-install procedure for the package.
+This can be any executable
+program (or shell script).
+It will be invoked automatically when the
 package is later (if ever) de-installed.
 It will be passed the package's
 name as the first argument.
@@ -193,8 +212,10 @@ respectively, along with the package's name.
 .It Fl K Ar pdscript
 Set
 .Ar pdscript
-to be the post-deinstall procedure for the package.  This can be any
-executable program (or shell script).  It will be invoked automatically when
+to be the post-deinstall procedure for the package.
+This can be any
+executable program (or shell script).
+It will be invoked automatically when
 the package is later de-installed.
 It will be passed the package's name as
 the first argument.
@@ -203,8 +224,10 @@ Set
 .Ar rscript
 to be the
 .Dq requirements
-procedure for the package.  This can be any
-executable program (or shell script).  It will be invoked automatically
+procedure for the package.
+This can be any
+executable program (or shell script).
+It will be invoked automatically
 at installation/deinstallation time to determine whether or not
 installation/deinstallation should proceed.
 To differentiate between installation and deinstallation, the keywords
@@ -217,6 +240,11 @@ are passed respectively, along with the package's name.
 will override the value of
 .Cm @cwd
 during package creation.
+.It Fl S Ar basedir
+.Ar basedir
+will be prefixed to all
+.Cm @cwd
+during package creation.
 .It Fl t Ar template
 Use
 .Ar template
@@ -227,7 +255,8 @@ By default, this is the string
 but it may be necessary to override it in the situation where
 space in your
 .Pa /tmp
-directory is limited.  Be sure to leave some number of `X' characters
+directory is limited.
+Be sure to leave some number of `X' characters
 for
 .Xr mktemp 3
 to fill in with a unique ID.
@@ -238,7 +267,8 @@ as a
 .Fl exclude-from
 argument to
 .Cm tar
-when creating final package.  See
+when creating final package.
+See
 .Cm tar
 man page (or run
 .Cm tar
@@ -247,7 +277,8 @@ with
 flag) for further information on using this flag.
 .It Fl D Ar displayfile
 Display the file (by concatenating it to stdout)
-after installing the package.  Useful for things like
+after installing the package.
+Useful for things like
 legal notices on almost-free software, etc.
 .It Fl m Ar mtreefile
 Run
@@ -313,12 +344,15 @@ format (see
 .Fl f )
 is fairly simple, being
 nothing more than a single column of filenames to include in the
-package.  However, since absolute pathnames are generally a bad idea
+package.
+However, since absolute pathnames are generally a bad idea
 for a package that could be installed potentially anywhere, there is
 another method of specifying where things are supposed to go
 and, optionally, what ownership and mode information they should be
-installed with.  This is done by embedding specialized command sequences
-in the packing list.  Briefly described, these sequences are:
+installed with.
+This is done by embedding specialized command sequences
+in the packing list.
+Briefly described, these sequences are:
 .Bl -tag -width indent -compact
 .It Cm @cwd Ar directory
 Set the internal directory pointer to point to
@@ -336,10 +370,12 @@ for package creation but not extraction.
 .It Cm @exec Ar command
 Execute
 .Ar command
-as part of the unpacking process.  If
+as part of the unpacking process.
+If
 .Ar command
 contains any of the following sequences somewhere in it, they will
-be expanded inline.  For the following examples, assume that
+be expanded inline.
+For the following examples, assume that
 .Cm @cwd
 is set to
 .Pa /usr/local
@@ -359,7 +395,8 @@ Expand to the
 .Dq basename
 of the fully qualified filename, that
 is the current directory prefix, plus the last filespec, minus
-the trailing filename.  In the example case, that would be
+the trailing filename.
+In the example case, that would be
 .Pa /usr/local/bin .
 .It Cm "%f"
 Expand to the
@@ -373,17 +410,20 @@ being in the example case,
 .It Cm @unexec Ar command
 Execute
 .Ar command
-as part of the deinstallation process.  Expansion of special
+as part of the deinstallation process.
+Expansion of special
 .Cm %
 sequences is the same as for
 .Cm @exec .
 This command is not executed during the package add, as
 .Cm @exec
-is, but rather when the package is deleted.  This is useful
+is, but rather when the package is deleted.
+This is useful
 for deleting links and other ancillary files that were created
 as a result of adding the package, but not directly known to
 the package's table of contents (and hence not automatically
-removable).  The advantage of using
+removable).
+The advantage of using
 .Cm @unexec
 over a deinstallation script is that you can use the
 .Dq special sequence expansion
@@ -396,7 +436,8 @@ Set default permission for all subsequently extracted files to
 Format is the same as that used by the
 .Cm chmod
 command (well, considering that it's later handed off to it, that's
-no surprise).  Use without an arg to set back to default (extraction)
+no surprise).
+Use without an arg to set back to default (extraction)
 permissions.
 .It Cm @option Ar option
 Set internal package options, the only two currently supported ones
@@ -421,7 +462,8 @@ Set default group ownership for all subsequently extracted files to
 Use without an arg to set back to default (extraction)
 group ownership.
 .It Cm @comment Ar string
-Imbed a comment in the packing list.  Useful in
+Imbed a comment in the packing list.
+Useful in
 trying to document some particularly hairy sequence that
 may trip someone up later.
 .It Cm @ignore
@@ -430,27 +472,34 @@ copy it anywhere), as it's used for some special purpose.
 .It Cm @ignore_inst
 Similar to
 .Cm @ignore ,
-but the ignoring of the next file is delayed one evaluation cycle.  This
+but the ignoring of the next file is delayed one evaluation cycle.
+This
 makes it possible to use this directive in the
 .Ar packinglist
 file, so you can pack a
 specialized datafile in with a distribution for your install script (or
 something) yet have the installer ignore it.
 .It Cm @name Ar name
-Set the name of the package.  This is mandatory and is usually
-put at the top.  This name is potentially different from the name of
+Set the name of the package.
+This is mandatory and is usually
+put at the top.
+This name is potentially different from the name of
 the file it came in, and is used when keeping track of the package
-for later deinstallation.  Note that
+for later deinstallation.
+Note that
 .Nm
 will derive this field from the package name and add it automatically
 if none is given.
 .It Cm @dirrm Ar name
 Declare directory
 .Pa name
-to be deleted at deinstall time.  By default, directories created by a
+to be deleted at deinstall time.
+By default, directories created by a
 package installation are not deleted when the package is deinstalled;
-this provides an explicit directory cleanup method.  This directive
-should appear at the end of the package list.  If more than one
+this provides an explicit directory cleanup method.
+This directive
+should appear at the end of the package list.
+If more than one
 .Cm @dirrm
 directives are used, the directories are removed in the order specified.
 The
@@ -463,7 +512,8 @@ as an
 .Xr mtree 8
 input file to be used at install time (see
 .Fl m
-above).  Only the first
+above).
+Only the first
 .Cm @mtree
 directive is honored.
 .It Cm @display Ar name
@@ -475,14 +525,21 @@ above).
 .It Cm @pkgdep Ar pkgname
 Declare a dependency on the
 .Ar pkgname
-package.  The
+package.
+The
 .Ar pkgname
 package must be installed before this package may be
 installed, and this package must be deinstalled before the
 .Ar pkgname
-package is deinstalled.  Multiple
+package is deinstalled.
+Multiple
 .Cm @pkgdep
 directives may be used if the package depends on multiple other packages.
+.It Cm @conflicts Ar pkgcflname
+Declare a conflict with the
+.Ar pkgcflname
+package, as the two packages contain references to the same files,
+and so cannot co-exist on the same system.
 .El
 .Sh ENVIRONMENT
 The environment variable
@@ -522,7 +579,6 @@ is unsuitable.
 .Xr pkg_add 1 ,
 .Xr pkg_delete 1 ,
 .Xr pkg_info 1 ,
-.Xr pkg_update 1 ,
 .Xr pkg_version 1 ,
 .Xr sysconf 3
 .Sh HISTORY
@@ -533,12 +589,14 @@ command first appeared in
 .Sh AUTHORS
 .An Jordan Hubbard
 .Sh CONTRIBUTORS
-.An John Kohl Aq jtk@rational.com
+.An John Kohl Aq jtk@rational.com ,
+.An Oliver Eikemeier Aq eik@FreeBSD.org
 .Sh BUGS
 Hard links between files in a distribution must be bracketed by
 .Cm @cwd
 directives in order to be preserved as hard links when the package is
-extracted.  They additionally must not end up being split between
+extracted.
+They additionally must not end up being split between
 .Cm tar
 invocations due to exec argument-space limitations (this depends on the
 value returned by
index 2303b19..53b7f56 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Routines for dealing with the packing list.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/create/pl.c,v 1.13.2.8 2002/08/31 19:31:02 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/create/Attic/pl.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/create/pl.c,v 1.27 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/create/Attic/pl.c,v 1.3 2004/07/30 04:46:12 dillon Exp $
  */
 
 #include "lib.h"
 #include <err.h>
 #include <md5.h>
 
+/* Add an MD5 checksum entry for a file or link */
+void
+add_cksum(Package *pkg, PackingList p, const char *fname)
+{
+    char *cp = NULL, buf[33];
+
+    if (issymlink(fname)) {
+       int len;
+       char lnk[FILENAME_MAX];
+
+       if ((len = readlink(fname, lnk, FILENAME_MAX)) > 0)
+           cp = MD5Data((unsigned char *)lnk, len, buf);
+    } else if (isfile(fname)) {
+       /* Don't record MD5 checksum for device nodes and such */
+       cp = MD5File(fname, buf);
+    }
+
+    if (cp != NULL) {
+       PackingList tmp = new_plist_entry();
+
+       tmp->name = copy_string(strconcat("MD5:", cp));
+       tmp->type = PLIST_COMMENT;
+       tmp->next = p->next;
+       tmp->prev = p;
+       p->next = tmp;
+       if (pkg->tail == p)
+           pkg->tail = tmp;
+    }
+}
+
 /* Check a list for files that require preconversion */
 void
 check_list(const char *home, Package *pkg)
 {
     const char *where = home;
     const char *there = NULL;
-    char *cp, name[FILENAME_MAX], buf[33];
+    char name[FILENAME_MAX];
     PackingList p;
 
     for (p = pkg->head; p != NULL; p = p->next)
@@ -50,31 +80,13 @@ check_list(const char *home, Package *pkg)
            break;
 
        case PLIST_FILE:
-           cp = NULL;
-           sprintf(name, "%s/%s", there ? there : where, p->name);
-           if (issymlink(name)) {
-               int len;
-               char lnk[FILENAME_MAX];
-
-               if ((len = readlink(name, lnk, FILENAME_MAX)) > 0)
-                   cp = MD5Data((unsigned char *)lnk, len, buf);
-           } else if (isfile(name)) {
-               /* Don't record MD5 checksum for device nodes and such */
-               cp = MD5File(name, buf);
-           }
+           if (there)
+               snprintf(name, sizeof(name), "%s/%s", there, p->name);
+           else
+               snprintf(name, sizeof(name), "%s%s/%s",
+                   BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
 
-           if (cp != NULL) {
-               PackingList tmp = new_plist_entry();
-
-               tmp->name = copy_string(strconcat("MD5:", cp));
-               tmp->type = PLIST_COMMENT;
-               tmp->next = p->next;
-               tmp->prev = p;
-               p->next = tmp;
-               if (pkg->tail == p)
-                   pkg->tail = tmp;
-               p = tmp;
-           }
+           add_cksum(pkg, p, name);
            break;
        default:
            break;
@@ -90,18 +102,18 @@ trylink(const char *from, const char *to)
        /* try making the container directory */
        char *cp = strrchr(to, '/');
        if (cp)
-           vsystem("mkdir -p %.*s", cp - to,
+           vsystem("/bin/mkdir -p %.*s", cp - to,
                    to);
        return link(from, to);
     }
     return -1;
 }
 
-#define STARTSTRING "tar cf -"
+#define STARTSTRING "/usr/bin/tar cf -"
 #define TOOBIG(str) (int)strlen(str) + 6 + (int)strlen(home) + where_count > maxargs
 #define PUSHOUT() /* push out string */ \
        if (where_count > (int)sizeof(STARTSTRING)-1) { \
-                   strcat(where_args, "|tar xpf -"); \
+                   strcat(where_args, "|/usr/bin/tar xpf -"); \
                    if (system(where_args)) { \
                        cleanup(0); \
                        errx(2, "%s: can't invoke tar pipeline", __func__); \
@@ -203,7 +215,7 @@ copy_plist(const char *home, Package *plist)
                                         p->name);
                    last_chdir = home;
                }
-               if (add_count < 0 || add_count > maxargs - where_count) {
+               if (add_count < 0 || add_count >= maxargs - where_count) {
                    cleanup(0);
                    errx(2, "%s: oops, miscounted strings!", __func__);
                }
@@ -216,7 +228,11 @@ copy_plist(const char *home, Package *plist)
                if (p->name[0] == '/')
                    mythere = root;
                else mythere = there;
-               sprintf(fn, "%s/%s", mythere ? mythere : where, p->name);
+               if (mythere)
+                   snprintf(fn, sizeof(fn), "%s/%s", mythere, p->name);
+               else
+                   snprintf(fn, sizeof(fn), "%s%s/%s",
+                       BaseDir && where && where[0] == '/' ? BaseDir : "", where, p->name);
                if (lstat(fn, &stb) == 0 && stb.st_dev == curdir &&
                    S_ISREG(stb.st_mode)) {
                    /*
@@ -241,7 +257,7 @@ copy_plist(const char *home, Package *plist)
                                         " -C %s %s",
                                         mythere ? mythere : where,
                                         p->name);
-               if (add_count < 0 || add_count > maxargs - where_count) {
+               if (add_count < 0 || add_count >= maxargs - where_count) {
                    cleanup(0);
                    errx(2, "%s: oops, miscounted strings!", __func__);
                }
index 89a2506..3fdfc34 100644 (file)
@@ -1,19 +1,15 @@
-# $FreeBSD: src/usr.sbin/pkg_install/delete/Makefile,v 1.11.2.4 2003/01/09 12:05:53 des Exp $
-# $DragonFly: src/usr.sbin/pkg_install/delete/Attic/Makefile,v 1.3 2003/08/03 16:45:16 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/delete/Makefile,v 1.21 2004/06/29 19:06:41 eik Exp $
+# $DragonFly: src/usr.sbin/pkg_install/delete/Attic/Makefile,v 1.4 2004/07/30 04:46:13 dillon Exp $
 
 PROG=  pkg_delete
 SRCS=  main.c perform.c
 
 CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
 
-WARNS?=        2
+WARNS?=        6
+WFORMAT?=      1
 
-DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD}
-LDADD= ${LIBINSTALL} -lfetch -lmd
-
-.if !defined(NOCRYPT) && !defined(NO_OPENSSL)
-DPADD+=        ${LIBSSL} ${LIBCRYPTO}
-LDADD+=        -lssl -lcrypto
-.endif
+DPADD= ${LIBINSTALL} ${LIBMD}
+LDADD= ${LIBINSTALL} -lmd
 
 .include <bsd.prog.mk>
index a3b6bb4..0d3fd42 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/delete/delete.h,v 1.5.2.2 2001/10/03 07:46:02 sobomax Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/delete/Attic/delete.h,v 1.2 2003/06/17 04:29:59 dillon Exp $ */
-
 /*
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
@@ -19,6 +16,8 @@
  *
  * Include and define various things wanted by the delete command.
  *
+ * $FreeBSD: src/usr.sbin/pkg_install/delete/delete.h,v 1.8 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/delete/Attic/delete.h,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #ifndef _INST_DELETE_H_INCLUDE
@@ -28,7 +27,6 @@ extern char   *Prefix;
 extern Boolean CleanDirs;
 extern Boolean Interactive;
 extern Boolean NoDeInstall;
-extern Boolean Force;
 extern Boolean Recursive;
 extern char    *Directory;
 extern char    *PkgName;
index e2fa932..5c4a3b6 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ *
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
  *
@@ -16,8 +17,8 @@
  *
  * This is the delete module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/delete/main.c,v 1.17.2.8 2002/08/20 06:35:07 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/delete/Attic/main.c,v 1.3 2003/11/03 19:31:39 eirikn Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/delete/main.c,v 1.26 2004/06/29 18:54:47 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/delete/Attic/main.c,v 1.4 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -26,7 +27,7 @@
 #include "lib.h"
 #include "delete.h"
 
-static char Options[] = "adDfGhinp:rvx";
+static char Options[] = "adDfGhinp:rvxX";
 
 char   *Prefix         = NULL;
 Boolean        CleanDirs       = FALSE;
@@ -86,6 +87,10 @@ main(int argc, char **argv)
            MatchType = MATCH_REGEX;
            break;
 
+       case 'X':
+           MatchType = MATCH_EREGEX;
+           break;
+
        case 'i':
            Interactive = TRUE;
            break;
@@ -149,7 +154,7 @@ static void
 usage()
 {
     fprintf(stderr, "%s\n%s\n",
-       "usage: pkg_delete [-dDfGinrvx] [-p prefix] pkg-name ...",
+       "usage: pkg_delete [-dDfGinrvxX] [-p prefix] pkg-name ...",
        "       pkg_delete -a [flags]");
     exit(1);
 }
index 5b34a0a..46c5b54 100644 (file)
@@ -16,8 +16,8 @@
  *
  * This is the main body of the delete module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/delete/perform.c,v 1.22.2.12 2003/02/28 13:58:14 des Exp $
- * $DragonFly: src/usr.sbin/pkg_install/delete/Attic/perform.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/delete/perform.c,v 1.41 2004/06/29 19:06:41 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/delete/Attic/perform.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include <err.h>
@@ -63,6 +63,7 @@ pkg_perform(char **pkgs)
            case MATCH_ALL:
                warnx("no packages installed");
                return 0;
+           case MATCH_EREGEX:
            case MATCH_REGEX:
                warnx("no packages match pattern(s)");
                return 1;
@@ -123,6 +124,7 @@ pkg_do(char *pkg)
     char *deporigin, **depnames, home[FILENAME_MAX];
     PackingList p;
     int i, len;
+    int isinstalled;
     /* support for separate pre/post install scripts */
     int new_m = 0;
     const char *pre_script = DEINSTALL_FNAME;
@@ -139,9 +141,26 @@ pkg_do(char *pkg)
     if (Plist.head)
        free_plist(&Plist);
 
-    if (!isinstalledpkg(pkg)) {
+    sprintf(LogDir, "%s/%s", LOG_DIR, pkg);
+
+    isinstalled = isinstalledpkg(pkg);
+    if (isinstalled == 0) {
        warnx("no such package '%s' installed", pkg);
        return 1;
+    } else if (isinstalled < 0) {
+       warnx("the package info for package '%s' is corrupt%s",
+             pkg, Force ? " (but I'll delete it anyway)" : " (use -f to force removal)");
+       if (!Force)
+           return 1;
+       if (!Fake) {
+           if (vsystem("%s -rf %s", REMOVE_CMD, LogDir)) {
+               warnx("couldn't remove log entry in %s, deinstall failed", LogDir);
+           } else {
+               warnx("couldn't completely deinstall package '%s',\n"
+                     "only the log entry in %s was removed", pkg, LogDir);
+           }
+       }
+       return 0;
     }
 
     if (!getcwd(home, FILENAME_MAX)) {
@@ -149,8 +168,6 @@ pkg_do(char *pkg)
        errx(2, "%s: unable to get current working directory!", __func__);
     }
 
-    sprintf(LogDir, "%s/%s", LOG_DIR, pkg);
-
     if (chdir(LogDir) == FAIL) {
        warnx("unable to change directory to %s! deinstall failed", LogDir);
        return 1;
@@ -206,7 +223,7 @@ pkg_do(char *pkg)
     if (fexists(REQUIRE_FNAME)) {
        if (Verbose)
            printf("Executing 'require' script.\n");
-       vsystem("chmod +x %s", REQUIRE_FNAME);  /* be sure */
+       vsystem("/bin/chmod +x %s", REQUIRE_FNAME);     /* be sure */
        if (vsystem("./%s %s DEINSTALL", REQUIRE_FNAME, pkg)) {
            warnx("package %s fails requirements %s", pkg,
                   Force ? "" : "- not deleted");
@@ -236,7 +253,7 @@ pkg_do(char *pkg)
        if (Fake)
            printf("Would execute de-install script at this point.\n");
        else {
-           vsystem("chmod +x %s", pre_script); /* make sure */
+           vsystem("/bin/chmod +x %s", pre_script);    /* make sure */
            if (vsystem("./%s %s %s", pre_script, pkg, pre_arg)) {
                warnx("deinstall script returned error status");
                if (!Force)
@@ -245,6 +262,30 @@ pkg_do(char *pkg)
        }
     }
 
+    for (p = Plist.head; p ; p = p->next) {
+       if (p->type != PLIST_PKGDEP)
+           continue;
+       deporigin = (p->next->type == PLIST_DEPORIGIN) ? p->next->name :
+                                                        NULL;
+       if (Verbose) {
+           printf("Trying to remove dependency on package '%s'", p->name);
+           if (deporigin != NULL)
+               printf(" with '%s' origin", deporigin);
+           printf(".\n");
+       }
+       if (!Fake) {
+           depnames = (deporigin != NULL) ? matchbyorigin(deporigin, NULL) :
+                                            NULL;
+           if (depnames == NULL) {
+               depnames = alloca(sizeof(*depnames) * 2);
+               depnames[0] = p->name;
+               depnames[1] = NULL;
+           }
+           for (i = 0; depnames[i] != NULL; i++)
+               undepend(depnames[i], pkg);
+       }
+    }
+
     if (chdir(home) == FAIL) {
        cleanup(0);
        errx(2, "%s: unable to return to working directory %s!", __func__,
@@ -269,7 +310,7 @@ pkg_do(char *pkg)
        if (Fake)
            printf("Would execute post-deinstall script at this point.\n");
        else {
-           vsystem("chmod +x %s", post_script);        /* make sure */
+           vsystem("/bin/chmod +x %s", post_script);   /* make sure */
            if (vsystem("./%s %s %s", post_script, pkg, post_arg)) {
                warnx("post-deinstall script returned error status");
                if (!Force)
@@ -291,30 +332,6 @@ pkg_do(char *pkg)
                return 1;
        }
     }
-
-    for (p = Plist.head; p ; p = p->next) {
-       if (p->type != PLIST_PKGDEP)
-           continue;
-       deporigin = (p->next->type == PLIST_DEPORIGIN) ? p->next->name :
-                                                        NULL;
-       if (Verbose) {
-           printf("Trying to remove dependency on package '%s'", p->name);
-           if (deporigin != NULL)
-               printf(" with '%s' origin", deporigin);
-           printf(".\n");
-       }
-       if (!Fake) {
-           depnames = (deporigin != NULL) ? matchbyorigin(deporigin, NULL) :
-                                            NULL;
-           if (depnames == NULL) {
-               depnames = alloca(sizeof(*depnames) * 2);
-               depnames[0] = p->name;
-               depnames[1] = NULL;
-           }
-           for (i = 0; depnames[i] != NULL; i++)
-               undepend(depnames[i], pkg);
-       }
-    }
     return 0;
 }
 
index f1c1980..fdedaff 100644 (file)
 .\"
 .\"
 .\"     @(#)pkg_delete.1
-.\" $FreeBSD: src/usr.sbin/pkg_install/delete/pkg_delete.1,v 1.16.2.9 2002/06/21 16:42:18 charnier Exp $
-.\" $DragonFly: src/usr.sbin/pkg_install/delete/Attic/pkg_delete.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
+.\" $FreeBSD: src/usr.sbin/pkg_install/delete/pkg_delete.1,v 1.30 2004/07/02 23:12:52 ru Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/delete/Attic/pkg_delete.1,v 1.3 2004/07/30 04:46:13 dillon Exp $
 .\"
-.Dd November 25, 1994
+.Dd June 29, 2004
 .Dt PKG_DELETE 1
 .Os
 .Sh NAME
@@ -26,7 +26,7 @@
 .Nd a utility for deleting previously installed software package distributions
 .Sh SYNOPSIS
 .Nm
-.Op Fl dDfGinrvx
+.Op Fl dDfGinrvxX
 .Op Fl p Ar prefix
 .Ar pkg-name ...
 .Nm
@@ -50,7 +50,8 @@ or other subtle
 attacks from miscreants who create dangerous package files.
 .Pp
 You are advised to verify the competence and identity of those who
-provide installable package files.  For extra protection, examine all
+provide installable package files.
+For extra protection, examine all
 the package control files in the package record directory
 .Pa ( /var/db/pkg/<pkg-name>/ ) .
 Pay particular attention to any +INSTALL, +POST-INSTALL, +DEINSTALL,
@@ -89,15 +90,18 @@ would be taken if it were.
 Set
 .Ar prefix
 as the directory in which to delete files from any installed packages
-which do not explicitly set theirs.  For most packages, the prefix will
+which do not explicitly set theirs.
+For most packages, the prefix will
 be set automatically to the installed location by
 .Xr pkg_add 1 .
 .It Fl d
-Remove empty directories created by file cleanup.  By default, only
+Remove empty directories created by file cleanup.
+By default, only
 files/directories explicitly listed in a package's contents (either as
 normal files/directories or with the
 .Cm @dirrm
-directive) will be removed at deinstallation time.  This option tells
+directive) will be removed at deinstallation time.
+This option tells
 .Nm
 to also remove any directories that were emptied as a result of removing
 the package.
@@ -115,20 +119,29 @@ automatically expands shell glob patterns in the
 Treat the
 .Ar pkg-name
 as a regular expression and delete all packages whose names match
-that regular expression.  Multiple regular expressions could be
+that regular expression.
+Multiple regular expressions could be
 provided, in that case
 .Nm
 deletes all packages that match at least one
 regular expression from the list.
+.It Fl X
+Like
+.Fl x ,
+but treats the
+.Ar pkg-name
+as an extended regular expression.
 .It Fl r
-Recursive removal.  In addition to specified packages, delete all
+Recursive removal.
+In addition to specified packages, delete all
 packages that depend on those packages as well.
 .El
 .Sh TECHNICAL DETAILS
 The
 .Nm
 utility
-does pretty much what it says.  It examines installed package records in
+does pretty much what it says.
+It examines installed package records in
 .Pa /var/db/pkg/<pkg-name> ,
 deletes the package contents, and finally removes the package records.
 If the environment variable
@@ -159,7 +172,8 @@ then this is executed first as
 is the name of the package in question and
 .Ar DEINSTALL
 is a keyword denoting that this is a deinstallation)
-to see whether or not deinstallation should continue.  A non-zero exit
+to see whether or not deinstallation should continue.
+A non-zero exit
 status means no, unless the
 .Fl f
 option is specified.
@@ -200,7 +214,8 @@ If a
 .Cm post-deinstall
 script exists for the package, it is executed
 .Cm after
-all files are removed.  It is this script's responsibility to clean up any
+all files are removed.
+It is this script's responsibility to clean up any
 additional messy details around the package's installation, and leave the
 system (hopefully) in the same state that it was prior to the installation
 of the package.
@@ -245,7 +260,8 @@ All scripts are called with the environment variable
 .Ev PKG_PREFIX
 set to the installation prefix (see the
 .Fl p
-option above).  This allows a package author to write a script
+option above).
+This allows a package author to write a script
 that reliably performs some action on the directory where the package
 is installed, even if the user might have changed it by specifying the
 .Fl p
@@ -272,6 +288,7 @@ Default location of the installed package database.
 .Sh AUTHORS
 .An Jordan Hubbard
 .Sh CONTRIBUTORS
-.An John Kohl Aq jtk@rational.com
+.An John Kohl Aq jtk@rational.com ,
+.An Oliver Eikemeier Aq eik@FreeBSD.org
 .Sh BUGS
 Sure to be some.
index 2c7b8a6..c6f0947 100644 (file)
@@ -1,19 +1,15 @@
-# $FreeBSD: src/usr.sbin/pkg_install/info/Makefile,v 1.11.2.4 2003/01/09 12:05:53 des Exp $
-# $DragonFly: src/usr.sbin/pkg_install/info/Attic/Makefile,v 1.3 2003/08/03 16:45:16 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/info/Makefile,v 1.19 2004/06/29 19:06:42 eik Exp $
+# $DragonFly: src/usr.sbin/pkg_install/info/Attic/Makefile,v 1.4 2004/07/30 04:46:13 dillon Exp $
 
 PROG=  pkg_info
 SRCS=  main.c perform.c show.c
 
 CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
 
-WARNS?=        2
+WARNS?=        6
+WFORMAT?=      1
 
 DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD}
 LDADD= ${LIBINSTALL} -lfetch -lmd
 
-.if !defined(NOCRYPT) && !defined(NO_OPENSSL)
-DPADD+=        ${LIBSSL} ${LIBCRYPTO}
-LDADD+=        -lssl -lcrypto
-.endif
-
 .include <bsd.prog.mk>
index 5f5b78a..2a4247e 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/info/info.h,v 1.11.2.10 2002/08/02 11:09:05 sobomax Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/info/Attic/info.h,v 1.2 2003/06/17 04:29:59 dillon Exp $ */
-
 /*
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
@@ -19,6 +16,8 @@
  *
  * Include and define various things wanted by the info command.
  *
+ * $FreeBSD: src/usr.sbin/pkg_install/info/info.h,v 1.27 2004/06/29 18:54:47 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/info/Attic/info.h,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #ifndef _INST_INFO_H_INCLUDE
 #define MAXNAMESIZE  20
 #endif
 
-#define        SHOW_COMMENT    0x0001
-#define SHOW_DESC      0x0002
-#define SHOW_PLIST     0x0004
-#define SHOW_INSTALL   0x0008
-#define SHOW_DEINSTALL 0x0010
-#define SHOW_REQUIRE   0x0020
-#define SHOW_PREFIX    0x0040
-#define SHOW_INDEX     0x0080
-#define SHOW_FILES     0x0100
-#define SHOW_DISPLAY   0x0200
-#define SHOW_REQBY     0x0400
-#define SHOW_MTREE     0x0800
-#define SHOW_SIZE      0x1000
-#define SHOW_ORIGIN    0x2000
-#define SHOW_CKSUM     0x4000
-#define SHOW_FMTREV    0x8000
+#define SHOW_COMMENT   0x00001
+#define SHOW_DESC      0x00002
+#define SHOW_PLIST     0x00004
+#define SHOW_INSTALL   0x00008
+#define SHOW_DEINSTALL 0x00010
+#define SHOW_REQUIRE   0x00020
+#define SHOW_PREFIX    0x00040
+#define SHOW_INDEX     0x00080
+#define SHOW_FILES     0x00100
+#define SHOW_DISPLAY   0x00200
+#define SHOW_REQBY     0x00400
+#define SHOW_MTREE     0x00800
+#define SHOW_SIZE      0x01000
+#define SHOW_ORIGIN    0x02000
+#define SHOW_CKSUM     0x04000
+#define SHOW_FMTREV    0x08000
+#define SHOW_PTREV     0x10000
+#define SHOW_DEPEND    0x20000
+#define SHOW_PKGNAME   0x40000
 
 struct which_entry {
     TAILQ_ENTRY(which_entry) next;
@@ -61,6 +63,8 @@ TAILQ_HEAD(which_head, which_entry);
 
 extern int Flags;
 extern Boolean Quiet;
+extern Boolean QUIET;
+extern Boolean UseBlkSz;
 extern char *InfoPrefix;
 extern char PlayPen[];
 extern char *CheckPkg;
index 063f6bc..fc3e005 100644 (file)
  *
  * This is the info module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/info/main.c,v 1.22.2.14 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/info/Attic/main.c,v 1.3 2003/11/03 19:31:39 eirikn Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/info/main.c,v 1.46 2004/06/29 18:59:18 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/info/Attic/main.c,v 1.4 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
 #include "info.h"
 #include <err.h>
 
-static char Options[] = "acdDe:fgGhiIkl:LmoO:pqrRst:vVW:x";
+static char Options[] = "abcdDe:EfgGhiIjkl:LmoO:pPqQrRst:vVW:xX";
 
 int    Flags           = 0;
 match_t        MatchType       = MATCH_GLOB;
 Boolean Quiet          = FALSE;
+Boolean QUIET          = FALSE;
+Boolean UseBlkSz       = FALSE;
 char *InfoPrefix       = (char *)(uintptr_t)"";
 char PlayPen[FILENAME_MAX];
 char *CheckPkg         = NULL;
@@ -61,6 +63,10 @@ main(int argc, char **argv)
            MatchType = MATCH_ALL;
            break;
 
+       case 'b':
+           UseBlkSz = TRUE;
+           break;
+
        case 'v':
            Verbose = TRUE;
            /* Reasonable definition of 'everything' */
@@ -68,6 +74,10 @@ main(int argc, char **argv)
                SHOW_DEINSTALL | SHOW_REQUIRE | SHOW_DISPLAY | SHOW_MTREE;
            break;
 
+       case 'E':
+           Flags |= SHOW_PKGNAME;
+           break;
+
        case 'I':
            Flags |= SHOW_INDEX;
            break;
@@ -104,12 +114,16 @@ main(int argc, char **argv)
            Flags |= SHOW_INSTALL;
            break;
 
+       case 'j':
+           Flags |= SHOW_REQUIRE;
+           break;
+
        case 'k':
            Flags |= SHOW_DEINSTALL;
            break;
 
        case 'r':
-           Flags |= SHOW_REQUIRE;
+           Flags |= SHOW_DEPEND;
            break;
 
        case 'R':
@@ -150,6 +164,11 @@ main(int argc, char **argv)
            Quiet = TRUE;
            break;
 
+       case 'Q':
+           Quiet = TRUE;
+           QUIET = TRUE;
+           break;
+
        case 't':
            strlcpy(PlayPen, optarg, sizeof(PlayPen));
            break;
@@ -158,6 +177,10 @@ main(int argc, char **argv)
            MatchType = MATCH_REGEX;
            break;
 
+       case 'X':
+           MatchType = MATCH_EREGEX;
+           break;
+
        case 'e':
            CheckPkg = optarg;
            break;
@@ -176,6 +199,10 @@ main(int argc, char **argv)
                break;
            }
 
+       case 'P':
+           Flags = SHOW_PTREV;
+           break;
+
        case 'h':
        case '?':
        default:
@@ -187,6 +214,13 @@ main(int argc, char **argv)
     argc -= optind;
     argv += optind;
 
+    if (Flags & SHOW_PTREV) {
+       if (!Quiet)
+           printf("Package tools revision: ");
+       printf("%d\n", PKG_INSTALL_VERSION);
+       exit(0);
+    }
+
     /* Set some reasonable defaults */
     if (!Flags)
        Flags = SHOW_COMMENT | SHOW_DESC | SHOW_REQBY;
@@ -197,7 +231,7 @@ main(int argc, char **argv)
         * Don't try to apply heuristics if arguments are regexs or if
         * the argument refers to an existing file.
         */
-       if (MatchType != MATCH_REGEX && !isfile(*argv))
+       if (MatchType != MATCH_REGEX && MatchType != MATCH_EREGEX && !isfile(*argv))
            while ((pkgs_split = strrchr(*argv, (int)'/')) != NULL) {
                *pkgs_split++ = '\0';
                /*
@@ -227,10 +261,10 @@ static void
 usage()
 {
     fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
-       "usage: pkg_info [-cdDfGiIkLmopqrRsvVx] [-e package] [-l prefix]",
-       "                [-t template] [pkg-name ...]",
-       "       pkg_info [-q] -W filename",
-       "       pkg_info [-q] -O origin",
-       "       pkg_info -a [flags]");
+       "usage: pkg_info [-bcdDEfgGiIjkLmopPqQrRsvVxX] [-e package] [-l prefix]",
+       "                [-t template] -a | pkg-name ...",
+       "       pkg_info [-qQ] -W filename",
+       "       pkg_info [-qQ] -O origin",
+       "       pkg_info");
     exit(1);
 }
index 508e6b5..4c89789 100644 (file)
@@ -16,8 +16,8 @@
  *
  * This is the main body of the info module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/info/perform.c,v 1.29.2.14 2002/10/11 14:23:43 sobomax Exp $
- * $DragonFly: src/usr.sbin/pkg_install/info/Attic/perform.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/info/perform.c,v 1.53 2004/06/29 18:59:18 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/info/Attic/perform.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -30,6 +30,7 @@ static int find_pkg(struct which_head *);
 static int cmp_path(const char *, const char *, const char *);
 static char *abspath(const char *);
 static int find_pkgs_by_origin(const char *);
+static int matched_packages(char **pkgs);
 
 int
 pkg_perform(char **pkgs)
@@ -41,8 +42,10 @@ pkg_perform(char **pkgs)
     signal(SIGINT, cleanup);
 
     /* Overriding action? */
-    if (CheckPkg) {
-       return isinstalledpkg(CheckPkg) == TRUE ? 0 : 1;
+    if (Flags & SHOW_PKGNAME) {
+       return matched_packages(pkgs);
+    } else if (CheckPkg) {
+       return isinstalledpkg(CheckPkg) > 0 ? 0 : 1;
        /* Not reached */
     } else if (!TAILQ_EMPTY(whead)) {
        return find_pkg(whead);
@@ -66,6 +69,7 @@ pkg_perform(char **pkgs)
                return 0;
                /* Not reached */
            case MATCH_REGEX:
+           case MATCH_EREGEX:
                warnx("no packages match pattern(s)");
                return 1;
                /* Not reached */
@@ -87,7 +91,7 @@ pkg_do(char *pkg)
 {
     Boolean installed = FALSE, isTMP = FALSE;
     char log_dir[FILENAME_MAX];
-    char fname[FILENAME_MAX], extrlist[FILENAME_MAX];
+    char fname[FILENAME_MAX];
     Package plist;
     FILE *fp;
     struct stat sb;
@@ -130,29 +134,19 @@ pkg_do(char *pkg)
            goto bail;
        }
        Home = make_playpen(PlayPen, sb.st_size / 2);
-       snprintf(extrlist, sizeof(extrlist), "--fast-read %s %s %s",
-                CONTENTS_FNAME, COMMENT_FNAME, DESC_FNAME);
-       if (Flags & SHOW_DISPLAY)
-           snprintf(extrlist, sizeof(extrlist), "%s %s", extrlist,
-                    DISPLAY_FNAME);
-       if (Flags & SHOW_INSTALL)
-           snprintf(extrlist, sizeof(extrlist), "%s %s %s", extrlist,
-                    INSTALL_FNAME, POST_INSTALL_FNAME);
-       if (Flags & SHOW_DEINSTALL)
-           snprintf(extrlist, sizeof(extrlist), "%s %s %s", extrlist,
-                    DEINSTALL_FNAME, POST_DEINSTALL_FNAME);
-       if (Flags & SHOW_MTREE)
-           snprintf(extrlist, sizeof(extrlist), "%s %s", extrlist,
-                    MTREE_FNAME);
-       if (unpack(fname, extrlist)) {
+       if (unpack(fname, "'+*'")) {
            warnx("error during unpacking, no info for '%s' available", pkg);
            code = 1;
            goto bail;
        }
     }
-    /* It's not an ininstalled package, try and find it among the installed */
+    /* It's not an uninstalled package, try and find it among the installed */
     else {
-       if (!isinstalledpkg(pkg)) {
+       int isinstalled = isinstalledpkg(pkg);
+       if (isinstalled < 0) {
+           warnx("the package info for package '%s' is corrupt", pkg);
+           return 1;
+       } else if (isinstalled == 0) {
            warnx("can't find package '%s' installed or in a file!", pkg);
            return 1;
        }
@@ -190,9 +184,11 @@ pkg_do(char *pkg)
        /* Start showing the package contents */
        if (!Quiet)
            printf("%sInformation for %s:\n\n", InfoPrefix, pkg);
+       else if (QUIET)
+           printf("%s%s:", InfoPrefix, pkg);
        if (Flags & SHOW_COMMENT)
            show_file("Comment:\n", COMMENT_FNAME);
-       if (Flags & SHOW_REQUIRE)
+       if (Flags & SHOW_DEPEND)
            show_plist("Depends on:\n", &plist, PLIST_PKGDEP, FALSE);
        if ((Flags & SHOW_REQBY) && !isemptyfile(REQUIRED_BY_FNAME))
            show_file("Required by:\n", REQUIRED_BY_FNAME);
@@ -202,6 +198,8 @@ pkg_do(char *pkg)
            show_file("Install notice:\n", DISPLAY_FNAME);
        if (Flags & SHOW_PLIST)
            show_plist("Packing list:\n", &plist, (plist_t)0, TRUE);
+       if (Flags & SHOW_REQUIRE && fexists(REQUIRE_FNAME))
+           show_file("Requirements script:\n", REQUIRE_FNAME);
        if ((Flags & SHOW_INSTALL) && fexists(INSTALL_FNAME))
            show_file("Install script:\n", INSTALL_FNAME);
        if ((Flags & SHOW_INSTALL) && fexists(POST_INSTALL_FNAME))
@@ -448,3 +446,27 @@ find_pkgs_by_origin(const char *origin)
 
     return 0;
 }
+
+/*
+ * List only the matching package names.
+ * Mainly intended for scripts.
+ */
+static int
+matched_packages(char **pkgs)
+{
+    char **matched;
+    int i, errcode;
+
+    matched = matchinstalled(MatchType == MATCH_GLOB ? MATCH_NGLOB : MatchType, pkgs, &errcode);
+
+    if (errcode != 0 || matched == NULL)
+       return 1;
+
+    for (i = 0; matched[i]; i++)
+       if (!Quiet)
+           printf("%s\n", matched[i]);
+       else if (QUIET)
+           printf("%s%s\n", InfoPrefix, matched[i]);
+
+    return 0;
+}
index 921647a..1d360b6 100644 (file)
 .\"
 .\"
 .\"     @(#)pkg_info.1
-.\" $FreeBSD: src/usr.sbin/pkg_install/info/pkg_info.1,v 1.24.2.13 2002/08/02 11:09:05 sobomax Exp $
-.\" $DragonFly: src/usr.sbin/pkg_install/info/Attic/pkg_info.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
+.\" $FreeBSD: src/usr.sbin/pkg_install/info/pkg_info.1,v 1.53 2004/07/03 18:35:52 ru Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/info/Attic/pkg_info.1,v 1.3 2004/07/30 04:46:13 dillon Exp $
 .\"
-.Dd February 8, 2001
+.Dd June 29, 2004
 .Dt PKG_INFO 1
 .Os
 .Sh NAME
 .Nd a utility for displaying information on software packages
 .Sh SYNOPSIS
 .Nm
-.Op Fl cdDfgGiIkLmopqrRsvVx
+.Op Fl bcdDEfgGijIkLmopPqQrRsvVxX
 .Op Fl e Ar package
 .Op Fl l Ar prefix
 .Op Fl t Ar template
-.Op Ar pkg-name ...
+.Fl a | Ar pkg-name ...
 .Nm
-.Op Fl q
+.Op Fl qQ
 .Fl W Ar filename
 .Nm
-.Op Fl q
+.Op Fl qQ
 .Fl O Ar origin
 .Nm
-.Fl a
-.Op Ar flags
 .Sh DESCRIPTION
 The
 .Nm
@@ -54,11 +52,28 @@ command.
 The following command line options are supported:
 .Bl -tag -width indent
 .It Ar pkg-name ...
-The named packages are described.  A package name may either be the name of
+The named packages are described.
+A package name may either be the name of
 an installed package, the pathname to a package distribution file or a
 URL to an FTP available package.
+Package version numbers can also be matched in a relational manner using the
+.Pa \*[Ge], \*[Le], \*[Gt]
+and
+.Pa \*[Lt]
+operators.
+For example,
+.Pa pkg_info 'portupgrade\*[Ge]20030723'
+will match versions 20030723 and later of the
+.Pa portupgrade
+package.
 .It Fl a
 Show all currently installed packages.
+.It Fl b
+Use the BLOCKSIZE environment variable for output even when the
+.Fl q
+or
+.Fl Q
+flag is present.
 .It Fl v
 Turn on verbose output.
 .It Fl p
@@ -68,6 +83,10 @@ Be
 .Dq quiet
 in emitting report headers and such, just dump the
 raw info (basically, assume a non-human reading).
+.It Fl Q
+Be
+.Dq quiet
+as above but print preface output with the package name.
 .It Fl c
 Show the (one line) comment field for each package.
 .It Fl d
@@ -81,18 +100,22 @@ Show files that don't match the recorded checksum.
 .It Fl i
 Show the install script (if any) for each package.
 .It Fl I
-Show an index line for each package.  This option takes
+Show an index line for each package.
+This option takes
 precedence over all other package formatting options.
+.It Fl j
+Show the requirements script (if any) for each package.
 .It Fl k
 Show the de-install script (if any) for each package.
 .It Fl r
-Show the requirements script (if any) for each package.
+Show the list of packages on which each package depends.
 .It Fl R
 Show the list of installed packages which require each package.
 .It Fl m
 Show the mtree file (if any) for each package.
 .It Fl L
-Show the files within each package.  This is different from just
+Show the files within each package.
+This is different from just
 viewing the packing list, since full pathnames for everything
 are generated.
 .It Fl s
@@ -100,7 +123,8 @@ Show the total size occupied by files installed within each package.
 .It Fl o
 Show the
 .Dq origin
-path recorded on package generation.  This path
+path recorded on package generation.
+This path
 intended to give an idea as to where the underlying port, from which
 package was generated, is located in the
 .Fx
@@ -115,7 +139,8 @@ automatically expands shell glob patterns in the
 .It Fl W
 For the specified
 .Ar filename
-argument show which package it belongs to.  If the file is not in the
+argument show which package it belongs to.
+If the file is not in the
 current directory, and does not have an absolute path, then the
 .Ev PATH
 is searched using
@@ -128,17 +153,30 @@ argument list all packages having this origin.
 Treat the
 .Ar pkg-name
 as a regular expression and display information only for packages
-whose names match that regular expression.  Multiple regular
+whose names match that regular expression.
+Multiple regular
 expressions could be provided, in that case
 .Nm
 displays information about all packages that match at least one
 regular expression from the list.
+.It Fl X
+Like
+.Fl x ,
+but treats the
+.Ar pkg-name
+as an extended regular expression.
 .It Fl e Ar pkg-name
 If the package identified by
 .Ar pkg-name
-is currently installed, return 0, otherwise return 1.  This option
+is currently installed, return 0, otherwise return 1.
+This option
 allows you to easily test for the presence of another (perhaps
 prerequisite) package from a script.
+.It Fl E
+Show only matching package names.
+This option takes
+precedence over all other package formatting options.
+If any packages match, return 0, otherwise return 1.
 .It Fl l Ar str
 Prefix each information category header (see
 .Fl q )
@@ -147,7 +185,8 @@ shown with
 This is primarily of use to front-end programs who want to request a
 lot of different information fields at once for a package, but don't
 necessary want the output intermingled in such a way that they can't
-organize it.  This lets you add a special token to the start of
+organize it.
+This lets you add a special token to the start of
 each field.
 .It Fl t Ar template
 Use
@@ -161,12 +200,13 @@ By default, this is the string
 but it may be necessary to override it in the situation where
 space in your
 .Pa /tmp
-directory is limited.  Be sure to leave some number of `X' characters
+directory is limited.
+Be sure to leave some number of `X' characters
 for
 .Xr mktemp 3
 to fill in with a unique ID.
 .Bd -ragged -offset indent -compact
-Note:  This should really not be necessary with
+Note: This should really not be necessary with
 .Nm ,
 since very little information is extracted from each package
 and one would have to have a very small
@@ -175,6 +215,8 @@ indeed to overflow it.
 .Ed
 .It Fl V
 Show revision number of the packing list format.
+.It Fl P
+Show revision number of package tools.
 .El
 .Sh TECHNICAL DETAILS
 Package info is either extracted from package files named on the
@@ -182,16 +224,23 @@ command line, or from already installed package information
 in
 .Pa /var/db/pkg/ Ns Aq Ar pkg-name .
 .Sh ENVIRONMENT
-.Ev PKG_TMPDIR
-points to the directory where
+.Bl -tag -width PKG_TMPDIR
+.It Ev BLOCKSIZE
+If the environment variable
+.Ev BLOCKSIZE
+is set the block counts will be displayed in units of that
+size block.
+.It Ev PKG_TMPDIR
+Points to the directory where
 .Nm
 creates its temporary files.
 If this variable is not set,
 .Ev TMPDIR
-is used.  If both are unset, the builtin defaults are used.
-.Pp
-.Ev PKG_DBDIR
-specifies an alternative location for the installed package database.
+is used.
+If both are unset, the builtin defaults are used.
+.It Ev PKG_DBDIR
+Specifies an alternative location for the installed package database.
+.El
 .Sh FILES
 .Bl -tag -width /var/db/pkg -compact
 .It Pa /var/tmp
@@ -221,6 +270,7 @@ Default location of the installed package database.
 .Sh AUTHORS
 .An Jordan Hubbard
 .Sh CONTRIBUTORS
-.An John Kohl Aq jtk@rational.com
+.An John Kohl Aq jtk@rational.com ,
+.An Oliver Eikemeier Aq eik@FreeBSD.org
 .Sh BUGS
 Sure to be some.
index fd7d5b2..4c1667b 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Various display routines for the info module.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/info/show.c,v 1.14.2.14 2003/06/09 16:59:43 lioux Exp $
- * $DragonFly: src/usr.sbin/pkg_install/info/Attic/show.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/info/show.c,v 1.37 2003/05/26 17:06:05 lioux Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/info/Attic/show.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -166,6 +166,10 @@ show_plist(const char *title, Package *plist, plist_t type, Boolean showall)
                "\tdependency origin: %s\n", p->name);
            break;
 
+       case PLIST_CONFLICTS:
+           printf(Quiet ? "@conflicts %s\n" : "Conflicts: %s\n", p->name);
+           break;
+
        case PLIST_MTREE:
            printf(Quiet ? "@mtree %s\n" : "\tPackage mtree file: %s\n", p->name);
            break;
@@ -277,7 +281,10 @@ show_size(const char *title, Package *plist)
     if (!Quiet)
        printf("%lu\t(%s)\n", howmany(size, blksize), descr);
     else
-       printf("%lu\n", size);
+       if (UseBlkSz)
+               printf("%lu\n", howmany(size, blksize));
+       else
+               printf("%lu\n", size);
 }
 
 /* Show files that don't match the recorded checksum */
index 49ee9bf..abfc68b 100644 (file)
@@ -1,13 +1,14 @@
-# $FreeBSD: src/usr.sbin/pkg_install/lib/Makefile,v 1.6.8.5 2002/07/19 18:46:30 ru Exp $
-# $DragonFly: src/usr.sbin/pkg_install/lib/Attic/Makefile,v 1.3 2003/11/19 15:17:29 hmp Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/lib/Makefile,v 1.16 2004/07/28 07:19:15 kan Exp $
+# $DragonFly: src/usr.sbin/pkg_install/lib/Attic/Makefile,v 1.4 2004/07/30 04:46:13 dillon Exp $
 
 LIB=   install
 INTERNALLIB= YES
 SRCS=  file.c msg.c plist.c str.c exec.c global.c pen.c match.c \
-       deps.c version.c pkgwrap.c
+       deps.c version.c pkgwrap.c url.c
 
 CFLAGS+= ${DEBUG}
 
-WARNS?=        2
+WARNS?=        3
+WFORMAT?=      1
 
 .include <bsd.lib.mk>
index 445405a..c55febc 100644 (file)
@@ -17,8 +17,8 @@
  * Routines used to do various operations with dependencies
  * among installed packages.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/deps.c,v 1.1.2.8 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/deps.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/deps.c,v 1.11 2004/06/29 18:59:19 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/deps.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -96,7 +96,7 @@ chkifdepends(const char *pkgname1, const char *pkgname2)
 
     errcode = 0;
     /* Check that pkgname2 is actually installed */
-    if (!isinstalledpkg(pkgname2))
+    if (isinstalledpkg(pkgname2) <= 0)
        goto exit;
 
     errcode = requiredby(pkgname2, &rb_list, FALSE, TRUE);
@@ -152,7 +152,7 @@ requiredby(const char *pkgname, struct reqr_by_head **list, Boolean strict, Bool
        free(rb_entry);
     }
 
-    if (!isinstalledpkg(pkgname)) {
+    if (isinstalledpkg(pkgname) <= 0) {
        if (strict == TRUE)
            warnx("no such package '%s' installed", pkgname);
        return -1;
@@ -172,7 +172,7 @@ requiredby(const char *pkgname, struct reqr_by_head **list, Boolean strict, Bool
     while (fgets(fbuf, sizeof(fbuf), fp) != NULL) {
        if (fbuf[strlen(fbuf) - 1] == '\n')
            fbuf[strlen(fbuf) - 1] = '\0';
-       if (filter == TRUE && !isinstalledpkg(fbuf)) {
+       if (filter == TRUE && isinstalledpkg(fbuf) <= 0) {
            if (strict == TRUE)
                warnx("package '%s' is recorded in the '%s' but isn't "
                      "actually installed", fbuf, fname);
index d442ba3..8c5f274 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Miscellaneous system routines.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/exec.c,v 1.7.2.3 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/exec.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/exec.c,v 1.10 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/exec.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
index 47b702f..ccaea80 100644 (file)
  *
  * Miscellaneous file access utilities.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/file.c,v 1.40.2.14 2002/09/25 23:22:14 bmah Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/file.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/file.c,v 1.68 2004/07/28 16:03:13 stefanf Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/file.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
 #include <err.h>
-#include <fetch.h>
 #include <pwd.h>
 #include <time.h>
 #include <sys/wait.h>
@@ -87,7 +86,7 @@ isfile(const char *fname)
     return FALSE;
 }
 
-/* 
+/*
  * Check to see if file is a file or symlink pointing to a file and is empty.
  * If nonexistent or not a file, say "it's empty", otherwise return TRUE if
  * zero sized.
@@ -126,126 +125,12 @@ isURL(const char *fname)
        return FALSE;
     while (isspace(*fname))
        ++fname;
-    if (!strncmp(fname, "ftp://", 6) || !strncmp(fname, "http://", 7))
+    if (!strncmp(fname, "ftp://", 6) || !strncmp(fname, "http://", 7) ||
+       !strncmp(fname, "https://", 8) || !strncmp(fname, "file://", 7))
        return TRUE;
     return FALSE;
 }
 
-#define HOSTNAME_MAX   64
-/*
- * Try and fetch a file by URL, returning the directory name for where
- * it's unpacked, if successful.
- */
-char *
-fileGetURL(const char *base, const char *spec)
-{
-    char *cp, *rp;
-    char fname[FILENAME_MAX];
-    char pen[FILENAME_MAX];
-    char buf[8192];
-    FILE *ftp;
-    pid_t tpid;
-    int pfd[2], pstat, r, w;
-    char *hint;
-    int fd;
-
-    rp = NULL;
-    /* Special tip that sysinstall left for us */
-    hint = getenv("PKG_ADD_BASE");
-    if (!isURL(spec)) {
-       if (!base && !hint)
-           return NULL;
-       /*
-        * We've been given an existing URL (that's known-good) and now we need
-        * to construct a composite one out of that and the basename we were
-        * handed as a dependency.
-        */
-       if (base) {
-           strcpy(fname, base);
-           /*
-            * Advance back two slashes to get to the root of the package
-            * hierarchy
-            */
-           cp = strrchr(fname, '/');
-           if (cp) {
-               *cp = '\0';     /* chop name */
-               cp = strrchr(fname, '/');
-           }
-           if (cp) {
-               *(cp + 1) = '\0';
-               strcat(cp, "All/");
-               strcat(cp, spec);
-               strcat(cp, ".tgz");
-           }
-           else
-               return NULL;
-       }
-       else {
-           /*
-            * Otherwise, we've been given an environment variable hinting
-            * at the right location from sysinstall
-            */
-           strcpy(fname, hint);
-           strcat(fname, spec);
-            strcat(fname, ".tgz");
-       }
-    }
-    else
-       strcpy(fname, spec);
-
-    if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) {
-       printf("Error: FTP Unable to get %s: %s\n",
-              fname, fetchLastErrString);
-       return NULL;
-    }
-    
-    if (isatty(0) || Verbose)
-       printf("Fetching %s...", fname), fflush(stdout);
-    pen[0] = '\0';
-    if ((rp = make_playpen(pen, 0)) == NULL) {
-       printf("Error: Unable to construct a new playpen for FTP!\n");
-       fclose(ftp);
-       return NULL;
-    }
-    if (pipe(pfd) == -1) {
-       warn("pipe()");
-       cleanup(0);
-       exit(2);
-    }
-    if ((tpid = fork()) == -1) {
-       warn("pipe()");
-       cleanup(0);
-       exit(2);
-    }
-    if (!tpid) {
-       dup2(pfd[0], 0);
-       for (fd = getdtablesize() - 1; fd >= 3; --fd)
-           close(fd);
-       execl("/usr/bin/tar", "tar", Verbose ? "-xzvf" : "-xzf", "-",
-           (char *)0);
-       _exit(2);
-    }
-    close(pfd[0]);
-    for (;;) {
-       if ((r = fread(buf, 1, sizeof buf, ftp)) < 1)
-           break;
-       if ((w = write(pfd[1], buf, r)) != r)
-           break;
-    }
-    if (ferror(ftp))
-       warn("warning: error reading from server");
-    fclose(ftp);
-    close(pfd[1]);
-    if (w == -1)
-       warn("warning: error writing to tar");
-    tpid = waitpid(tpid, &pstat, 0);
-    if (Verbose)
-       printf("tar command returns %d status\n", WEXITSTATUS(pstat));
-    if (rp && (isatty(0) || Verbose))
-       printf(" Done.\n");
-    return rp;
-}
-
 char *
 fileFindByPath(const char *base, const char *fname)
 {
@@ -310,7 +195,7 @@ fileGetContents(const char *fname)
     }
     if (read(fd, contents, sb.st_size) != sb.st_size) {
        cleanup(0);
-       errx(2, "%s: short read on '%s' - did not get %qd bytes", __func__,
+       errx(2, "%s: short read on '%s' - did not get %lld bytes", __func__,
             fname, (long long)sb.st_size);
     }
     close(fd);
@@ -383,9 +268,9 @@ copy_file(const char *dir, const char *fname, const char *to)
     char cmd[FILENAME_MAX];
 
     if (fname[0] == '/')
-       snprintf(cmd, FILENAME_MAX, "cp -r %s %s", fname, to);
+       snprintf(cmd, FILENAME_MAX, "/bin/cp -r %s %s", fname, to);
     else
-       snprintf(cmd, FILENAME_MAX, "cp -r %s/%s %s", dir, fname, to);
+       snprintf(cmd, FILENAME_MAX, "/bin/cp -r %s/%s %s", dir, fname, to);
     if (vsystem(cmd)) {
        cleanup(0);
        errx(2, "%s: could not perform '%s'", __func__, cmd);
@@ -398,9 +283,9 @@ move_file(const char *dir, const char *fname, const char *to)
     char cmd[FILENAME_MAX];
 
     if (fname[0] == '/')
-       snprintf(cmd, FILENAME_MAX, "mv %s %s", fname, to);
+       snprintf(cmd, FILENAME_MAX, "/bin/mv %s %s", fname, to);
     else
-       snprintf(cmd, FILENAME_MAX, "mv %s/%s %s", dir, fname, to);
+       snprintf(cmd, FILENAME_MAX, "/bin/mv %s/%s %s", dir, fname, to);
     if (vsystem(cmd)) {
        cleanup(0);
        errx(2, "%s: could not perform '%s'", __func__, cmd);
@@ -424,12 +309,12 @@ copy_hierarchy(const char *dir, const char *fname, Boolean to)
        /* If absolute path, use it */
        if (*fname == '/')
            dir = "/";
-       snprintf(cmd, FILENAME_MAX * 3, "tar cf - -C %s %s | tar xpf -",
-                dir, fname);
+       snprintf(cmd, FILENAME_MAX * 3, "/usr/bin/tar cf - -C %s %s | /usr/bin/tar xpf -",
+                dir, fname);
     }
     else
-       snprintf(cmd, FILENAME_MAX * 3, "tar cf - %s | tar xpf - -C %s",
-                fname, dir);
+       snprintf(cmd, FILENAME_MAX * 3, "/usr/bin/tar cf - %s | /usr/bin/tar xpf - -C %s",
+                fname, dir);
 #ifdef DEBUG
     printf("Using '%s' to copy trees.\n", cmd);
 #endif
@@ -443,9 +328,10 @@ copy_hierarchy(const char *dir, const char *fname, Boolean to)
 int
 unpack(const char *pkg, const char *flist)
 {
-    char args[10], suff[80], *cp;
+    const char *comp, *cp;
+    char suff[80];
 
-    args[0] = '\0';
+    comp = "";
     /*
      * Figure out by a crude heuristic whether this or not this is probably
      * compressed and whichever compression utility was used (gzip or bzip2).
@@ -456,16 +342,19 @@ unpack(const char *pkg, const char *flist)
            strcpy(suff, cp + 1);
            if (strchr(suff, 'z') || strchr(suff, 'Z')) {
                if (strchr(suff, 'b'))
-                   strcpy(args, "-j");
+                   comp = "-j";
                else
-                   strcpy(args, "-z");
+                   comp = "-z";
            }
        }
     }
     else
-       strcpy(args, "-z");
-    strcat(args, " -xpf");
-    if (vsystem("tar %s '%s' %s", args, pkg, flist ? flist : "")) {
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+       comp = "-j";
+#else
+       comp = "-z";
+#endif
+    if (vsystem("/usr/bin/tar -xp %s -f '%s' %s", comp, pkg, flist ? flist : "")) {
        warnx("tar extract of %s failed!", pkg);
        return 1;
     }
@@ -484,50 +373,58 @@ unpack(const char *pkg, const char *flist)
  *
  */
 void
-format_cmd(char *buf, const char *fmt, const char *dir, const char *name)
+format_cmd(char *buf, int max, const char *fmt, const char *dir, const char *name)
 {
     char *cp, scratch[FILENAME_MAX * 2];
+    int l;
 
-    while (*fmt) {
+    while (*fmt && max > 0) {
        if (*fmt == '%') {
            switch (*++fmt) {
            case 'F':
-               strcpy(buf, name);
-               buf += strlen(name);
+               strncpy(buf, name, max);
+               l = strlen(name);
+               buf += l, max -= l;
                break;
 
            case 'D':
-               strcpy(buf, dir);
-               buf += strlen(dir);
+               strncpy(buf, dir, max);
+               l = strlen(dir);
+               buf += l, max -= l;
                break;
 
            case 'B':
-               sprintf(scratch, "%s/%s", dir, name);
+               snprintf(scratch, FILENAME_MAX * 2, "%s/%s", dir, name);
                cp = &scratch[strlen(scratch) - 1];
                while (cp != scratch && *cp != '/')
                    --cp;
                *cp = '\0';
-               strcpy(buf, scratch);
-               buf += strlen(scratch);
+               strncpy(buf, scratch, max);
+               l = strlen(scratch);
+               buf += l, max -= l;
                break;
 
            case 'f':
-               sprintf(scratch, "%s/%s", dir, name);
+               snprintf(scratch, FILENAME_MAX * 2, "%s/%s", dir, name);
                cp = &scratch[strlen(scratch) - 1];
                while (cp != scratch && *(cp - 1) != '/')
                    --cp;
-               strcpy(buf, cp);
-               buf += strlen(cp);
+               strncpy(buf, cp, max);
+               l = strlen(cp);
+               buf += l, max -= l;
                break;
 
            default:
                *buf++ = *fmt;
+               --max;
                break;
            }
            ++fmt;
        }
-       else
+       else {
            *buf++ = *fmt++;
+           --max;
+       }
     }
     *buf = '\0';
 }
index be6c5ea..487f17c 100644 (file)
  *    documentation and/or other materials provided with the distribution.
  *
  * Jordan K. Hubbard
-
+ *
  * 18 July 1993
  *
  * Semi-convenient place to stick some needed globals.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/global.c,v 1.7.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/global.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/global.c,v 1.9 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/global.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
index c99eda0..faabeeb 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/lib/lib.h,v 1.29.2.12 2003/06/09 17:01:26 lioux Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/lib/Attic/lib.h,v 1.3 2003/11/19 15:17:29 hmp Exp $ */
-
 /*
  * FreeBSD install - a package for the installation and maintainance
  * of non-core utilities.
@@ -19,6 +16,8 @@
  *
  * Include and define various things wanted by the library routines.
  *
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/lib.h,v 1.53 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/lib.h,v 1.4 2004/07/30 04:46:13 dillon Exp $
  */
 
 #ifndef _INST_LIB_LIB_H_
 #define NO             1
 
 /* Usually "rm", but often "echo" during debugging! */
-#define REMOVE_CMD     "rm"
+#define REMOVE_CMD     "/bin/rm"
 
 /* Usually "rm", but often "echo" during debugging! */
-#define RMDIR_CMD      "rmdir"
+#define RMDIR_CMD      "/bin/rmdir"
 
 /* Where we put logging information by default, else ${PKG_DBDIR} if set */
 #define DEF_LOG_DIR    "/var/db/pkg"
 #define DISPLAY_FNAME          "+DISPLAY"
 #define MTREE_FNAME            "+MTREE_DIRS"
 
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500036
+#define INDEX_FNAME            "INDEX-5"
+#else
+#define INDEX_FNAME            "INDEX"
+#endif
+
 #define CMD_CHAR               '@'     /* prefix for extended PLIST cmd */
 
 /* The name of the "prefix" environment variable given to scripts */
@@ -87,7 +92,7 @@
  * Version of the package tools - increase only when some
  * functionality used by bsd.port.mk is changed, added or removed
  */
-#define PKG_INSTALL_VERSION    20030417
+#define PKG_INSTALL_VERSION    20040629
 
 #define PKG_WRAPCONF_FNAME     "/var/db/pkg_install.conf"
 #define main(argc, argv)       real_main(argc, argv)
@@ -106,7 +111,7 @@ enum _plist_t {
 typedef enum _plist_t plist_t;
 
 enum _match_t {
-    MATCH_ALL, MATCH_EXACT, MATCH_GLOB, MATCH_REGEX
+    MATCH_ALL, MATCH_EXACT, MATCH_GLOB, MATCH_NGLOB, MATCH_EREGEX, MATCH_REGEX
 };
 typedef enum _match_t match_t;
 
@@ -123,8 +128,8 @@ typedef struct _plist *PackingList;
 
 struct _pack {
     struct _plist *head, *tail;
-    char *name;
-    char *origin;
+    const char *name;
+    const char *origin;
     int fmtver_maj, fmtver_mnr;
 };
 typedef struct _pack Package;
@@ -148,7 +153,7 @@ off_t               min_free(const char *);
 /* String */
 char           *get_dash_string(char **);
 char           *copy_string(const char *);
-char           *copy_string_plus_newline(const char *);
+char           *copy_string_adds_newline(const char *);
 Boolean                suffix(const char *, const char *);
 void           nuke_suffix(char *);
 void           str_lowercase(char *);
@@ -173,7 +178,7 @@ void                move_file(const char *, const char *, const char *);
 void           copy_hierarchy(const char *, const char *, Boolean);
 int            delete_hierarchy(const char *, Boolean, Boolean);
 int            unpack(const char *, const char *);
-void           format_cmd(char *, const char *, const char *, const char *);
+void           format_cmd(char *, int, const char *, const char *, const char *);
 
 /* Msg */
 void           upchuck(const char *);
@@ -207,6 +212,7 @@ int         real_main(int, char **);
 char           **matchinstalled(match_t, char **, int *);
 char           **matchbyorigin(const char *, int *);
 int            isinstalledpkg(const char *name);
+int            pattern_match(match_t MatchType, char *pattern, const char *pkgname);
 
 /* Dependencies */
 int            sortdeps(char **);
@@ -215,6 +221,7 @@ int         requiredby(const char *, struct reqr_by_head **, Boolean, Boolean);
 
 /* Version */
 int            verscmp(Package *, int, int);
+int            version_cmp(const char *, const char *);
 
 /* Externs */
 extern Boolean Verbose;
index 937ad79..6750a9b 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Routines used to query installed packages.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/match.c,v 1.2.2.8 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/match.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/match.c,v 1.19 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/match.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -36,14 +36,15 @@ struct store {
     char **store;
 };
 
-static int rex_match(const char *, const char *);
+static int rex_match(const char *, const char *, int);
+static int csh_match(const char *, const char *, int);
 struct store *storecreate(struct store *);
 static int storeappend(struct store *, const char *);
-static int fname_cmp(const FTSENT **, const FTSENT **);
+static int fname_cmp(const FTSENT * const *, const FTSENT * const *);
 
 /*
  * Function to query names of installed packages.
- * MatchType   - one of MATCH_ALL, MATCH_REGEX, MATCH_GLOB;
+ * MatchType   - one of MATCH_ALL, MATCH_EREGEX, MATCH_REGEX, MATCH_GLOB, MATCH_NGLOB;
  * patterns    - NULL-terminated list of glob or regex patterns
  *               (could be NULL for MATCH_ALL);
  * retval      - return value (could be NULL if you don't want/need
@@ -61,7 +62,7 @@ matchinstalled(match_t MatchType, char **patterns, int *retval)
     static struct store *store = NULL;
     FTS *ftsp;
     FTSENT *f;
-    Boolean *lmatched;
+    Boolean *lmatched = NULL;
 
     store = storecreate(store);
     if (store == NULL) {
@@ -107,22 +108,11 @@ matchinstalled(match_t MatchType, char **patterns, int *retval)
                    matched = f->fts_name;
                else 
                    for (i = 0; patterns[i]; i++) {
-                       switch (MatchType) {
-                       case MATCH_REGEX:
-                           errcode = rex_match(patterns[i], f->fts_name);
-                           if (errcode == 1) {
-                               matched = f->fts_name;
-                               errcode = 0;
-                           }
-                           break;
-                       case MATCH_GLOB:
-                           if (fnmatch(patterns[i], f->fts_name, 0) == 0) {
-                               matched = f->fts_name;
-                               lmatched[i] = TRUE;
-                           }
-                           break;
-                       default:
-                           break;
+                       errcode = pattern_match(MatchType, patterns[i], f->fts_name);
+                       if (errcode == 1) {
+                           matched = f->fts_name;
+                           lmatched[i] = TRUE;
+                           errcode = 0;
                        }
                        if (matched != NULL || errcode != 0)
                            break;
@@ -152,6 +142,96 @@ matchinstalled(match_t MatchType, char **patterns, int *retval)
        return store->store;
 }
 
+int
+pattern_match(match_t MatchType, char *pattern, const char *pkgname)
+{
+    int errcode = 0;
+    const char *fname = pkgname;
+    char basefname[PATH_MAX];
+    char condchar = '\0';
+    char *condition;
+
+    /* do we have an appended condition? */
+    condition = strpbrk(pattern, "<>=");
+    if (condition) {
+       const char *ch;
+       /* yes, isolate the pattern from the condition ... */
+       if (condition > pattern && condition[-1] == '!')
+           condition--;
+       condchar = *condition;
+       *condition = '\0';
+       /* ... and compare the name without version */
+       ch = strrchr(fname, '-');
+       if (ch && ch - fname < PATH_MAX) {
+           strlcpy(basefname, fname, ch - fname + 1);
+           fname = basefname;
+       }
+    }
+
+    switch (MatchType) {
+    case MATCH_EREGEX:
+    case MATCH_REGEX:
+       errcode = rex_match(pattern, fname, MatchType == MATCH_EREGEX ? 1 : 0);
+       break;
+    case MATCH_NGLOB:
+    case MATCH_GLOB:
+       errcode = (csh_match(pattern, fname, 0) == 0) ? 1 : 0;
+       break;
+    case MATCH_EXACT:
+       errcode = (strcmp(pattern, fname) == 0) ? 1 : 0;
+       break;
+    case MATCH_ALL:
+       errcode = 1;
+       break;
+    default:
+       break;
+    }
+
+    /* loop over all appended conditions */
+    while (condition) {
+       /* restore the pattern */
+       *condition = condchar;
+       /* parse the condition (fun with bits) */
+       if (errcode == 1) {
+           char *nextcondition;
+           /* compare version numbers */
+           int match = 0;
+           if (*++condition == '=') {
+               match = 2;
+               condition++;
+           }
+           switch(condchar) {
+           case '<':
+               match |= 1;
+               break;
+           case '>':
+               match |= 4;
+               break;
+           case '=':
+               match |= 2;
+               break;
+           case '!':
+               match = 5;
+               break;
+           }
+           /* isolate the version number from the next condition ... */
+           nextcondition = strpbrk(condition, "<>=!");
+           if (nextcondition) {
+               condchar = *nextcondition;
+               *nextcondition = '\0';
+           }
+           /* and compare the versions (version_cmp removes the filename for us) */
+           if ((match & (1 << (version_cmp(pkgname, condition) + 1))) == 0)
+               errcode = 0;
+           condition = nextcondition;
+       } else {
+           break;
+       }
+    }
+
+    return errcode;
+}
+
 /*
  * Synopsis is similar to matchinstalled(), but use origin
  * as a key for matching packages.
@@ -192,10 +272,8 @@ matchbyorigin(const char *origin, int *retval)
        snprintf(tmp, PATH_MAX, "%s/%s", tmp, CONTENTS_FNAME);
        fp = fopen(tmp, "r");
        if (fp == NULL) {
-           warn("%s", tmp);
-           if (retval != NULL)
-               *retval = 1;
-           return NULL;
+           warnx("the package info for package '%s' is corrupt", installed[i]);
+           continue;
        }
 
        cmd = -1;
@@ -211,7 +289,7 @@ matchbyorigin(const char *origin, int *retval)
                continue;
            cmd = plist_cmd(tmp + 1, &cp);
            if (cmd == PLIST_ORIGIN) {
-               if (strcmp(origin, cp) == 0)
+               if (csh_match(origin, cp, FNM_PATHNAME) == 0)
                    storeappend(store, installed[i]);
                break;
            }
@@ -228,23 +306,25 @@ matchbyorigin(const char *origin, int *retval)
 }
 
 /*
- * Return TRUE if the specified package is installed,
- * or FALSE otherwise.
+ * 
+ * Return 1 if the specified package is installed,
+ * 0 if not, and -1 if an error occured.
  */
 int
 isinstalledpkg(const char *name)
 {
     char buf[FILENAME_MAX];
+    char buf2[FILENAME_MAX];
 
     snprintf(buf, sizeof(buf), "%s/%s", LOG_DIR, name);
     if (!isdir(buf) || access(buf, R_OK) == FAIL)
-       return FALSE;
+       return 0;
 
-    snprintf(buf, sizeof(buf), "%s/%s", buf, CONTENTS_FNAME);
-    if (!isfile(buf) || access(buf, R_OK) == FAIL)
-       return FALSE;
+    snprintf(buf2, sizeof(buf2), "%s/%s", buf, CONTENTS_FNAME);
+    if (!isfile(buf2) || access(buf2, R_OK) == FAIL)
+       return -1;
 
-    return TRUE;
+    return 1;
 }
 
 /*
@@ -253,7 +333,7 @@ isinstalledpkg(const char *name)
  * engine reported an error (usually invalid syntax).
  */
 static int
-rex_match(const char *pattern, const char *pkgname)
+rex_match(const char *pattern, const char *pkgname, int extended)
 {
     char errbuf[128];
     int errcode;
@@ -262,7 +342,7 @@ rex_match(const char *pattern, const char *pkgname)
 
     retval = 0;
 
-    errcode = regcomp(&rex, pattern, REG_BASIC | REG_NOSUB);
+    errcode = regcomp(&rex, pattern, (extended ? REG_EXTENDED : REG_BASIC) | REG_NOSUB);
     if (errcode == 0)
        errcode = regexec(&rex, pkgname, 0, NULL, 0);
 
@@ -279,6 +359,99 @@ rex_match(const char *pattern, const char *pkgname)
     return retval;
 }
 
+/*
+ * Match string by a csh-style glob pattern. Returns 0 on
+ * match and FNM_NOMATCH otherwise, to be compatible with
+ * fnmatch(3).
+ */
+static int
+csh_match(const char *pattern, const char *string, int flags)
+{
+    int ret = FNM_NOMATCH;
+
+
+    const char *nextchoice = pattern;
+    const char *current = NULL;
+
+    int prefixlen = -1;
+    int currentlen = 0;
+
+    int level = 0;
+
+    do {
+       const char *pos = nextchoice;
+       const char *postfix = NULL;
+
+       Boolean quoted = FALSE;
+
+       nextchoice = NULL;
+
+       do {
+           const char *eb;
+           if (!*pos) {
+               postfix = pos;
+           } else if (quoted) {
+               quoted = FALSE;
+           } else {
+               switch (*pos) {
+               case '{':
+                   ++level;
+                   if (level == 1) {
+                       current = pos+1;
+                       prefixlen = pos-pattern;
+                   }
+                   break;
+               case ',':
+                   if (level == 1 && !nextchoice) {
+                       nextchoice = pos+1;
+                       currentlen = pos-current;
+                   }
+                   break;
+               case '}':
+                   if (level == 1) {
+                       postfix = pos+1;
+                       if (!nextchoice)
+                           currentlen = pos-current;
+                   }
+                   level--;
+                   break;
+               case '[':
+                   eb = pos+1;
+                   if (*eb == '!' || *eb == '^')
+                       eb++;
+                   if (*eb == ']')
+                       eb++;
+                   while(*eb && *eb != ']')
+                       eb++;
+                   if (*eb)
+                       pos=eb;
+                   break;
+               case '\\':
+                   quoted = TRUE;
+                   break;
+               default:
+                   ;
+               }
+           }
+           pos++;
+       } while (!postfix);
+
+       if (current) {
+           char buf[FILENAME_MAX];
+           snprintf(buf, sizeof(buf), "%.*s%.*s%s", prefixlen, pattern, currentlen, current, postfix);
+           ret = csh_match(buf, string, flags);
+           if (ret) {
+               current = nextchoice;
+               level = 1;
+           } else
+               current = NULL;
+       } else
+           ret = fnmatch(pattern, string, flags);
+    } while (current);
+
+    return ret;
+}
+
 /*
  * Create an empty store, optionally deallocating
  * any previously allocated space if store != NULL.
@@ -336,7 +509,7 @@ storeappend(struct store *store, const char *item)
 }
 
 static int
-fname_cmp(const FTSENT **a, const FTSENT **b)
+fname_cmp(const FTSENT * const *a, const FTSENT * const *b)
 {
     return strcmp((*a)->fts_name, (*b)->fts_name);
 }
index 4d7aafa..08b7591 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Miscellaneous message routines.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/msg.c,v 1.12.2.4 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/msg.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/msg.c,v 1.16 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/msg.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
index 729ab40..08f2339 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Routines for managing the "play pen".
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/pen.c,v 1.31.2.7 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/pen.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/pen.c,v 1.42 2004/07/28 16:03:13 stefanf Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/pen.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -111,7 +111,7 @@ make_playpen(char *pen, off_t sz)
 
     if (Verbose) {
        if (sz)
-           fprintf(stderr, "Requested space: %d bytes, free space: %qd bytes in %s\n", (int)sz, (long long)min_free(pen), pen);
+           fprintf(stderr, "Requested space: %d bytes, free space: %lld bytes in %s\n", (int)sz, (long long)min_free(pen), pen);
     }
 
     if (min_free(pen) < sz) {
@@ -155,7 +155,7 @@ leave_playpen()
        Previous[0] = '\0';
     }
     if (PenLocation[0]) {
-       if (PenLocation[0] == '/' && vsystem("rm -rf %s", PenLocation))
+       if (PenLocation[0] == '/' && vsystem("/bin/rm -rf %s", PenLocation))
            warnx("couldn't remove temporary dir '%s'", PenLocation);
        popPen(PenLocation);
     }
index 233488c..39da0e0 100644 (file)
@@ -14,8 +14,8 @@
  * Maxim Sobolev
  * 8 September 2002
  *
- * $FreeBSD: /repoman/r/ncvs/src/usr.sbin/pkg_install/lib/pkgwrap.c,v 1.1.6.1 2003/08/11 09:22:04 kris Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/pkgwrap.c,v 1.1 2003/11/19 15:19:45 hmp Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/pkgwrap.c,v 1.1 2002/09/09 19:43:30 sobomax Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/pkgwrap.c,v 1.2 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
index 86b4c4a..6560159 100644 (file)
@@ -16,8 +16,8 @@
  *
  * General packing list routines.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/plist.c,v 1.29.2.10 2002/08/31 19:38:55 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/plist.c,v 1.3 2003/11/19 15:17:29 hmp Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/plist.c,v 1.48 2004/07/28 07:19:15 kan Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/plist.c,v 1.4 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -204,7 +204,7 @@ plist_cmd(const char *s, char **arg)
        ++cp, ++sp;
     }
     if (arg)
-       (const char *)*arg = sp;
+       *arg = (char *)sp;
     if (!strcmp(cmd, "cwd"))
        return PLIST_CWD;
     else if (!strcmp(cmd, "srcdir"))
@@ -276,8 +276,9 @@ read_plist(Package *pkg, FILE *fp)
        }
        cmd = plist_cmd(pline + 1, &cp);
        if (cmd == FAIL) {
-           cleanup(0);
-           errx(2, "%s: bad command '%s'", __func__, pline);
+           warnx("%s: unknown command '%s' (package tools out of date?)",
+               __func__, pline);
+           goto bottom;
        }
        if (*cp == '\0') {
            cp = NULL;
@@ -431,7 +432,7 @@ delete_package(Boolean ign_err, Boolean nukedirs, Package *pkg)
            break;
 
        case PLIST_UNEXEC:
-           format_cmd(tmp, p->name, Where, last_file);
+           format_cmd(tmp, FILENAME_MAX, p->name, Where, last_file);
            if (Verbose)
                printf("Execute '%s'\n", tmp);
            if (!Fake && system(tmp)) {
index 12c54bb..dccd1fa 100644 (file)
@@ -16,8 +16,8 @@
  *
  * Miscellaneous string utilities.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/str.c,v 1.6.2.6 2003/06/09 17:02:31 lioux Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/str.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/str.c,v 1.15 2003/05/26 17:12:22 lioux Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/str.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -41,7 +41,7 @@ get_dash_string(char **str)
     char *s = *str;
 
     if (*s == '-')
-       *str = copy_string_plus_newline(s + 1);
+       *str = copy_string_adds_newline(s + 1);
     else
        *str = fileGetContents(s);
     return *str;
@@ -56,7 +56,7 @@ copy_string(const char *str)
 
 /* Rather Obvious but adds a trailing \n newline */
 char *
-copy_string_plus_newline(const char *str)
+copy_string_adds_newline(const char *str)
 {
     if (str == NULL) {
        return (NULL);
diff --git a/usr.sbin/pkg_install/lib/url.c b/usr.sbin/pkg_install/lib/url.c
new file mode 100644 (file)
index 0000000..b449302
--- /dev/null
@@ -0,0 +1,153 @@
+/*
+ * FreeBSD install - a package for the installation and maintainance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Jordan K. Hubbard
+ * 18 July 1993
+ *
+ * URL file access utilities.
+ *
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/url.c,v 1.4 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/url.c,v 1.1 2004/07/30 04:46:13 dillon Exp $
+ */
+
+#include "lib.h"
+#include <err.h>
+#include <fetch.h>
+#include <sys/wait.h>
+
+/*
+ * Try and fetch a file by URL, returning the directory name for where
+ * it's unpacked, if successful.
+ */
+char *
+fileGetURL(const char *base, const char *spec)
+{
+    char *cp, *rp;
+    char fname[FILENAME_MAX];
+    char pen[FILENAME_MAX];
+    char buf[8192];
+    FILE *ftp;
+    pid_t tpid;
+    int pfd[2], pstat, r, w = 0;
+    char *hint;
+    int fd;
+
+    rp = NULL;
+    /* Special tip that sysinstall left for us */
+    hint = getenv("PKG_ADD_BASE");
+    if (!isURL(spec)) {
+       if (!base && !hint)
+           return NULL;
+       /*
+        * We've been given an existing URL (that's known-good) and now we need
+        * to construct a composite one out of that and the basename we were
+        * handed as a dependency.
+        */
+       if (base) {
+           strcpy(fname, base);
+           /*
+            * Advance back two slashes to get to the root of the package
+            * hierarchy
+            */
+           cp = strrchr(fname, '/');
+           if (cp) {
+               *cp = '\0';     /* chop name */
+               cp = strrchr(fname, '/');
+           }
+           if (cp) {
+               *(cp + 1) = '\0';
+               strcat(cp, "All/");
+               strcat(cp, spec);
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+               strcat(cp, ".tbz");
+#else
+               strcat(cp, ".tgz");
+#endif
+           }
+           else
+               return NULL;
+       }
+       else {
+           /*
+            * Otherwise, we've been given an environment variable hinting
+            * at the right location from sysinstall
+            */
+           strcpy(fname, hint);
+           strcat(fname, spec);
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+           strcat(fname, ".tbz");
+#else
+           strcat(fname, ".tgz");
+#endif
+       }
+    }
+    else
+       strcpy(fname, spec);
+
+    if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) {
+       printf("Error: FTP Unable to get %s: %s\n",
+              fname, fetchLastErrString);
+       return NULL;
+    }
+
+    if (isatty(0) || Verbose)
+       printf("Fetching %s...", fname), fflush(stdout);
+    pen[0] = '\0';
+    if ((rp = make_playpen(pen, 0)) == NULL) {
+       printf("Error: Unable to construct a new playpen for FTP!\n");
+       fclose(ftp);
+       return NULL;
+    }
+    if (pipe(pfd) == -1) {
+       warn("pipe()");
+       cleanup(0);
+       exit(2);
+    }
+    if ((tpid = fork()) == -1) {
+       warn("pipe()");
+       cleanup(0);
+       exit(2);
+    }
+    if (!tpid) {
+       dup2(pfd[0], 0);
+       for (fd = getdtablesize() - 1; fd >= 3; --fd)
+           close(fd);
+       execl("/usr/bin/tar", "tar",
+#if defined(__FreeBSD_version) && __FreeBSD_version >= 500039
+           Verbose ? "-xjvf" : "-xjf",
+#else
+           Verbose ? "-xzvf" : "-xzf",
+#endif
+           "-", (char *)0);
+       _exit(2);
+    }
+    close(pfd[0]);
+    for (;;) {
+       if ((r = fread(buf, 1, sizeof buf, ftp)) < 1)
+           break;
+       if ((w = write(pfd[1], buf, r)) != r)
+           break;
+    }
+    if (ferror(ftp))
+       warn("warning: error reading from server");
+    fclose(ftp);
+    close(pfd[1]);
+    if (w == -1)
+       warn("warning: error writing to tar");
+    tpid = waitpid(tpid, &pstat, 0);
+    if (Verbose)
+       printf("tar command returns %d status\n", WEXITSTATUS(pstat));
+    if (rp && (isatty(0) || Verbose))
+       printf(" Done.\n");
+    return rp;
+}
index c8b2ece..694e65e 100644 (file)
@@ -14,8 +14,8 @@
  * Maxim Sobolev
  * 31 July 2001
  *
- * $FreeBSD: src/usr.sbin/pkg_install/lib/version.c,v 1.1.2.3 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/version.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/lib/version.c,v 1.5 2004/06/29 18:52:12 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/lib/Attic/version.c,v 1.3 2004/07/30 04:46:13 dillon Exp $
  */
 
 #include "lib.h"
@@ -45,3 +45,283 @@ verscmp(Package *pkg, int major, int minor)
 
     return rval;
 }
+
+/*
+ * split_version(pkgname, endname, epoch, revision) returns a pointer to
+ * the version portion of a package name and the two special components.
+ *
+ * Syntax is:  ${PORTNAME}-${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
+ *
+ * Written by Oliver Eikemeier
+ * Based on work of Jeremy D. Lea.
+ */
+static const char *
+split_version(const char *pkgname, const char **endname, unsigned long *epoch, unsigned long *revision)
+{
+    char *ch;
+    const char *versionstr;
+    const char *endversionstr;
+
+    if (pkgname == NULL)
+       errx(2, "%s: Passed NULL pkgname.", __func__);
+
+    /* Look for the last '-' the the pkgname */
+    ch = strrchr(pkgname, '-');
+    /* Cheat if we are just passed a version, not a valid package name */
+    versionstr = ch ? ch + 1 : pkgname;
+
+    /* Look for the last '_' in the version string, advancing the end pointer */
+    ch = strrchr(versionstr, '_');
+    if (revision != NULL) {
+       *revision = ch ? strtoul(ch + 1, NULL, 10) : 0;
+    }
+    endversionstr = ch;
+
+    /* Look for the last ',' in the remaining version string */
+    ch = strrchr(endversionstr ? endversionstr + 1 : versionstr, ',');
+    if (epoch != NULL) {
+       *epoch = ch ? strtoul(ch + 1, NULL, 10) : 0;
+    }
+    if (ch && !endversionstr)
+       endversionstr = ch;
+
+    /* set the pointer behind the last character of the version without revision or epoch */
+    if (endname)
+       *endname = endversionstr ? endversionstr : strrchr(versionstr, '\0');
+
+    return versionstr;
+}
+
+/*
+ * PORTVERSIONs are composed of components separated by dots. A component
+ * consists of a version number, a letter and a patchlevel number. This does
+ * not conform to the porter's handbook, but let us formulate rules that
+ * fit the current practice and are far simpler than to make decisions
+ * based on the order of netters and lumbers. Besides, people use versions
+ * like 10b2 in the ports...
+ */
+
+typedef struct {
+#ifdef __LONG_LONG_SUPPORTED
+    long long n;
+    long long pl;
+#else
+    long n;
+    long pl;
+#endif
+    int a;
+} version_component;
+
+/*
+ * get_component(position, component) gets the value of the next component
+ * (number - letter - number triple) and returns a pointer to the next character
+ * after any leading separators
+ *
+ * - components are separated by dots
+ * - characters !~ [a-zA-Z0-9.+*] are treated as separators
+ *   (1.0:2003.09.16 = 1.0.2003.09.16), this may not be what you expect:
+ *   1.0.1:2003.09.16 < 1.0:2003.09.16
+ * - consecutive separators are collapsed (10..1 = 10.1)
+ * - missing separators are inserted, essentially
+ *   letter number letter => letter number . letter (10a1b2 = 10a1.b2)
+ * - missing components are assumed to be equal to 0 (10 = 10.0 = 10.0.0)
+ * - the letter sort order is: [none], a, b, ..., z; numbers without letters
+ *   sort first (10 < 10a < 10b)
+ * - missing version numbers (in components starting with a letter) sort as -1
+ *   (a < 0, 10.a < 10)
+ * - a separator is inserted before the special strings "pl", "alpha", "beta", 
+ *   "pre" and "rc".
+ * - "pl" sorts before every other letter, "alpha", "beta", "pre" and "rc"
+ *   sort as a, b, p and r. (10alpha = 10.a < 10, but 10 < 10a; pl11 < alpha3
+ *   < 0.1beta2 = 0.1.b2 < 0.1)
+ * - other strings use only the first letter for sorting, case is ignored
+ *   (1.d2 = 1.dev2 = 1.Development2)
+ * - The special component `*' is guaranteed to be the smallest possible
+ *   component (2.* < 2pl1 < 2alpha3 < 2.9f7 < 3.*)
+ * - components separated by `+' are handled by version_cmp below
+ *
+ * Oliver Eikemeier
+ */
+
+static const struct {
+    const char *name;
+    size_t namelen;
+    int value;
+} stage[] = {
+    { "pl",    2,  0        },
+    { "alpha", 5, 'a'-'a'+1 },
+    { "beta",  4, 'b'-'a'+1 },
+    { "pre",   3, 'p'-'a'+1 },
+    { "rc",    2, 'r'-'a'+1 },
+    { NULL,    0,  -1       }
+};
+
+static const char *
+get_component(const char *position, version_component *component)
+{
+    const char *pos = position;
+    int hasstage = 0, haspatchlevel = 0;
+
+    if (!pos)
+       errx(2, "%s: Passed NULL position.", __func__);
+
+    /* handle version number */
+    if (isdigit(*pos)) {
+       char *endptr;
+#ifdef __LONG_LONG_SUPPORTED
+       component->n = strtoll(pos, &endptr, 10);
+#else
+       component->n = strtol(pos, &endptr, 10);
+#endif
+       /* should we test for errno == ERANGE? */
+       pos = endptr;
+    } else if (*pos == '*') {
+       component->n = -2;
+       do {
+           pos++;
+       } while(*pos && *pos != '+');
+    } else {
+       component->n = -1;
+       hasstage = 1;
+    }
+
+    /* handle letter */
+    if (isalpha(*pos)) {
+       int c = tolower(*pos);
+       haspatchlevel = 1;
+       /* handle special suffixes */
+       if (isalpha(pos[1])) {
+           int i;
+           for (i = 0; stage[i].name; i++) {
+               if (strncasecmp(pos, stage[i].name, stage[i].namelen) == 0
+                    && !isalpha(pos[stage[i].namelen])) {
+                   if (hasstage) {
+                       /* stage to value */
+                       component->a = stage[i].value;
+                       pos += stage[i].namelen;
+                   } else {
+                       /* insert dot */
+                       component->a = 0;
+                       haspatchlevel = 0;
+                   }
+                   c = 0;
+                   break;
+               }
+           }
+       }
+       /* unhandled above */
+       if (c) {
+           /* use the first letter and skip following */
+           component->a = c - 'a' + 1;
+           do {
+               ++pos;
+           } while (isalpha(*pos));
+       }
+    } else {
+       component->a = 0;
+       haspatchlevel = 0;
+    }
+
+    if (haspatchlevel) {
+       /* handle patch number */
+       if (isdigit(*pos)) {
+           char *endptr;
+#ifdef __LONG_LONG_SUPPORTED
+           component->pl = strtoll(pos, &endptr, 10);
+#else
+           component->pl = strtol(pos, &endptr, 10);
+#endif
+           /* should we test for errno == ERANGE? */
+           pos = endptr;
+       } else {
+           component->pl = -1;
+       }
+    } else {
+       component->pl = 0;
+    }
+
+    /* skip trailing separators */
+    while (*pos && !isdigit(*pos) && !isalpha(*pos) && *pos != '+' && *pos != '*') {
+       pos++;
+    }
+
+    return pos;
+}
+
+/*
+ * version_cmp(pkg1, pkg2) returns -1, 0 or 1 depending on if the version
+ * components of pkg1 is less than, equal to or greater than pkg2. No
+ * comparison of the basenames is done.
+ *
+ * The port version is defined by:
+ * ${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
+ * ${PORTEPOCH} supersedes ${PORTVERSION} supersedes ${PORTREVISION}.
+ * See the commit log for revision 1.349 of ports/Mk/bsd.port.mk
+ * for more information.
+ *
+ * The epoch and revision are defined to be a single number, while the rest
+ * of the version should conform to the porting guidelines. It can contain
+ * multiple components, separated by a period, including letters.
+ *
+ * The tests allow for significantly more latitude in the version numbers
+ * than is allowed in the guidelines. No point in enforcing them here.
+ * That's what portlint is for.
+ *
+ * Jeremy D. Lea.
+ * reimplemented by Oliver Eikemeier
+ */
+int
+version_cmp(const char *pkg1, const char *pkg2)
+{
+    const char *v1, *v2, *ve1, *ve2;
+    unsigned long e1, e2, r1, r2;
+    int result = 0;
+
+    v1 = split_version(pkg1, &ve1, &e1, &r1);
+    v2 = split_version(pkg2, &ve2, &e2, &r2);
+
+    /* Check epoch, port version, and port revision, in that order. */
+    if (e1 != e2) {
+       result = (e1 < e2 ? -1 : 1);
+    }
+
+    /* Shortcut check for equality before invoking the parsing routines. */
+    if (result == 0 && (ve1 - v1 != ve2 - v2 || strncasecmp(v1, v2, ve1 - v1) != 0)) {
+       /* Loop over different components (the parts separated by dots).
+        * If any component differs, we have the basis for an inequality. */
+       while(result == 0 && (v1 < ve1 || v2 < ve2)) {
+           int block_v1 = 0;
+           int block_v2 = 0;
+           version_component vc1 = {0, 0, 0};
+           version_component vc2 = {0, 0, 0};
+           if (v1 < ve1 && *v1 != '+') {
+               v1 = get_component(v1, &vc1);
+           } else {
+               block_v1 = 1;
+           }
+           if (v2 < ve2 && *v2 != '+') {
+               v2 = get_component(v2, &vc2);
+           } else {
+               block_v2 = 1;
+           }
+           if (block_v1 && block_v2) {
+               if (v1 < ve1)
+                   v1++;
+               if (v2 < ve2)
+                   v2++;
+           } else if (vc1.n != vc2.n) {
+               result = (vc1.n < vc2.n ? -1 : 1);
+           } else if (vc1.a != vc2.a) {
+               result = (vc1.a < vc2.a ? -1 : 1);
+           } else if (vc1.pl != vc2.pl) {
+               result = (vc1.pl < vc2.pl ? -1 : 1);
+           }
+       }
+    }
+
+    /* Compare FreeBSD revision numbers. */
+    if (result == 0 && r1 != r2) {
+       result = (r1 < r2 ? -1 : 1);
+    }
+    return result;
+}
index 1e0546e..563406b 100644 (file)
@@ -1,16 +1,18 @@
-# $FreeBSD: src/usr.sbin/pkg_install/sign/Makefile,v 1.1.2.2 2001/07/19 06:08:21 kris Exp $
-# $DragonFly: src/usr.sbin/pkg_install/sign/Attic/Makefile,v 1.2 2003/06/17 04:29:59 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/sign/Makefile,v 1.8 2004/06/29 19:06:42 eik Exp $
 # $OpenBSD: Makefile.bsd-wrapper,v 1.2 1999/10/07 16:30:32 espie Exp $
+# $DragonFly: src/usr.sbin/pkg_install/sign/Attic/Makefile,v 1.3 2004/07/30 04:46:13 dillon Exp $
 
 PROG=  pkg_sign
+LINKS= ${BINDIR}/pkg_sign ${BINDIR}/pkg_check
+MLINKS=        pkg_sign.1 pkg_check.1
 SRCS=  main.c check.c common.c gzip.c pgp_check.c pgp_sign.c \
        sha1.c sign.c stand.c x509.c
 
-DPADD= ${LIBINSTALL} ${LIBCRYPTO}
-LDADD= ${LIBINSTALL} -lcrypto
+CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
 
-LINKS= ${BINDIR}/pkg_sign ${BINDIR}/pkg_check
-MLINKS=        pkg_sign.1 pkg_check.1
+DISTRIBUTION= crypto
+DPADD= ${LIBINSTALL} ${LIBMD} ${LIBCRYPTO}
+LDADD= ${LIBINSTALL} -lmd -lcrypto
 
 .include <bsd.prog.mk>
 
index 3a5ddab..b771764 100644 (file)
@@ -52,5 +52,5 @@ libraries on OpenBSD 2.7 and FreeBSD 5.0, your mileage may vary.
 --
 
        Wes Peters, Dec 2000
-       $FreeBSD: src/usr.sbin/pkg_install/sign/README,v 1.1.2.1 2001/03/05 03:43:53 wes Exp $
-       $DragonFly: src/usr.sbin/pkg_install/sign/Attic/README,v 1.2 2003/06/17 04:29:59 dillon Exp $
+       $FreeBSD: src/usr.sbin/pkg_install/sign/README,v 1.1 2001/02/06 06:46:42 wes Exp $
+       $DragonFly: src/usr.sbin/pkg_install/sign/Attic/README,v 1.3 2004/07/30 04:46:14 dillon Exp $
index b834097..dfe3975 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: check.c,v 1.2 1999/10/04 21:46:27 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
@@ -27,8 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/check.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/check.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: check.c,v 1.2 1999/10/04 21:46:27 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/check.c,v 1.2 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/check.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 /* Simple code for a stand-alone package checker */
index 3cca7df..7a46ef7 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: common.c,v 1.3 1999/10/07 16:30:32 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
@@ -27,8 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/common.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/common.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: common.c,v 1.3 1999/10/07 16:30:32 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/common.c,v 1.2 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/common.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
index d2ca2d5..0341e95 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/sign/extern.h,v 1.1.2.2 2001/05/17 12:33:39 sobomax Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/sign/Attic/extern.h,v 1.3 2003/11/03 19:31:39 eirikn Exp $ */
-/* $OpenBSD: extern.h,v 1.3 1999/10/07 16:30:32 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $OpenBSD: extern.h,v 1.3 1999/10/07 16:30:32 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/extern.h,v 1.2 2001/05/17 10:12:45 sobomax Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/extern.h,v 1.4 2004/07/30 04:46:14 dillon Exp $
  */
 
 /*
@@ -46,17 +47,17 @@ extern int quiet;
 extern char *userkey;
 
 /* common.c */
-extern int read_header_and_diagnose(FILE *file, \
+extern int read_header_and_diagnose (FILE *file, \
        /*@out@*/struct mygzip_header *h, /*@null@*/struct signature **sign, \
        const char *filename);
-extern int reap(pid_t pid);
+extern int reap (pid_t pid);
 
 /* sign.c */
-extern int sign(/*@observer@*/const char *filename, int type, \
+extern int sign (/*@observer@*/const char *filename, int type, \
        /*@null@*/const char *userid, char *envp[]);
 
 /* check.c */
-extern int check_signature(/*@dependent@*/FILE *file, \
+extern int check_signature (/*@dependent@*/FILE *file, \
        /*@null@*/const char *userid, char *envp[], \
        /*@observer@*/const char *filename);
 
@@ -73,29 +74,29 @@ typedef /*@observer@*/char *pchar;
 /* sha1.c */
 #define SHA1_DB_NAME   "/var/db/pkg/SHA1"
 
-extern void *new_sha1_checker(struct mygzip_header *h, \
+extern void *new_sha1_checker (struct mygzip_header *h, \
        struct signature *sign, const char *userid, char *envp[], \
        const char *filename);
 
-extern void sha1_add(void *arg, const char *buffer, \
+extern void sha1_add (void *arg, const char *buffer, \
        size_t length);
 
-extern int sha1_sign_ok(void *arg);
+extern int sha1_sign_ok (void *arg);
 
-extern int retrieve_sha1_marker(const char *filename, \
+extern int retrieve_sha1_marker (const char *filename, \
        struct signature **sign, const char *userid);
 
 /* x509.c */
 #define X509_DB_NAME   "/var/db/pkg/X509"
 
-extern void *new_x509_checker(struct mygzip_header *h, \
+extern void *new_x509_checker (struct mygzip_header *h, \
        struct signature *sign, const char *userid, char *envp[], \
        const char *filename);
 
-extern void x509_add(void *arg, const char *buffer, \
+extern void x509_add (void *arg, const char *buffer, \
        size_t length);
 
-extern int x509_sign_ok(void *arg);
+extern int x509_sign_ok (void *arg);
 
-extern int retrieve_x509_marker(const char *filename, \
+extern int retrieve_x509_marker (const char *filename, \
        struct signature **sign, const char *userid);
index 394bba3..0a38a68 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: gzip.c,v 1.3 1999/10/04 21:46:28 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
@@ -27,8 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/gzip.c,v 1.1.2.3 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/gzip.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: gzip.c,v 1.3 1999/10/04 21:46:28 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/gzip.c,v 1.3 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/gzip.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
index 488943c..2a9ccb7 100644 (file)
@@ -1,6 +1,3 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/sign/gzip.h,v 1.1.2.2 2001/05/17 12:33:39 sobomax Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/sign/Attic/gzip.h,v 1.3 2003/11/03 19:31:39 eirikn Exp $ */
-/* $OpenBSD: gzip.h,v 1.2 1999/10/04 21:46:28 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $OpenBSD: gzip.h,v 1.2 1999/10/04 21:46:28 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/gzip.h,v 1.2 2001/05/17 10:12:45 sobomax Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/gzip.h,v 1.4 2004/07/30 04:46:14 dillon Exp $
  */
 
 #define GZIP_MAGIC0    '\037'
@@ -69,21 +70,21 @@ struct signature {
 #define GZIP_SIGNED            1       /* gzip file, signature parsed ok */
 #define GZIP_NOT_GZIP          2       /* not a proper gzip file */
 #define GZIP_NOT_PGPSIGNED     3       /* gzip file, unknown extension */
-extern int gzip_read_header(FILE *f, /*@out@*/struct mygzip_header *h, \
+extern int gzip_read_header (FILE *f, /*@out@*/struct mygzip_header *h, \
        /*@null@*/struct signature **sign);
 /* gzip_write_header returns 1 for success */
-extern int gzip_write_header(FILE *f, const struct mygzip_header *h, \
+extern int gzip_write_header (FILE *f, const struct mygzip_header *h, \
        /*@null@*/struct signature *sign);
 /*
  * Writing header to memory. Returns size needed, or 0 if buffer too small
  * buffer must be at least 14 characters
  */
-extern int gzip_copy_header(const struct mygzip_header *h, \
+extern int gzip_copy_header (const struct mygzip_header *h, \
        /*@null@*/struct signature *sign, \
        void (*add)(void *, const char *, size_t), void *data);
 
-extern void free_signature(/*@null@*/struct signature *sign);
-extern void sign_fill_tag(struct signature *sign);
+extern void free_signature (/*@null@*/struct signature *sign);
+extern void sign_fill_tag (struct signature *sign);
 #define KNOWN_TAGS 4
 #define TAG_PGP 0
 #define TAG_SHA1 1
index 0e3aa76..5aba94f 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: main.c,v 1.2 1999/10/04 21:46:28 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
@@ -27,8 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/main.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/main.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: main.c,v 1.2 1999/10/04 21:46:28 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/main.c,v 1.2 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/main.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
index 4632869..0cda100 100644 (file)
@@ -1,6 +1,8 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/sign/pgp.h,v 1.1.2.1 2001/03/05 03:43:53 wes Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp.h,v 1.3 2003/11/03 19:31:39 eirikn Exp $ */
-/* $OpenBSD: pgp.h,v 1.2 1999/10/04 21:46:28 espie Exp $ */
+/*
+ * $OpenBSD: pgp.h,v 1.2 1999/10/04 21:46:28 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/pgp.h,v 1.1 2001/02/06 06:46:42 wes Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp.h,v 1.4 2004/07/30 04:46:14 dillon Exp $
+ */
 /* Estimate size of pgp signature */
 #define MAXPGPSIGNSIZE 1024
 
 struct mygzip_header;
 struct signature;
 
-extern void *new_pgp_checker(struct mygzip_header *h, \
+extern void *new_pgp_checker (struct mygzip_header *h, \
        struct signature *sign, const char *userid, char *envp[], \
        const char *filename);
 
-extern void pgp_add(void *arg, const char *buffer, \
+extern void pgp_add (void *arg, const char *buffer, \
        size_t length);
 
-extern int pgp_sign_ok(void *arg);
+extern int pgp_sign_ok (void *arg);
 
-extern void handle_pgp_passphrase(void);
+extern void handle_pgp_passphrase (void);
 
-extern int retrieve_pgp_signature(const char *filename, \
+extern int retrieve_pgp_signature (const char *filename, \
 struct signature **sign, const char *userid, char *envp[]);
index 8d6c74e..59ac1c7 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: pgp_check.c,v 1.2 1999/10/07 16:30:32 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
@@ -27,8 +26,9 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/pgp_check.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp_check.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: pgp_check.c,v 1.2 1999/10/07 16:30:32 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/pgp_check.c,v 1.2 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp_check.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <stdio.h>
index 5c2519a..e050398 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: pgp_sign.c,v 1.1 1999/10/04 21:46:29 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/pgp_sign.c,v 1.1.2.3 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp_sign.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: pgp_sign.c,v 1.1 1999/10/04 21:46:29 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/pgp_sign.c,v 1.5 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pgp_sign.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <errno.h>
index 98ed0d5..130221c 100644 (file)
@@ -1,6 +1,6 @@
-.\" $FreeBSD: src/usr.sbin/pkg_install/sign/pkg_sign.1,v 1.1.2.5 2002/06/21 16:42:20 charnier Exp $
-.\" $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pkg_sign.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
+.\" $FreeBSD: src/usr.sbin/pkg_install/sign/pkg_sign.1,v 1.7 2004/07/02 23:12:53 ru Exp $
 .\" $OpenBSD: pkg_sign.1,v 1.6 2000/04/15 02:15:20 aaron Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/sign/Attic/pkg_sign.1,v 1.3 2004/07/30 04:46:14 dillon Exp $
 .\"
 .\" Copyright (c) 1999 Marc Espie.
 .\"
@@ -104,7 +104,8 @@ For
 the signing key or verification certificate may be
 specified with the
 .Fl k
-option.  If not specified, packages are signed or verified with the
+option.
+If not specified, packages are signed or verified with the
 default keys and certificates documented below.
 .Pp
 If
@@ -156,8 +157,9 @@ The gzip file uses a very early version of package signing that was
 substantially slower.
 .El
 .Sh BUGS
+The
 .Xr pgp 1
-is an ill-designed program, which is hard to interface with.
+utility is an ill-designed program, which is hard to interface with.
 For instance, the `separate signing scheme' it pretends to offer is
 useless, as it can't be used with pipes, so that
 .Nm pgp_sign
index 2f5fb81..c104c0a 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: sha1.c,v 1.1 1999/10/04 21:46:29 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/sha1.c,v 1.1.2.3 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/sha1.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: sha1.c,v 1.1 1999/10/04 21:46:29 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/sha1.c,v 1.5 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/sha1.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <stdlib.h>
+#include <string.h>
 #include <stdio.h>
 #include <assert.h>
-#include <openssl/sha.h>
+#include <sha.h>
 #include "stand.h"
 #include "gzip.h"
 #include "extern.h"
@@ -66,9 +67,9 @@ sha1_build_checksum(result, n)
 {
        size_t length;
 
-       sprintf(result, "SHA1 (%s) = ", n->id);
+       snprintf(result, BUFSIZE-2*SHA_DIGEST_LENGTH-1, SHA1_TEMPLATE, n->id);
        length = strlen(result);
-       SHA1_Final(result + length, &n->context);
+       SHA1_End(&n->context, result + length);
        strcat(result, "\n");
        free(n);        
        return length;
@@ -167,9 +168,8 @@ retrieve_sha1_marker(filename, sign, userid)
        FILE *f;
        char buffer[1024];
        char result[BUFSIZE];
-       ssize_t length;
+       ssize_t length = -1;
        struct sha1_checker *checker;
-       struct signature *old;
 
        *sign = NULL;
        if (userid == NULL)
@@ -181,8 +181,13 @@ retrieve_sha1_marker(filename, sign, userid)
        n = malloc(sizeof *n);
        if (n == NULL) 
                return 0;
-       n->data = (char *)userid;
-       n->length = strlen(n->data)+1;
+       n->length = strlen(userid)+1;
+       n->data = malloc(n->length);
+       if (n->data == NULL) {
+               free(n);
+               return 0;
+       }
+       memcpy(n->data, userid, n->length);
        n->type = TAG_SHA1;
        memcpy(n->tag, sha1tag, sizeof sha1tag);
        sign_fill_tag(n);
@@ -208,8 +213,9 @@ retrieve_sha1_marker(filename, sign, userid)
         * Calculate the SHA1 of the remaining data and write it to stderr.
         */
        checker = new_sha1_checker(&h, *sign, NULL, NULL, filename);
-       while ((length = fread(buffer, 1, sizeof buffer, f)) > 0)
-               sha1_add(checker, buffer, length);
+       if (checker) 
+               while ((length = fread(buffer, 1, sizeof buffer, f)) > 0)
+                       sha1_add(checker, buffer, length);
        if (fclose(f) != 0 || length == -1) {
                warn("Problem checksumming %s", filename);
                *sign = n->next;
index 07b3c65..9cc1cf3 100644 (file)
@@ -1,4 +1,3 @@
-/* $OpenBSD: sign.c,v 1.3 1999/10/04 21:46:29 espie Exp $ */
 /*-
  * Copyright (c) 1999 Marc Espie.
  *
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/sign.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/sign.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $OpenBSD: sign.c,v 1.3 1999/10/04 21:46:29 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/sign.c,v 1.4 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/sign.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <stdio.h>
 #include <errno.h>
@@ -104,6 +105,7 @@ sign(filename, type, userid, envp)
        struct signature *sign;
        int success;
 
+       sign = NULL;
        switch(type) {
        case TAG_PGP:
                success = retrieve_pgp_signature(filename, &sign, userid, envp);
index aa83190..d248cce 100644 (file)
@@ -1,6 +1,6 @@
 /*
- * $FreeBSD: src/usr.sbin/pkg_install/sign/stand.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/stand.c,v 1.2 2003/06/17 04:29:59 dillon Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/stand.c,v 1.2 2002/04/01 09:39:07 obrien Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/stand.c,v 1.3 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include "stand.h"
index 3a8f509..139e340 100644 (file)
@@ -1,6 +1,8 @@
-/* $FreeBSD: src/usr.sbin/pkg_install/sign/stand.h,v 1.1.2.1 2001/03/05 03:43:53 wes Exp $ */
-/* $DragonFly: src/usr.sbin/pkg_install/sign/Attic/stand.h,v 1.4 2003/11/06 19:46:42 eirikn Exp $ */
-/* $OpenBSD: stand.h,v 1.2 1999/10/04 21:46:30 espie Exp $ */
+/*
+ * $OpenBSD: stand.h,v 1.2 1999/10/04 21:46:30 espie Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/stand.h,v 1.2 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/stand.h,v 1.5 2004/07/30 04:46:14 dillon Exp $
+ */
 
 /* provided to cater for BSD idiosyncrasies */
 
 #if defined(BSD4_4)
 #include <err.h>
 #else
-extern void set_program_name(const char * name);
-extern void warn(const char *fmt, ...);
-extern void warnx(const char *fmt, ...);
+extern void warn (const char *fmt, ...);
+extern void warnx (const char *fmt, ...);
 #endif
+extern void set_program_name (const char * name);
 
 #ifndef __GNUC__
 #define __attribute__(x)
index 02a16d5..49924e2 100644 (file)
@@ -23,8 +23,8 @@
  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
- * $FreeBSD: src/usr.sbin/pkg_install/sign/x509.c,v 1.1.2.2 2002/08/20 06:35:08 obrien Exp $
- * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/x509.c,v 1.3 2004/06/19 20:38:22 joerg Exp $
+ * $FreeBSD: src/usr.sbin/pkg_install/sign/x509.c,v 1.4 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/sign/Attic/x509.c,v 1.4 2004/07/30 04:46:14 dillon Exp $
  */
 
 #include <sys/types.h>
@@ -89,7 +89,6 @@ new_x509_checker(h, sign, userid, envp, filename)
        FILE * fp;
        struct x509_checker * me;
        char certfile[PATH_MAX + 1] = CERTFILE;
-       char * cp;
        X509 * x509;
 
        assert(sign->type == TAG_X509);
@@ -139,7 +138,7 @@ new_x509_checker(h, sign, userid, envp, filename)
        if (verbose)
            printf("Loading certificates from %s:\n", certfile);
 
-       while (x509 = PEM_read_X509(fp, NULL, NULL, 0)) {
+       while ((x509 = PEM_read_X509(fp, NULL, NULL, 0)))       {
            sk_X509_push(me->certs, x509);
 
            switch (EVP_PKEY_type(X509_get_pubkey(x509)->type))
@@ -283,11 +282,10 @@ retrieve_x509_marker(filename, sign, userid)
        int sig_len = 4096;
        unsigned char * sig_buf;
        EVP_MD_CTX md_ctx;
-       EVP_MD * md_type;
+       const EVP_MD * md_type;
        EVP_PKEY * pkey;
 
        char keyfile[PATH_MAX + 1] = KEYFILE;
-       char * kp;
 
        key_from_name(keyfile, userkey);
 
index 6fc171a..60bae83 100644 (file)
@@ -1,6 +1,6 @@
 #!/usr/local/bin/wish -f
 #$FreeBSD: src/usr.sbin/pkg_install/tkpkg,v 1.7 1999/08/29 15:54:49 peter Exp $
-#$DragonFly: src/usr.sbin/pkg_install/Attic/tkpkg,v 1.2 2003/06/17 04:29:59 dillon Exp $
+#$DragonFly: src/usr.sbin/pkg_install/Attic/tkpkg,v 1.3 2004/07/30 04:46:11 dillon Exp $
 #
 #$Log: tkpkg,v $
 #Revision 1.2  1994/12/06 00:51:21  jkh
diff --git a/usr.sbin/pkg_install/update/Makefile b/usr.sbin/pkg_install/update/Makefile
deleted file mode 100644 (file)
index 2f97b13..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-# $FreeBSD: src/usr.sbin/pkg_install/update/Makefile,v 1.1.2.2 2001/04/25 14:05:02 ru Exp $
-# $DragonFly: src/usr.sbin/pkg_install/update/Attic/Makefile,v 1.2 2003/06/17 04:29:59 dillon Exp $
-
-SCRIPTS=       pkg_update.pl
-MAN=           pkg_update.1
-
-.include <bsd.prog.mk>
diff --git a/usr.sbin/pkg_install/update/pkg_update.1 b/usr.sbin/pkg_install/update/pkg_update.1
deleted file mode 100644 (file)
index f98064a..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-.\"
-.\" Copyright 2000 Paul Richards
-.\"
-.\" All rights reserved.
-.\"
-.\" Redistribution and use in source and binary forms, with or without
-.\" modification, are permitted provided that the following conditions
-.\" are met:
-.\" 1. Redistributions of source code must retain the above copyright
-.\"    notice, this list of conditions and the following disclaimer.
-.\" 2. Redistributions in binary form must reproduce the above copyright
-.\"    notice, this list of conditions and the following disclaimer in the
-.\"    documentation and/or other materials provided with the distribution.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
-.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-.\" IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-.\"
-.\"    $FreeBSD: src/usr.sbin/pkg_install/update/pkg_update.1,v 1.3.2.1 2001/08/16 15:56:16 ru Exp $
-.\"    $DragonFly: src/usr.sbin/pkg_install/update/Attic/pkg_update.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
-.Dd December 27, 2000
-.Dt PKG_UPDATE 1
-.Os
-.Sh NAME
-.Nm pkg_update
-.Nd update an installed package
-.Sh SYNOPSIS
-.Nm
-.Op Fl nv
-.Op Fl r Ar oldpkg
-.Ar newpkg.tgz
-.Sh DESCRIPTION
-The
-.Nm
-command is used to update an already installed package.
-It takes care
-of propagating dependencies from the replaced versions to the newly
-installed version.
-It would normally be used to replace all currently
-installed versions of a package with a more current version.
-It can
-also be used to revert a package to an older version by specifying the
-version to be replaced with the
-.Fl r
-option.
-.Pp
-The following options are available:
-.Bl -tag -width indent
-.It Fl n
-Print the actions to be performed but don't actually do them.
-.It Fl r Ar oldpkg
-Replace the specified version of the package.
-Normally
-.Nm
-will replace all installed versions of a package with the new version.
-This isn't always desirable since for some packages it is expected
-that multiple versions will be installed at the same time.
-This option allows a specific version to be replaced.
-.It Fl v
-Enable verbose output.
-.El
-.Sh SEE ALSO
-.Xr pkg_add 1 ,
-.Xr pkg_create 1 ,
-.Xr pkg_delete 1 ,
-.Xr pkg_info 1 ,
-.Xr pkg_version 1
-.Sh AUTHORS
-.An Paul Richards Aq paul@FreeBSD.org
-.Sh BUGS
-None known of as yet.
diff --git a/usr.sbin/pkg_install/update/pkg_update.pl b/usr.sbin/pkg_install/update/pkg_update.pl
deleted file mode 100644 (file)
index 30a96b3..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
-#!/usr/bin/perl -w
-
-# Copyright (c) 2000
-#  Paul Richards. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer,
-#    verbatim and that no modifications are made prior to this
-#    point in the file.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY PAUL RICHARDS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED.  IN NO EVENT SHALL PAUL RICHARDS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# $FreeBSD: src/usr.sbin/pkg_install/update/pkg_update.pl,v 1.4.2.1 2001/03/16 04:36:01 paul Exp $
-# $DragonFly: src/usr.sbin/pkg_install/update/Attic/pkg_update.pl,v 1.2 2003/06/17 04:29:59 dillon Exp $
-#/
-
-use strict;
-
-use File::Basename;
-use Getopt::Std;
-
-my $PKG_DB = "/var/db/pkg";
-my $PKG_DEP_FILE = "+REQUIRED_BY";
-
-my $PKG_ADD = "/usr/sbin/pkg_add";
-my $PKG_CREATE = "/usr/sbin/pkg_create";
-my $PKG_DELETE = "/usr/sbin/pkg_delete -f";
-my $PKG_INFO = "/usr/sbin/pkg_info -Ia";
-
-sub error ($) {
-       my ($error) = @_;
-
-       print STDERR $error, "\n";
-}
-
-sub get_version($) {
-       my ($pkg) = @_;
-
-       $pkg =~ /(.+)-([0-9\.]+)/;
-       if (! $2) {
-               return($pkg, "");
-       } else {
-               return ($1, $2);
-       }
-}
-
-sub get_requires($$) {
-       my ($pkg, $requires) = @_;
-
-       my $file = "$PKG_DB/$pkg/$PKG_DEP_FILE";
-
-       if (! -f $file) {
-               # Not all packages have dependencies
-               return 1;
-       }
-
-       if (! open(REQUIRES, "< $file")) {
-               error("Can't open $file, $!");
-               return 0;
-       }
-
-       while (<REQUIRES>) {
-               chomp $_;
-               $$requires{$_} = 1;
-       }
-
-       close(REQUIRES) || warn("Can't close $file, $!");
-
-       return 1;
-}
-
-sub put_requires($$) {
-       my ($pkg, $requires) = @_;
-
-       my $file = "$PKG_DB/$pkg/$PKG_DEP_FILE";
-
-       if (! open(REQUIRES, "> $file")) {
-               error("Can't open $file, $!");
-               return 0;
-       }
-
-       my $req;
-       for $req (keys %$requires) {
-               print REQUIRES $req, "\n";
-       }
-
-       if (! close(REQUIRES)) {
-               error("Can't close $file, $!");
-               return 0;
-       }
-
-       return 1;
-}
-
-#
-# Start of main program
-#
-
-my @installed;
-my %requires;
-my $pkg = "";
-my $update_pkg = "";
-
-use vars qw($opt_a $opt_c $opt_v $opt_r $opt_n);
-getopts('acnvr:');
-
-if ($opt_a && $opt_c) {
-       die("Options 'a' and 'c' are mutually exclusive");
-}
-
-if ($opt_v) {
-       $PKG_DELETE .= " -v";
-       $PKG_ADD .= " -v";
-       $PKG_CREATE .= " -v";
-}
-
-if ($opt_n) {
-       $PKG_DELETE .= " -n";
-       $PKG_ADD .= " -n";
-}
-
-if (scalar @ARGV < 1) {
-       die("No package specified.\n");
-} elsif (scalar @ARGV > 1) {
-       die("Only one package may be updated at a time.\n");
-}
-
-my $pkgfile = $ARGV[0];
-if (! -f $pkgfile) {
-       die("Can't find package file $pkgfile\n");
-}
-
-my $newpkg = basename($pkgfile, '.tgz');
-my ($pkgname, $new_version) = get_version($newpkg);
-
-if ($opt_r && $opt_r ne "") {
-       my ($old_pkg, $old_version) = get_version($opt_r);
-       print "Updating $old_pkg package version ";
-       print "$old_version to $new_version\n";
-       $update_pkg = $opt_r;
-} else {
-       print "Updating $pkgname packages to version $new_version\n";
-       $update_pkg = $pkgname;
-}
-
-# Safety net to prevent all packages getting deleted
-if ($update_pkg eq "") {
-       die ("Package to update is empty, aborting\n");
-}
-
-# Find out what package versions are already installed
-
-open(PKGINFO, "$PKG_INFO|") || die("Can't run $PKG_INFO, $!");
-
-while (<PKGINFO>) {
-       my ($pkg) = /^(.*?)\s+.*/;
-
-       if ($pkg =~ /^$update_pkg-[0-9\.]+/) {
-               push(@installed, $pkg);
-       }
-}
-
-close(PKGINFO) || die("Couldn't close pipe from $PKG_INFO, $!");
-
-if (scalar @installed == 0) {
-       if (! $opt_r) {
-               die("There are no $pkgname packages installed.\n");
-       } else {
-               die("Package $opt_r is not installed.\n");
-       }
-}
-
-# For each installed package that matches get the dependencies
-my $old_pkg;
-for $old_pkg (@installed) {
-       if (! get_requires($old_pkg, \%requires)) {
-               die("Failed to get requires from $old_pkg\n");
-       }
-}
-
-# Now delete all currently installed packages
-for $old_pkg (@installed) {
-       if (! system("$PKG_DELETE $old_pkg")) {
-               print "Deleted $old_pkg\n" if ($opt_v);
-       } else {
-               error("Couldn't remove package $old_pkg, $!");
-       }
-}
-
-if (system("$PKG_ADD $pkgfile")) {
-       error("Command '$PKG_ADD $newpkg' failed, $!");
-       if (scalar keys %requires) {
-               print "The following packages depended on previously\n";
-               print "installed versions of $pkgname.\n";
-               print "You need to add them to the +REQUIRES file when you\n";
-               print "succeed in installing $newpkg.\n";
-               my $req;
-               for $req (keys %requires) {
-                       print $req, "\n";
-               }
-       }
-} else {
-       put_requires($pkgname . "-" . $new_version, \%requires);
-}
-
-exit;
index 1fd3dc3..30aa1b0 100644 (file)
@@ -1,8 +1,16 @@
-# $FreeBSD: src/usr.sbin/pkg_install/version/Makefile,v 1.5.2.5 2001/09/21 16:54:17 bmah Exp $
-# $DragonFly: src/usr.sbin/pkg_install/version/Attic/Makefile,v 1.2 2003/06/17 04:29:59 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/version/Makefile,v 1.14 2004/06/29 19:06:42 eik Exp $
+# $DragonFly: src/usr.sbin/pkg_install/version/Attic/Makefile,v 1.3 2004/07/30 04:46:14 dillon Exp $
 
-SCRIPTS=       pkg_version.pl
-MAN=           pkg_version.1
+PROG=  pkg_version
+SRCS=  main.c perform.c
+
+CFLAGS+= ${DEBUG} -I${.CURDIR}/../lib
+
+WARNS?=        6
+WFORMAT?=      1
+
+DPADD= ${LIBINSTALL} ${LIBFETCH} ${LIBMD}
+LDADD= ${LIBINSTALL} -lfetch -lmd
 
 test:
        ./test-pkg_version.sh
diff --git a/usr.sbin/pkg_install/version/main.c b/usr.sbin/pkg_install/version/main.c
new file mode 100644 (file)
index 0000000..df2f50f
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * FreeBSD install - a package for the installation and maintainance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Jeremy D. Lea.
+ * 11 May 2002
+ *
+ * This is the version module. Based on pkg_version.pl by Bruce A. Mah.
+ *
+ * $FreeBSD: src/usr.sbin/pkg_install/version/main.c,v 1.2 2004/06/29 18:54:47 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/version/Attic/main.c,v 1.1 2004/07/30 04:46:14 dillon Exp $
+ */
+
+#include "lib.h"
+#include "version.h"
+#include <err.h>
+
+static char Options[] = "dhl:L:s:XtTv";
+
+char   *LimitChars = NULL;
+char   *PreventChars = NULL;
+char   *MatchName = NULL;
+Boolean RegexExtended = FALSE;
+
+static void usage(void);
+
+int
+main(int argc, char **argv)
+{
+    int ch, cmp = 0;
+
+    if (argc == 4 && !strcmp(argv[1], "-t")) {
+       cmp = version_cmp(argv[2], argv[3]);
+       printf(cmp > 0 ? ">\n" : (cmp < 0 ? "<\n" : "=\n"));
+       exit(0);
+    }
+    else if (argc == 4 && !strcmp(argv[1], "-T")) {
+       cmp = version_match(argv[3], argv[2]);
+       exit(cmp == 1 ? 0 : 1);
+    }
+    else while ((ch = getopt(argc, argv, Options)) != -1) {
+       switch(ch) {
+       case 'v':
+           Verbose = TRUE;
+           break;
+
+       case 'l':
+           LimitChars = optarg;
+           break;
+
+       case 'L':
+           PreventChars = optarg;
+           break;
+
+       case 's':
+           MatchName = optarg;
+           break;
+
+       case 't':
+           errx(2, "Invalid -t usage.");
+           break;
+
+       case 'T':
+           errx(2, "Invalid -T usage.");
+           break;
+
+       case 'X':
+           RegexExtended = TRUE;
+           break;
+
+       case 'h':
+       case '?':
+       default:
+           usage();
+           break;
+       }
+    }
+
+    argc -= optind;
+    argv += optind;
+
+    return pkg_perform(argv);
+}
+
+static void
+usage()
+{
+    fprintf(stderr, "%s\n%s\n%s\n",
+       "usage: pkg_version [-hv] [-l limchar] [-L limchar] [[-X] -s string] index",
+       "       pkg_version -t v1 v2",
+       "       pkg_version -T name pattern");
+    exit(1);
+}
diff --git a/usr.sbin/pkg_install/version/perform.c b/usr.sbin/pkg_install/version/perform.c
new file mode 100644 (file)
index 0000000..b97f22d
--- /dev/null
@@ -0,0 +1,389 @@
+/*
+ * FreeBSD install - a package for the installation and maintainance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Jeremy D. Lea.
+ * 11 May 2002
+ *
+ * This is the version module. Based on pkg_version.pl by Bruce A. Mah.
+ *
+ * $FreeBSD: src/usr.sbin/pkg_install/version/perform.c,v 1.10 2004/06/29 19:06:42 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/version/Attic/perform.c,v 1.1 2004/07/30 04:46:14 dillon Exp $
+ */
+
+#include "lib.h"
+#include "version.h"
+#include <err.h>
+#include <fetch.h>
+#include <signal.h>
+
+FILE *IndexFile;
+struct index_head Index = SLIST_HEAD_INITIALIZER(Index);
+
+static int pkg_do(char *);
+static void show_version(const char *, const char *, const char *);
+
+/*
+ * This is the traditional pkg_perform, except that the argument is _not_
+ * a list of packages. It is the index file from the command line.
+ *
+ * We loop over the installed packages, matching them with the -s flag
+ * if needed and calling pkg_do(). Before hand we set up a few things,
+ * and after we tear them down...
+ */
+int
+pkg_perform(char **indexarg)
+{
+    char tmp[PATH_MAX], **pkgs, *pat[2], **patterns;
+    struct index_entry *ie;
+    int i, err_cnt = 0;
+    int MatchType;
+
+    /*
+     * Try to find and open the INDEX. We only check IndexFile != NULL
+     * later, if we actually need the INDEX.
+     */
+    if (*indexarg == NULL)
+       snprintf(tmp, PATH_MAX, "%s/%s", PORTS_DIR, INDEX_FNAME);
+    else
+       strlcpy(tmp, *indexarg, PATH_MAX);
+    if (isURL(tmp))
+       IndexFile = fetchGetURL(tmp, "");
+    else
+       IndexFile = fopen(tmp, "r");
+
+    /* Get either a list of matching or all packages */
+    if (MatchName != NULL) {
+       pat[0] = MatchName;
+       pat[1] = NULL;
+       MatchType = RegexExtended ? MATCH_EREGEX : MATCH_REGEX;
+       patterns = pat;
+    }
+    else {
+       MatchType = MATCH_ALL;
+       patterns = NULL;
+    }
+    pkgs = matchinstalled(MatchType, patterns, &err_cnt);
+
+    if (err_cnt != 0)
+       errx(2, "Unable to find package database directory!");
+    if (pkgs == NULL) {
+       switch (MatchType) {
+       case MATCH_ALL:
+           warnx("no packages installed");
+           return (0);
+       case MATCH_EREGEX:
+       case MATCH_REGEX:
+           warnx("no packages match pattern");
+           return (1);
+       default:
+           break;
+       }
+    }
+
+    for (i = 0; pkgs[i] != NULL; i++)
+       err_cnt += pkg_do(pkgs[i]);
+
+    /* If we opened the INDEX in pkg_do(), clean up. */
+    while (!SLIST_EMPTY(&Index)) {
+       ie = SLIST_FIRST(&Index);
+       SLIST_REMOVE_HEAD(&Index, next);
+       if (ie->name != NULL)
+           free(ie->name);
+       if (ie->origin != NULL)
+           free(ie->origin);
+       free(ie);
+    }
+    if (IndexFile != NULL)
+       fclose(IndexFile);
+
+    return err_cnt;
+}
+
+/*
+ * Traditional pkg_do(). We take the package name we are passed and
+ * first slurp in the CONTENTS file, getting name and origin, then
+ * we look for it's corresponding Makefile. If that fails we pull in
+ * the INDEX, and check there.
+ */
+static int
+pkg_do(char *pkg)
+{
+    char *ch, tmp[PATH_MAX], tmp2[PATH_MAX], *latest = NULL;
+    Package plist;
+    struct index_entry *ie;
+    FILE *fp;
+    size_t len;
+
+    /* Suck in the contents list. */
+    plist.head = plist.tail = NULL;
+    plist.name = plist.origin = NULL;
+    snprintf(tmp, PATH_MAX, "%s/%s/%s", LOG_DIR, pkg, CONTENTS_FNAME);
+    fp = fopen(tmp, "r");
+    if (!fp) {
+       warnx("the package info for package '%s' is corrupt", pkg);
+       return 1;
+    }
+    read_plist(&plist, fp);
+    fclose(fp);
+    if (plist.name == NULL) {
+       warnx("%s does not appear to be a valid package!", pkg);
+       return 1;
+    }
+
+    /*
+     * First we check if the installed package has an origin, and try
+     * looking for it's Makefile. If we find the Makefile we get the
+     * latest version from there. If we fail, we start looking in the
+     * INDEX, first matching the origin and then the package name.
+     */
+    if (plist.origin != NULL) {
+       snprintf(tmp, PATH_MAX, "%s/%s", PORTS_DIR, plist.origin);
+       if (isdir(tmp) && chdir(tmp) != FAIL && isfile("Makefile")) {
+           if ((latest = vpipe("/usr/bin/make -V PKGNAME", tmp)) == NULL)
+               warnx("Failed to get PKGNAME from %s/Makefile!", tmp);
+           else
+               show_version(plist.name, latest, "port");
+       }
+    }
+    if (latest == NULL) {
+       /* We only pull in the INDEX once, if needed. */
+       if (SLIST_EMPTY(&Index)) {
+           if (!IndexFile)
+               errx(2, "Unable to open INDEX in %s.", __func__);
+           while ((ch = fgetln(IndexFile, &len)) != NULL) {
+               /*
+                * Don't use strlcpy() because fgetln() doesn't
+                * return a valid C string.
+                */
+               strncpy(tmp, ch, MIN(len, PATH_MAX));
+               tmp[PATH_MAX-1] = '\0';
+               /* The INDEX has pkgname|portdir|... */
+               if ((ch = strchr(tmp, '|')) != NULL)
+                   ch[0] = '\0';
+               if (ch != NULL && (ch = strchr(&ch[1], '|')) != NULL)
+                   ch[0] = '\0';
+               /* Look backwards for the last two dirs = origin */
+               while (ch != NULL && *--ch != '/')
+                   if (ch[0] == '\0')
+                       ch = NULL;
+               while (ch != NULL && *--ch != '/')
+                   if (ch[0] == '\0')
+                       ch = NULL;
+               if (ch == NULL)
+                   errx(2, "The INDEX does not appear to be valid!");
+               if ((ie = malloc(sizeof(struct index_entry))) == NULL)
+                   errx(2, "Unable to allocate memory in %s.", __func__);
+               bzero(ie, sizeof(struct index_entry));
+               ie->name = strdup(tmp);
+               ie->origin = strdup(&ch[1]);
+               /* Who really cares if we reverse the index... */
+               SLIST_INSERT_HEAD(&Index, ie, next);
+           }
+       }
+       /* Now that we've slurped in the INDEX... */
+       SLIST_FOREACH(ie, &Index, next) {
+           if (plist.origin != NULL) {
+               if (strcmp(plist.origin, ie->origin) == 0)
+                   latest = strdup(ie->name);
+           } else {
+               strlcpy(tmp, ie->name, PATH_MAX);
+               strlcpy(tmp2, plist.name, PATH_MAX);
+               /* Chop off the versions and compare. */
+               if ((ch = strrchr(tmp, '-')) == NULL)
+                   errx(2, "The INDEX does not appear to be valid!");
+               ch[0] = '\0';
+               if ((ch = strrchr(tmp2, '-')) == NULL)
+                   warnx("%s is not a valid package!", plist.name);
+               else
+                   ch[0] = '\0';
+               if (strcmp(tmp2, tmp) == 0) {
+                   if (latest != NULL) {
+                       /* Multiple matches */
+                       snprintf(tmp, PATH_MAX, "%s|%s", latest, ie->name);
+                       free(latest);
+                       latest = strdup(tmp);
+                   } else
+                       latest = strdup(ie->name);
+               }
+           }
+       }
+       if (latest == NULL)
+           show_version(plist.name, NULL, plist.origin);
+       else
+           show_version(plist.name, latest, "index");
+    }
+    if (latest != NULL)
+       free(latest);
+    free_plist(&plist);
+    return 0;
+}
+
+#define OUTPUT(c) ((PreventChars != NULL && !strchr(PreventChars, (c))) || \
+                       (LimitChars != NULL && strchr(LimitChars, (c))) || \
+                       (PreventChars == NULL && LimitChars == NULL))
+
+/*
+ * Do the work of comparing and outputing. Ugly, but well that's what
+ * You get when you try to match perl output in C ;-).
+ */
+void
+show_version(const char *installed, const char *latest, const char *source)
+{
+    char *ch, tmp[PATH_MAX];
+    const char *ver;
+    int cmp = 0;
+
+    if (!installed || strlen(installed) == 0)
+       return;
+    strlcpy(tmp, installed, PATH_MAX);
+    if (!Verbose) {
+       if ((ch = strrchr(tmp, '-')) != NULL)
+           ch[0] = '\0';
+    }
+    if (latest == NULL) {
+       if (source == NULL && OUTPUT('!')) {
+           printf("%-34s  !", tmp);
+           if (Verbose)
+               printf("   Comparison failed");
+           printf("\n");
+       } else if (source != NULL && OUTPUT('?')) {
+           printf("%-34s  ?", tmp);
+           if (Verbose)
+               printf("   orphaned: %s", source);
+           printf("\n");
+       }
+    } else if (strchr(latest,'|') != NULL) {
+       if (OUTPUT('*')) {
+           printf("%-34s  *", tmp);
+           if (Verbose) {
+               strlcpy(tmp, latest, PATH_MAX);
+               ch = strchr(tmp, '|');
+               ch[0] = '\0';
+
+               ver = strrchr(tmp, '-');
+               ver = ver ? &ver[1] : tmp;
+               printf("   multiple versions (index has %s", ver);
+               do {
+                   ver = strrchr(&ch[1], '-');
+                   ver = ver ? &ver[1] : &ch[1];
+                   if ((ch = strchr(&ch[1], '|')) != NULL)
+                           ch[0] = '\0';
+                   printf(", %s", ver);
+               } while (ch != NULL);
+               printf(")");
+           }
+           printf("\n");
+       }
+    } else {
+       cmp = version_cmp(installed, latest);
+       ver = strrchr(latest, '-');
+       ver = ver ? &ver[1] : latest;
+       if (cmp < 0 && OUTPUT('<')) {
+           printf("%-34s  <", tmp);
+           if (Verbose)
+               printf("   needs updating (%s has %s)", source, ver);
+           printf("\n");
+       } else if (cmp == 0 && OUTPUT('=')) {
+           printf("%-34s  =", tmp);
+           if (Verbose)
+               printf("   up-to-date with %s", source);
+           printf("\n");
+       } else if (cmp > 0 && OUTPUT('>')) {
+           printf("%-34s  >", tmp);
+           if (Verbose)
+               printf("   succeeds %s (%s has %s)", source, source, ver);
+           printf("\n");
+       }
+    }
+}
+
+int
+version_match(char *pattern, const char *pkgname)
+{
+    int ret = 0;
+    int matchstream = 0;
+    FILE *fp = NULL;
+    Boolean isTMP = FALSE;
+
+    if (isURL(pkgname)) {
+       fp = fetchGetURL(pkgname, "");
+       isTMP = TRUE;
+       matchstream = 1;
+       if (fp == NULL) 
+           errx(2, "Unable to open %s.", pkgname);
+    } else if (pkgname[0] == '/') {
+       fp = fopen(pkgname, "r");
+       isTMP = TRUE;
+       matchstream = 1;
+       if (fp == NULL) 
+           errx(2, "Unable to open %s.", pkgname);
+    } else if (strcmp(pkgname, "-") == 0) {
+       fp = stdin;
+       matchstream = 1;
+    } else if (isURL(pattern)) {
+       fp = fetchGetURL(pattern, "");
+       isTMP = TRUE;
+       matchstream = -1;
+       if (fp == NULL) 
+           errx(2, "Unable to open %s.", pattern);
+    } else if (pattern[0] == '/') {
+       fp = fopen(pattern, "r");
+       isTMP = TRUE;
+       matchstream = -1;
+       if (fp == NULL) 
+           errx(2, "Unable to open %s.", pattern);
+    } else if (strcmp(pattern, "-") == 0) {
+       fp = stdin;
+       matchstream = -1;
+    } else {
+       ret = pattern_match(MATCH_GLOB, pattern, pkgname);
+    }
+
+    if (fp != NULL) {
+       size_t len;
+       char *line;
+       while ((line = fgetln(fp, &len)) != NULL) {
+           int match;
+           char *ch, ln[2048];
+           size_t lnlen;
+           if (len > 0 && line[len-1] == '\n')
+               len --;
+           lnlen = len;
+           if (lnlen > sizeof(ln)-1)
+               lnlen = sizeof(ln)-1;
+           memcpy(ln, line, lnlen);
+           ln[lnlen] = '\0';
+           if ((ch = strchr(ln, '|')) != NULL)
+               ch[0] = '\0';
+           if (matchstream > 0)
+               match = pattern_match(MATCH_GLOB, pattern, ln);
+           else
+               match = pattern_match(MATCH_GLOB, ln, pkgname);
+           if (match == 1) {
+               ret = 1;
+               printf("%.*s\n", (int)len, line);
+           }
+       }
+       if (isTMP)
+           fclose(fp);
+    }
+
+    return ret;
+}
+
+void
+cleanup(int sig)
+{
+    if (sig)
+       exit(1);
+}
index f6cef03..56530a8 100644 (file)
@@ -23,9 +23,9 @@
 .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.\"    $FreeBSD: src/usr.sbin/pkg_install/version/pkg_version.1,v 1.5.2.14 2002/06/21 16:42:26 charnier Exp $
-.\"    $DragonFly: src/usr.sbin/pkg_install/version/Attic/pkg_version.1,v 1.2 2003/06/17 04:29:59 dillon Exp $
-.Dd July 17, 1998
+.\" $FreeBSD: src/usr.sbin/pkg_install/version/pkg_version.1,v 1.27 2004/07/02 23:12:53 ru Exp $
+.\" $DragonFly: src/usr.sbin/pkg_install/version/Attic/pkg_version.1,v 1.3 2004/07/30 04:46:14 dillon Exp $
+.Dd June 29, 2004
 .Dt PKG_VERSION 1
 .Os
 .Sh NAME
 .Nd summarize installed versions of packages
 .Sh SYNOPSIS
 .Nm
-.Op Fl cdhv
+.Op Fl hv
 .Op Fl l Ar limchar
 .Op Fl L Ar limchar
-.Op Fl s Ar string
+.Oo
+.Op Fl X
+.Fl s Ar string
+.Oc
 .Op Ar index
 .Nm
 .Op Fl t Ar version1 version2
+.Nm
+.Op Fl T Ar pkgname pattern
 .Sh DESCRIPTION
 The
 .Nm
@@ -49,7 +54,8 @@ installed using the
 command.
 .Pp
 Each package's version number is checked against one of two sources to
-see if that package may require updating.  If the package contains
+see if that package may require updating.
+If the package contains
 information about its origin in the
 .Fx
 ports tree, and a version number can be determined from the port's
@@ -65,7 +71,7 @@ cannot be located,
 .Nm
 will search for the package in the ports collection index file
 (typically
-.Pa /usr/ports/INDEX ) .
+.Pa /usr/ports/INDEX-5 ) .
 Any matching version number(s) there will be used to determine whether
 the installed package is up-to-date or requires updating.
 .Pp
@@ -111,23 +117,6 @@ The
 .Nm
 utility supports several command-line arguments:
 .Bl -tag -width indent
-.It Fl c
-Enable commands output.  Commands output includes the commands you should
-type to update your installed packages to the latest versions in the ports
-system.
-This feature does
-.Bf Em
-not
-.Ef
-constitute an automated packages updating system.
-The output of this command
-.Bf Em
-must
-.Ef
-be edited, in order to avoid destroying dependencies between installed
-packages.
-.It Fl d
-Enable debugging output.
 .It Fl h
 Print help message.
 .It Fl l
@@ -152,6 +141,10 @@ with single quotes.
 .It Fl s
 Limit the output to those packages whose names match a given
 .Ar string .
+.It Fl X
+Interpret
+.Ar string
+as a extended regular expression.
 .It Fl t
 Test a pair of version number strings and exit.
 The output consists of one of the single characters
@@ -162,22 +155,41 @@ The output consists of one of the single characters
 .Li \&>
 (left-hand number greater) on standard output.
 This flag is mostly useful for scripts or for testing.
+.It Fl T
+Test whether
+.Ar pkgname
+is matched by
+.Ar pattern
+and set the exit code accordingly.
+.Fl T
+can also be used in `filter mode':
+When one of the arguments is `-', standard input is used, and lines
+with matching package names/patterns are echoed to standard output.
 .It Fl v
-Enable verbose output.  Verbose output includes some English-text
+Enable verbose output.
+Verbose output includes some English-text
 interpretations of the version number comparisons, as well as the
-version numbers compared for each package.  Non-verbose output is
+version numbers compared for each package.
+Non-verbose output is
 probably easier for programs or scripts to parse.
 .It Ar index
-Specify the index to be used as a basis of comparison.  This index can
-be specified as a filename (in the local filesystem) or a URL.  Any
+Specify the index to be used as a basis of comparison.
+This index can
+be specified as a filename (in the local file system) or a URL.
+Any
 URL understandable by
 .Xr fetch 1
-can be used here.  If no
+can be used here.
+If no
 .Ar index
 file is specified on the command line,
-.Pa /usr/ports/INDEX
+.Pa /usr/ports/INDEX-5
 is used.
 .El
+.Sh COMPATIBILITY
+The
+.Fl c
+option has been deprecated and is no longer supported.
 .Sh SEE ALSO
 .Xr fetch 1 ,
 .Xr pkg_add 1 ,
@@ -185,8 +197,8 @@ is used.
 .Xr pkg_delete 1 ,
 .Xr pkg_info 1
 .Sh FILES
-.Bl -tag -width /usr/ports/INDEX -compact
-.It Pa /usr/ports/INDEX
+.Bl -tag -width /usr/ports/INDEX-5 -compact
+.It Pa /usr/ports/INDEX-5
 Default index file.
 .El
 .Sh EXAMPLES
@@ -200,44 +212,22 @@ index file:
 The command below generates a report against
 the version numbers in the on-line ports collection:
 .Pp
-.Dl % pkg_version ftp://ftp.FreeBSD.org/pub/FreeBSD/branches/-current/ports/INDEX
-.Pp
-The command below generates a file of commands to run to update the installed
-files.
-These commands must
-.Bf Em
-not
-.Ef
-be run without suitable editing.
-They should be treated as suggestions, and may need to be reordered
-to account for dependencies between installed packages, or may need to
-be disregarded if multiple versions of an installed package can coexist.
-Blindly running the output of this command may leave a system in an
-unusable state.
-.Pp
-.Dl % pkg_version -c > do_update
+.Dl % pkg_version http://www.FreeBSD.org/ports/INDEX-5
 .Pp
 The following command compares two package version strings:
 .Pp
 .Dl % pkg_version -t 1.5 1.5.1
 .Sh AUTHORS
-.An Bruce A. Mah Aq bmah@FreeBSD.org
+The
+.Nm
+utility was written by
+.An Jeremy D. Lea Aq reg@FreeBSD.org ,
+partially based on a Perl script written by
+.An Bruce A. Mah Aq bmah@FreeBSD.org .
 .Sh CONTRIBUTORS
 .An Nik Clayton Aq nik@FreeBSD.org ,
 .An Dominic Mitchell Aq dom@palmerharvey.co.uk ,
 .An Mark Ovens Aq marko@FreeBSD.org ,
 .An Doug Barton Aq DougB@gorean.org ,
-.An Akinori MUSHA Aq knu@FreeBSD.org
-.Sh BUGS
-The commands output feature is
-.Bf Em
-not
-.Ef
-an automated ports/packages updating system.
-It does not even attempt to handle dependencies between installed
-packages correctly, and can produce incorrect results if multiple
-versions of a package can coexist on a system.
-.Pp
-Commands output assumes you install new software using the ports system,
-rather than using
-.Xr pkg_add 1 .
+.An Akinori MUSHA Aq knu@FreeBSD.org ,
+.An Oliver Eikemeier Aq eik@FreeBSD.org
diff --git a/usr.sbin/pkg_install/version/pkg_version.pl b/usr.sbin/pkg_install/version/pkg_version.pl
deleted file mode 100644 (file)
index 9678397..0000000
+++ /dev/null
@@ -1,624 +0,0 @@
-#! /usr/bin/perl
-#
-# Copyright 1998 Bruce A. Mah
-#
-# All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-#    notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-#    notice, this list of conditions and the following disclaimer in the
-#    documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY EXPRESS OR
-# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
-# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-# IN NO EVENT SHALL THE DEVELOPERS BE LIABLE FOR ANY DIRECT, INDIRECT,
-# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#
-# pkg_version.pl
-#
-# A package version-checking utility for FreeBSD.
-#
-# $FreeBSD: src/usr.sbin/pkg_install/version/pkg_version.pl,v 1.4.2.14 2002/06/03 15:34:59 bmah Exp $
-# $DragonFly: src/usr.sbin/pkg_install/version/Attic/pkg_version.pl,v 1.2 2003/06/17 04:29:59 dillon Exp $
-#
-
-use Cwd;
-use Getopt::Std;
-
-#
-# Configuration global variables
-#
-$AllCurrentPackagesCommand = '/usr/sbin/pkg_info -aI';
-$SelectedCurrentPackagesCommand = '/usr/sbin/pkg_info -I';
-$CatProgram = "cat ";
-$FetchProgram = "fetch -o - ";
-$OriginCommand = '/usr/sbin/pkg_info -qo';
-$GetPkgNameCommand = 'make -V PKGNAME';
-
-#$IndexFile = "ftp://ftp.freebsd.org/pub/FreeBSD/branches/-current/ports/INDEX";
-$PortsDirectory = $ENV{PORTSDIR} || '/usr/ports';
-$IndexFile = "$PortsDirectory/INDEX";
-$ShowCommandsFlag = 0;
-$DebugFlag = 0;
-$VerboseFlag = 0;
-$CommentChar = "#";
-$LimitFlag = "";
-$PreventFlag = "";
-
-#
-# CompareNumbers
-#
-# Try to figure out the relationship between two program version numbers.
-# Detecting equality is easy, but determining order is a little difficult.
-# This function returns -1, 0, or 1, in the same manner as <=> or cmp.
-#
-sub CompareNumbers {
-    my ($v1, $v2) = @_;
-
-    # Short-cut in case of equality
-    if ($v1 eq $v2) {
-       return 0;
-    }
-
-    # Loop over different components (the parts separated by dots).
-    # If any component differs, we have the basis for an inequality.
-    my @s1 = split(/\./, $v1);
-    my @s2 = split(/\./, $v2);
-    my ($c1, $c2);
-    do {
-       last unless @s1 || @s2;
-       $c1 = shift @s1;
-       $c2 = shift @s2;
-    } while ($c1 eq $c2);
-
-    # Look at the first components of the arrays that are left.
-    # These will determine the result of the comparison.
-    # Note that if either version doesn't have any components left,
-    # it's implicitly treated as a "0".
-
-    # Our next set of checks looks to see if either component has a
-    # leading letter (there should be at most one leading letter per
-    # component, so that "4.0b1" is allowed, but "4.0beta1" is not).
-    if ($c1 =~ /^\D/) {
-       if ($c2 =~ /^\D/) {
-
-           # Both have a leading letter, so do an alpha comparison
-           # on the letters.  This isn't ideal, since we're assuming
-           # that "1.0.b4" > "1.0.a2".  But it's about the best we can do, 
-           # without encoding some explicit policy.
-           my ($letter1, $letter2);
-           $letter1 = substr($c1, 0, 1);
-           $letter2 = substr($c2, 0, 1);
-
-           if ($letter1 ne $letter2) {
-               return $letter1 cmp $letter2;
-           }
-           else {
-               # The letters matched equally.  Delete the leading
-               # letters and invoke ourselves on the remainining
-               # characters, which according to the Porters Handbook
-               # must be digits, so for example, "1.0.a9" < "1.0.a10".
-               substr($c1, 0, 1) = "";
-               substr($c2, 0, 1) = "";
-               return &CompareNumbers($c1, $c2);               
-           }
-
-       }
-       else {
-           # $c1 begins with a letter, but $c2 doesn't.  Let $c2
-           # win the comparison, so that "1.0.b1" < "1.0.1".
-           return -1;
-       }
-    }
-    else {
-       if ($c2 =~ /^\D/) {
-           # $c2 begins with a letter but $c1 doesn't.  Let $c1
-           # win the comparison, as above.
-           return 1;
-       }
-       else {
-           # Neither component begins with a leading letter.
-           # See if either component has no characters left.  If so,
-           # let the other component win.
-           if ($c1 eq "") {
-               return -1;
-           }
-           if ($c2 eq "") {
-               return 1;
-           }
-
-           # Check for numeric inequality.  We assume here that (for example)
-           # "3.09" < "3.10", and that we aren't going to be asked to
-           # decide between "3.010" and "3.10".
-           if ($c1 != $c2) {
-               return $c1 <=> $c2;
-           }
-
-           # String comparison, given numeric equality.  This
-           # handles comparisons of the form "3.4j" < "3.4k".  This form
-           # technically isn't allowed by the Porter's Handbook, but a
-           # number of ports in the FreeBSD Ports Collection as of this
-           # writing use it (graphics/jpeg and graphics/xv).  So we need
-           # to support it.
-           #
-           # What we actually do is to strip off the leading digits and
-           # invoke ourselves on the remainder.  This allows us to handle
-           # comparisons of the form "1.1p1" < "1.1p2".  Again, not
-           # technically allowed by the Porters Handbook, but lots of ports
-           # use it.
-           else {
-               $c1 =~ s/\d+//;
-               $c2 =~ s/\d+//;
-               if ($c1 eq $c2) {
-                   return 0;
-               }
-               elsif ($c1 eq "") {
-                   return -1;
-               }
-               elsif ($c2 eq "") {
-                   return 1;
-               }
-               else {
-                   return &CompareNumbers($c1, $c2);
-               }
-           }
-       }
-    }
-}
-
-#
-# CompareVersions
-#
-# Try to figure out the relationship between two program "full
-# versions", which is defined as the 
-# ${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
-# part of a package's name.
-#
-# Key points:  ${PORTEPOCH} supercedes ${PORTVERSION}
-# supercedes ${PORTREVISION}.  See the commit log for revision
-# 1.349 of ports/Mk/bsd.port.mk for more information.
-#
-sub CompareVersions {
-    local($fv1, $fv2, $v1, $v2, $r1, $r2, $e1, $e2, $rc);
-
-    $fv1 = $_[0];
-    $fv2 = $_[1];
-
-    # Shortcut check for equality before invoking the parsing
-    # routines.
-    if ($fv1 eq $fv2) {
-       return 0;
-    }
-    else {
-       ($v1, $r1, $e1) = &GetVersionComponents($fv1);
-       ($v2, $r2, $e2) = &GetVersionComponents($fv2);
-
-       # Port revision and port epoch numbers default to zero if not
-       # specified.
-       if ($r1 eq "") {
-           $r1 = "0";
-       }
-       if ($r2 eq "") {
-           $r2 = "0";
-       }
-       if ($e1 eq "") {
-           $e1 = "0";
-       }
-       if ($e2 eq "") {
-           $e2 = "0";
-       }
-
-       # Check epoch, port version, and port revision, in that
-       # order.
-       $rc = &CompareNumbers($e1, $e2);
-       if ($rc == 0) {
-           $rc = &CompareNumbers($v1, $v2);
-           if ($rc == 0) {
-               $rc = &CompareNumbers($r1, $r2);
-           }
-       }
-
-       return $rc;
-    }
-}
-
-#
-# GetVersionComponents
-#
-# Parse out the version number, revision number, and epoch number
-# of a port's version string and return them as a three-element array.
-#
-# Syntax is:  ${PORTVERSION}[_${PORTREVISION}][,${PORTEPOCH}]
-#
-sub GetVersionComponents {
-    local ($fullversion, $version, $revision, $epoch);
-
-    $fullversion = $_[0];
-
-    $fullversion =~ /([^_,]+)/;
-    $version = $1;
-    
-    if ($fullversion =~ /_([^_,]+)/) {
-       $revision = $1;
-    }
-    
-    if ($fullversion =~ /,([^_,]+)/) {
-       $epoch = $1;
-    }
-
-    return($version, $revision, $epoch);
-}
-
-#
-# GetNameAndVersion
-#
-# Get the name and version number of a package. Returns a two element
-# array, first element is name, second element is full version string.,
-#
-sub GetNameAndVersion {
-    local($fullname, $name, $fullversion);
-    $fullname = $_[0];
-
-    # If no hyphens then no version numbers
-    return ($fullname, "", "", "", "") if $fullname !~ /-/;
-
-    # Match (and group) everything after hyphen(s). Because the
-    # regexp is 'greedy', the first .* will try and match everything up
-    # to (but not including) the last hyphen
-    $fullname =~ /(.+)-(.+)/;
-    $name = $1;
-    $fullversion = $2;
-
-    return ($name, $fullversion);
-}
-
-#
-# PrintHelp
-#
-# Print usage information
-#
-sub PrintHelp {
-    print <<"EOF"
-Usage: pkg_version [-c] [-d] [-h] [-l limchar] [-L limchar] [-s string] 
-                   [-v] [index]
-       pkg_version [-d debug] -t v1 v2
--c              Show commands to update installed packages
--d             Enable debugging output
--h             Help (this message)
--l limchar     Limit output to status flags that match
--L limchar     Limit output to status flags that DON\'T match
--s string      Limit output to packages matching a string
--v             Verbose output
-index          URL or filename of index file
-               (Default is $IndexFile)
-
--t v1 v2       Test two version strings
-EOF
-}
-
-#
-# Parse command-line arguments, deal with them
-#
-if (!getopts('cdhl:L:s:tv') || ($opt_h)) {
-    &PrintHelp();
-    exit;
-}
-if ($opt_c) {
-    $ShowCommandsFlag = $opt_c;
-    $LimitFlag = "<?"; # note that if the user specifies -l, we
-                       # deal with this *after* setting a default
-                       # for $LimitFlag
-}
-if ($opt_d) {
-    $DebugFlag = $opt_d;
-}
-if ($opt_l) {
-    $LimitFlag = $opt_l;
-}
-if ($opt_L) {
-    $PreventFlag = $opt_L;
-}
-if ($opt_t) {
-    $TestFlag = 1;
-}
-if ($opt_s) {
-    $StringFlag = $opt_s;
-}
-if ($opt_v) {
-    $VerboseFlag = 1;
-}
-if ($#ARGV >= 0) {
-    if ($TestFlag) {
-       ($test1, $test2) = @ARGV;
-    }
-    else {
-       $IndexFile = $ARGV[0];
-    }
-}
-
-# Handle test flag now
-if ($TestFlag) {
-    my $cmp = CompareVersions($test1, $test2);
-    if ($cmp < 0) {
-       print "<\n";
-    }
-    elsif ($cmp == 0) {
-       print "=\n";
-    }
-    else {
-       print ">\n";
-    }
-    exit(0);
-}
-
-# Determine what command to use to retrieve the index file.
-if ($IndexFile =~ m-^((http|ftp)://|file:/)-) {
-    $IndexPackagesCommand = $FetchProgram . $IndexFile;
-}
-else {
-    $IndexPackagesCommand = $CatProgram . $IndexFile;
-}
-
-#
-# Get the current list of installed packages
-#
-if ($StringFlag) {
-    if ($DebugFlag) {
-       print STDERR "$SelectedCurrentPackagesCommand *$StringFlag*\n";
-    }
-    open CURRENT, "$SelectedCurrentPackagesCommand \\*$StringFlag\\*|";
-} else {
-    if ($DebugFlag) {
-       print STDERR "$AllCurrentPackagesCommand\n";
-    }
-    open CURRENT, "$AllCurrentPackagesCommand|";
-}
-while (<CURRENT>) {
-    ($packageString, $rest) = split;
-
-    ($packageName, $packageFullversion) = &GetNameAndVersion($packageString);
-    $currentPackages{$packageString}{'name'} = $packageName;
-    $currentPackages{$packageString}{'fullversion'} = $packageFullversion;
-}
-close CURRENT;
-
-#
-# Iterate over installed packages, get origin directory (if it
-# exists) and PORTVERSION
-#
-$dir = cwd();
-foreach $packageString (sort keys %currentPackages) {
-
-    open ORIGIN, "$OriginCommand $packageString|";
-    $origin = <ORIGIN>;
-    close ORIGIN;
-
-    # If there is an origin variable for this package, then store it.
-    if ($origin ne "") {
-       chomp $origin;
-
-       # Try to get the version out of the makefile.
-       # The chdir needs to be successful or our make -V invocation
-       # will fail.
-       unless (chdir "$PortsDirectory/$origin" and -r "Makefile") {
-           $currentPackages{$packageString}->{orphaned} = $origin;
-           next;
-       }
-
-       open PKGNAME, "$GetPkgNameCommand|";
-       $pkgname = <PKGNAME>;
-       close PKGNAME;
-
-       if ($pkgname ne "") {
-           chomp $pkgname;
-
-           $pkgname =~ /(.+)-(.+)/;
-           $portversion = $2;
-           
-           $currentPackages{$packageString}{'origin'} = $origin;
-           $currentPackages{$packageString}{'portversion'} = $portversion;
-       }
-    }
-}
-chdir "$dir";
-
-#
-# Slurp in the index file
-#
-if ($DebugFlag) {
-    print STDERR "$IndexPackagesCommand\n";
-}
-
-open INDEX, "$IndexPackagesCommand|";
-while (<INDEX>) {
-    ($packageString, $packagePath, $rest) = split(/\|/);
-
-    ($packageName, $packageFullversion) = &GetNameAndVersion($packageString);
-    $indexPackages{$packageName}{'name'} = $packageName;
-    $indexPackages{$packageName}{'path'} = $packagePath;
-    if (defined $indexPackages{$packageName}{'fullversion'}) {
-       $indexPackages{$packageName}{'fullversion'} .= "|" . $packageFullversion;
-    }
-    else {
-       $indexPackages{$packageName}{'fullversion'} = $packageFullversion;
-    }
-    $indexPackages{$packageName}{'refcount'}++;
-}
-close INDEX;
-
-#
-# If we're doing commands output, cripple the output so that users
-# can't just pipe the output to sh(1) and expect this to work.
-#
-if ($ShowCommandsFlag) {
-    print<<EOF
-echo "The commands output of pkg_version cannot be executed without editing."
-echo "You MUST save this output to a file and then edit it, taking into"
-echo "account package dependencies and the fact that some packages cannot"
-echo "or should not be upgraded." 
-exit 1
-EOF
-}
-
-#
-# Produce reports
-#
-# Prior versions of pkg_version used commas (",") as delimiters
-# when there were multiple versions of a package installed.
-# The new package version number syntax uses commas as well,
-# so we've used vertical bars ("|") internally, and convert them
-# to commas before we output anything so the reports look the
-# same as they did before.
-#
-foreach $packageString (sort keys %currentPackages) {
-    $~ = "STDOUT_VERBOSE"  if $VerboseFlag;
-    $~ = "STDOUT_COMMANDS" if $ShowCommandsFlag;
-
-    $packageNameVer = $packageString;
-    $packageName = $currentPackages{$packageString}{'name'};
-
-    $currentVersion = $currentPackages{$packageString}{'fullversion'};
-
-    if ($currentPackages{$packageString}->{orphaned}) {
-
-       next if $ShowCommandsFlag;
-       $versionCode = "?";
-       $Comment = "orphaned: $currentPackages{$packageString}->{orphaned}";
-
-    } elsif (defined $currentPackages{$packageString}{'portversion'}) {
-
-       $portVersion = $currentPackages{$packageString}{'portversion'};
-
-       $portPath = "$PortsDirectory/$currentPackages{$packageString}{'origin'}";
-
-       # Do the comparison
-       $rc = &CompareVersions($currentVersion, $portVersion);
-           
-       if ($rc == 0) {
-           $versionCode = "=";
-           $Comment = "up-to-date with port";
-       }
-       elsif ($rc < 0) {
-           $versionCode = "<";
-           $Comment = "needs updating (port has $portVersion)";
-       }
-       elsif ($rc > 0) {
-           $versionCode = ">";
-           $Comment = "succeeds port (port has $portVersion)";
-       }
-       else {
-           $versionCode = "!";
-           $Comment = "Comparison failed";
-       }
-    }
-
-    elsif (defined $indexPackages{$packageName}{'fullversion'}) {
-
-       $indexVersion = $indexPackages{$packageName}{'fullversion'};
-       $indexRefcount = $indexPackages{$packageName}{'refcount'};
-
-       $portPath = $indexPackages{$packageName}{'path'};
-
-       if ($indexRefcount > 1) {
-           $versionCode = "*";
-           $Comment = "multiple versions (index has $indexVersion)";
-           $Comment =~ s/\|/,/g;
-       }
-       else {
-
-           # Do the comparison
-           $rc = 
-               &CompareVersions($currentVersion, $indexVersion);
-           
-           if ($rc == 0) {
-               $versionCode = "=";
-               $Comment = "up-to-date with index";
-           }
-           elsif ($rc < 0) {
-               $versionCode = "<";
-               $Comment = "needs updating (index has $indexVersion)"
-           }
-           elsif ($rc > 0) {
-               $versionCode = ">";
-               $Comment = "succeeds index (index has $indexVersion)";
-           }
-           else {
-               $versionCode = "!";
-               $Comment = "Comparison failed";
-           }
-       }
-    }
-    else {
-       next if $ShowCommandsFlag;
-       $versionCode = "?";
-       $Comment = "unknown in index";
-    }
-
-    # Having figured out what to print, now determine, based on the
-    # $LimitFlag and $PreventFlag variables, if we should print or not.
-    if ((not $LimitFlag) and (not $PreventFlag)) {
-       write;
-    } elsif ($PreventFlag) {
-       if ($versionCode !~ m/[$PreventFlag]/o) {
-           if (not $LimitFlag) {
-               write;
-           } else {
-               write if $versionCode =~ m/[$LimitFlag]/o;
-           }
-       }
-    } else {
-       # Must mean that there is a LimitFlag
-       write if $versionCode =~ m/[$LimitFlag]/o;
-    }
-}
-
-exit 0;
-
-#
-# Formats
-#
-# $CommentChar is in the formats because you can't put a literal '#' in
-# a format specification
-
-# General report (no output flags)
-format STDOUT =
-@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @<
-$packageName,              $versionCode
-.
-  ;
-
-# Verbose report (-v flag)
-format STDOUT_VERBOSE =
-@<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<  @<  @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-$packageNameVer,           $versionCode, $Comment
-.
-  ;
-
-# Report that includes commands to update program (-c flag)
-format STDOUT_COMMANDS =
-@<
-$CommentChar  
-@< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-$CommentChar, $packageName
-@< @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-$CommentChar, $Comment  
-@<
-$CommentChar
-cd @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-$portPath
-make clean && make && pkg_delete -f @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
-              $packageNameVer
-make install clean
-
-.
-  ;
index d895ed6..3d0c595 100644 (file)
 # Regression testing for pkg_version
 # Originally from an idea by "Akinori MUSHA" <knu@iDaemons.org>
 #
-# $FreeBSD: src/usr.sbin/pkg_install/version/test-pkg_version.sh,v 1.1.2.5 2002/06/03 15:34:59 bmah Exp $
-# $DragonFly: src/usr.sbin/pkg_install/version/Attic/test-pkg_version.sh,v 1.2 2003/06/17 04:30:00 dillon Exp $
+# $FreeBSD: src/usr.sbin/pkg_install/version/test-pkg_version.sh,v 1.5 2004/06/29 18:52:13 eik Exp $
+# $DragonFly: src/usr.sbin/pkg_install/version/Attic/test-pkg_version.sh,v 1.3 2004/07/30 04:46:14 dillon Exp $
 #
 
 ECHO=echo
-PKG_VERSION=./pkg_version.pl
+PKG_VERSION=./pkg_version
 
 test-pv ( ) { \
     setvar v1 $1
@@ -74,3 +74,22 @@ test-pv 1.5 "<" 1.5.0.1 portrevision
 test-pv 00.01.01,1 ">" 99.12.31 portepoch
 test-pv 0.0.1_1,2 ">" 0.0.1,2 portrevision/portepoch
 test-pv 0.0.1_1,3 ">" 0.0.1_2,2 portrevision/portepoch
+
+test-pv 2.0 ">" 2.a2 number/letter
+test-pv 3 "=" 3.0 equality
+test-pv 4a "<" 4a0 letter/zero
+test-pv 10a1b2 "=" 10a1.b2 separator
+
+test-pv 7pl "=" 7.pl patchevel
+test-pv 8.0.a "=" 8.0alpha alpha
+test-pv 9.b3.0 "=" 9beta3 beta
+test-pv 10.pre7 "=" 10pre7.0 pre
+test-pv 11.r "=" 11.rc rc
+
+test-pv 12pl "<" 12alpha alpha/patchevel
+test-pv 13.* "<" 13.pl star/patchevel
+
+test-pv 1.0.0+2003.09.06 "=" 1.0+2003.09.06 plus/multiple
+test-pv 1.0.1+2003.09.06 ">" 1.0+2003.09.06 plus/multiple
+test-pv 1.0.0+2003.09.06 "<" 1.0+2003.09.06_1 plus/portrevision
+test-pv 1.0.1+2003.09.06 ">" 1.0+2003.09.06_1 plus/portrevision
diff --git a/usr.sbin/pkg_install/version/version.h b/usr.sbin/pkg_install/version/version.h
new file mode 100644 (file)
index 0000000..615566b
--- /dev/null
@@ -0,0 +1,47 @@
+/*
+ * FreeBSD install - a package for the installation and maintainance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Jeremy D. Lea.
+ * 11 May 2002
+ *
+ * This is the version module. Based on pkg_version.pl by Bruce A. Mah.
+ *
+ * $FreeBSD: src/usr.sbin/pkg_install/version/version.h,v 1.3 2004/06/29 18:54:47 eik Exp $
+ * $DragonFly: src/usr.sbin/pkg_install/version/Attic/version.h,v 1.1 2004/07/30 04:46:14 dillon Exp $
+ */
+
+#ifndef _INST_VERSION_H_INCLUDE
+#define _INST_VERSION_H_INCLUDE
+
+/* Where the ports lives by default */
+#define DEF_PORTS_DIR  "/usr/ports"
+/* just in case we change the environment variable name */
+#define PORTSDIR       "PORTSDIR"
+/* macro to get name of directory where we put logging information */
+#define PORTS_DIR      (getenv(PORTSDIR) ? getenv(PORTSDIR) : DEF_PORTS_DIR)
+
+struct index_entry {
+    SLIST_ENTRY(index_entry) next;
+    char *name;
+    char *origin;
+};
+SLIST_HEAD(index_head, index_entry);
+
+extern char    *LimitChars;
+extern char    *PreventChars;
+extern char    *MatchName;
+extern Boolean RegexExtended;
+
+extern int     version_match(char *, const char *);
+
+#endif /* _INST_VERSION_H_INCLUDE */