diff options
author | sobomax <sobomax@FreeBSD.org> | 2001-10-08 17:01:35 +0000 |
---|---|---|
committer | sobomax <sobomax@FreeBSD.org> | 2001-10-08 17:01:35 +0000 |
commit | 330073033f745cd5b9488ec7f61228d53b49de6a (patch) | |
tree | 79e92fcc3086b01f064048343f689fa337b95dbd | |
parent | 3cfe16a87bb4f1b8476c2b6939f94ca24d090ef5 (diff) | |
download | FreeBSD-src-330073033f745cd5b9488ec7f61228d53b49de6a.zip FreeBSD-src-330073033f745cd5b9488ec7f61228d53b49de6a.tar.gz |
- Allow package archive to be created from a locally installed package. This
allows for an easy way to backup old version of port prior to installing
a new one;
- silence compiler warnings by killing some unused variables and adding
all includes necessary.
MFC after: 2 weeks
-rw-r--r-- | usr.sbin/pkg_install/add/perform.c | 20 | ||||
-rw-r--r-- | usr.sbin/pkg_install/create/create.h | 1 | ||||
-rw-r--r-- | usr.sbin/pkg_install/create/main.c | 35 | ||||
-rw-r--r-- | usr.sbin/pkg_install/create/perform.c | 66 | ||||
-rw-r--r-- | usr.sbin/pkg_install/create/pkg_create.1 | 17 |
5 files changed, 109 insertions, 30 deletions
diff --git a/usr.sbin/pkg_install/add/perform.c b/usr.sbin/pkg_install/add/perform.c index 634e3d1..2d1485a 100644 --- a/usr.sbin/pkg_install/add/perform.c +++ b/usr.sbin/pkg_install/add/perform.c @@ -28,6 +28,7 @@ static const char rcsid[] = #include "lib.h" #include "add.h" +#include <libgen.h> #include <signal.h> #include <sys/wait.h> @@ -67,7 +68,7 @@ pkg_do(char *pkg) char pkg_fullname[FILENAME_MAX]; char playpen[FILENAME_MAX]; char extract_contents[FILENAME_MAX]; - char *where_to, *tmp, *extract; + char *where_to, *extract; FILE *cfile; int code; PackingList p; @@ -356,7 +357,6 @@ pkg_do(char *pkg) code = 1; goto success; /* nothing to uninstall yet */ } - if (new_m) unlink(pre_script); } /* Now finally extract the entire show if we're not going direct */ @@ -373,7 +373,6 @@ pkg_do(char *pkg) if (vsystem("/usr/sbin/mtree -U -f %s -d -e -p %s >%s", MTREE_FNAME, p ? p->name : "/", _PATH_DEVNULL)) warnx("mtree returned a non-zero status - continuing"); } - unlink(MTREE_FNAME); } /* Run the installation script one last time? */ @@ -387,7 +386,6 @@ pkg_do(char *pkg) code = 1; goto fail; } - unlink(post_script); } /* Time to record the deed? */ @@ -415,12 +413,22 @@ pkg_do(char *pkg) } /* Make sure pkg_info can read the entry */ vsystem("chmod a+rx %s", LogDir); + move_file(".", DESC_FNAME, LogDir); + move_file(".", COMMENT_FNAME, LogDir); + if (fexists(INSTALL_FNAME)) + move_file(".", INSTALL_FNAME, LogDir); + if (fexists(POST_INSTALL_FNAME)) + move_file(".", POST_INSTALL_FNAME, LogDir); if (fexists(DEINSTALL_FNAME)) move_file(".", DEINSTALL_FNAME, LogDir); if (fexists(POST_DEINSTALL_FNAME)) move_file(".", POST_DEINSTALL_FNAME, LogDir); if (fexists(REQUIRE_FNAME)) move_file(".", REQUIRE_FNAME, LogDir); + if (fexists(DISPLAY_FNAME)) + move_file(".", DISPLAY_FNAME, LogDir); + if (fexists(MTREE_FNAME)) + move_file(".", MTREE_FNAME, LogDir); sprintf(contents, "%s/%s", LogDir, CONTENTS_FNAME); cfile = fopen(contents, "w"); if (!cfile) { @@ -430,10 +438,6 @@ pkg_do(char *pkg) } write_plist(&Plist, cfile); fclose(cfile); - move_file(".", DESC_FNAME, LogDir); - move_file(".", COMMENT_FNAME, LogDir); - if (fexists(DISPLAY_FNAME)) - move_file(".", DISPLAY_FNAME, LogDir); for (p = Plist.head; p ; p = p->next) { if (p->type != PLIST_PKGDEP) continue; diff --git a/usr.sbin/pkg_install/create/create.h b/usr.sbin/pkg_install/create/create.h index 1b71432..d85e28a 100644 --- a/usr.sbin/pkg_install/create/create.h +++ b/usr.sbin/pkg_install/create/create.h @@ -38,6 +38,7 @@ extern char *ExcludeFrom; extern char *Mtree; extern char *Pkgdeps; extern char *Origin; +extern char *InstalledPkg; extern char PlayPen[]; extern int Dereference; extern int PlistOnly; diff --git a/usr.sbin/pkg_install/create/main.c b/usr.sbin/pkg_install/create/main.c index 642069e..a9c502d 100644 --- a/usr.sbin/pkg_install/create/main.c +++ b/usr.sbin/pkg_install/create/main.c @@ -18,7 +18,7 @@ static const char rcsid[] = #include "lib.h" #include "create.h" -static char Options[] = "YNOhvyf:p:P:c:d:i:I:k:K:r:t:X:D:m:s:o:"; +static char Options[] = "YNOhvyf:p:P:c:d:i:I:k:K:r:t:X:D:m:s:o:b:"; char *Prefix = NULL; char *Comment = NULL; @@ -35,6 +35,7 @@ char *ExcludeFrom = NULL; char *Mtree = NULL; char *Pkgdeps = NULL; char *Origin = NULL; +char *InstalledPkg = NULL; char PlayPen[FILENAME_MAX]; int Dereference = FALSE; int PlistOnly = FALSE; @@ -46,8 +47,9 @@ int main(int argc, char **argv) { int ch; - char **pkgs, **start; + char **pkgs, **start, *tmp; + /*{int barrier = 1; while (barrier); }*/ pkgs = start = argv; while ((ch = getopt(argc, argv, Options)) != -1) switch(ch) { @@ -139,6 +141,21 @@ main(int argc, char **argv) UseBzip2 = TRUE; break; + case 'b': + while ((tmp = strrchr(optarg, (int)'/')) != NULL) { + *tmp++ = '\0'; + /* + * If character after the '/' is alphanumeric, then we've + * found the package name. Otherwise we've come across + * a trailing '/' and need to continue our quest. + */ + if (isalpha(*tmp)) { + InstalledPkg = tmp; + break; + } + } + break; + case '?': default: usage(); @@ -153,12 +170,15 @@ main(int argc, char **argv) *pkgs++ = *argv++; /* If no packages, yelp */ - if (pkgs == start) + if ((pkgs == start) && (InstalledPkg == NULL)) warnx("missing package name"), usage(); *pkgs = NULL; - if (start[1]) - warnx("only one package name allowed ('%s' extraneous)", start[1]), + if ((start[0] != NULL) && (start[1] != NULL)) { + warnx("only one package name allowed ('%s' extraneous)", start[1]); usage(); + } + if (start[0] == NULL) + start[0] = InstalledPkg; if (!pkg_perform(start)) { if (Verbose) warnx("package creation failed"); @@ -171,11 +191,12 @@ main(int argc, char **argv) static void usage() { - fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n", + 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-name"); +" -f packlist pkg-filename", +" pkg_create [-YNhvy] -b pkg-name [pkg-filename]"); exit(1); } diff --git a/usr.sbin/pkg_install/create/perform.c b/usr.sbin/pkg_install/create/perform.c index 30678bb..1dae50b 100644 --- a/usr.sbin/pkg_install/create/perform.c +++ b/usr.sbin/pkg_install/create/perform.c @@ -35,6 +35,7 @@ static const char rcsid[] = static void sanity_check(void); static void make_dist(char *, char *, char *, Package *); +static int create_from_installed(char *, char *); static char *home; @@ -50,21 +51,10 @@ pkg_perform(char **pkgs) int compress = TRUE; /* default is to compress packages */ /* Preliminary setup */ - sanity_check(); + if (InstalledPkg == NULL) + sanity_check(); if (Verbose && !PlistOnly) printf("Creating package %s\n", pkg); - get_dash_string(&Comment); - get_dash_string(&Desc); - if (!strcmp(Contents, "-")) - pkg_in = stdin; - else { - pkg_in = fopen(Contents, "r"); - if (!pkg_in) { - cleanup(0); - errx(2, __FUNCTION__ ": unable to open contents file '%s' for input", Contents); - } - } - plist.head = plist.tail = NULL; /* chop suffix off if already specified, remembering if we want to compress */ len = strlen(pkg); @@ -92,6 +82,22 @@ pkg_perform(char **pkgs) else suf = "tar"; + if (InstalledPkg != NULL) + return (create_from_installed(pkg, suf)); + + get_dash_string(&Comment); + get_dash_string(&Desc); + if (!strcmp(Contents, "-")) + pkg_in = stdin; + else { + pkg_in = fopen(Contents, "r"); + if (!pkg_in) { + cleanup(0); + errx(2, __FUNCTION__ ": unable to open contents file '%s' for input", Contents); + } + } + plist.head = plist.tail = NULL; + /* Add the origin if asked, at the top */ if (Origin) add_plist(&plist, PLIST_COMMENT, strconcat("ORIGIN:", Origin)); @@ -392,3 +398,37 @@ cleanup(int sig) if (sig) exit(1); } + +static int +create_from_installed(char *pkg, char *suf) +{ + FILE *fp; + Package plist; + char home[MAXPATHLEN], log_dir[FILENAME_MAX]; + + snprintf(log_dir, sizeof(log_dir), "%s/%s", LOG_DIR, InstalledPkg); + if (!fexists(log_dir)) { + warnx("can't find package '%s' installed!", InstalledPkg); + return 1; + } + getcwd(home, sizeof(home)); + if (chdir(log_dir) == FAIL) { + warnx("can't change directory to '%s'!", log_dir); + return 1; + } + /* Suck in the contents list */ + plist.head = plist.tail = NULL; + fp = fopen(CONTENTS_FNAME, "r"); + if (!fp) { + warnx("unable to open %s file", CONTENTS_FNAME); + return 1; + } + /* If we have a prefix, add it now */ + read_plist(&plist, fp); + fclose(fp); + + make_dist(home, pkg, suf, &plist); + + free_plist(&plist); + return TRUE; +} diff --git a/usr.sbin/pkg_install/create/pkg_create.1 b/usr.sbin/pkg_install/create/pkg_create.1 index c7d61ae..42c78ae 100644 --- a/usr.sbin/pkg_install/create/pkg_create.1 +++ b/usr.sbin/pkg_install/create/pkg_create.1 @@ -49,7 +49,11 @@ .Fl c Ar comment .Fl d Ar description .Fl f Ar packlist -.Ar pkg-name +.Ar pkg-filename +.Nm +.Op Fl YNhvy +.Fl b Ar pkg-name +.Op Ar pkg-filename .Sh DESCRIPTION The .Nm @@ -263,13 +267,22 @@ utility to compress package tarball instead of .Xr gzip 1 . Please note that this option is no-op if format of the resulting archive is explicitly specified by the recognizeable suffix of -.Ar pkg-name . +.Ar pkg-filename . Currently .Nm recognizes the following suffixes: .Pa .tgz , .tar and .Pa .tbz2 . +.It Fl b Ar pkg-name +Create package file from a locally installed package named +.Ar pkg-name . +If the +.Ar pkg-filename +is not specified, then resulting archive will be created in the +current directory and named +.Ar pkg-name +with an appropriate extraction suffix applied. .El .Sh PACKING LIST DETAILS The |