From owner-p4-projects@FreeBSD.ORG Mon May 17 10:48:30 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id F339F1065675; Mon, 17 May 2010 10:48:29 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id B701B106566C for ; Mon, 17 May 2010 10:48:29 +0000 (UTC) (envelope-from gcooper@FreeBSD.org) Received: from repoman.freebsd.org (unknown [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id A2C598FC1B for ; Mon, 17 May 2010 10:48:29 +0000 (UTC) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o4HAmTQv000579 for ; Mon, 17 May 2010 10:48:29 GMT (envelope-from gcooper@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o4HAmTvw000577 for perforce@freebsd.org; Mon, 17 May 2010 10:48:29 GMT (envelope-from gcooper@FreeBSD.org) Date: Mon, 17 May 2010 10:48:29 GMT Message-Id: <201005171048.o4HAmTvw000577@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to gcooper@FreeBSD.org using -f From: Garrett Cooper To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 178386 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 17 May 2010 10:48:30 -0000 http://p4web.freebsd.org/@@178386?ac=10 Change 178386 by gcooper@gcooper-bayonetta on 2010/05/17 10:47:46 1. Remove all remaining references to cleanup in libpkg and shove all cleanup calls to individual pkg_install applications. 2. Remove all unused functions. 3. Better style(9)-ize the headers and prototypes. 1. is required so I can test via ctypes and so others can load libpkg without defining cleanup as an external function. Affected files ... .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#14 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pen.c#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#8 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/tools/regression/lib/libpkg/tests/test_unpack.py#2 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/extract.c#3 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/perform.c#11 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/perform.c#27 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/pl.c#3 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/perform.c#5 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/perform.c#6 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/show.c#3 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/updating/main.c#8 edit .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/version/perform.c#10 edit Differences ... ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#14 (text+ko) ==== @@ -184,32 +184,41 @@ return NULL; } +/* + * Fetch the metadata for a package contained in +CONTENTS. + * + * Return NULL on failure, or a buffer corresponding to the +CONTENTS file on + * success. + * + * cleanup() should be called if this call fails. + */ char * fileGetContents(const char *fname) { - char *contents; - struct stat sb; - int fd; + struct stat sb; + char *contents = NULL; + int fd = -1; + + if (stat(fname, &sb) == FAIL) { + warn("%s: can't stat '%s'", __func__, fname); + } else { + contents = (char *)malloc(sb.st_size + 1); + fd = open(fname, O_RDONLY, 0); + if (fd == -1) + warn("%s: unable to open '%s' for reading", + __func__, fname); + else if (read(fd, contents, sb.st_size) != sb.st_size) + warn("%s: short read on '%s' - did not get %lld bytes", + __func__, fname, (long long) sb.st_size); + } + + if (0 <= fd) + close(fd); + if (contents != NULL) + contents[sb.st_size] = '\0'; - if (stat(fname, &sb) == FAIL) { - cleanup(0); - errx(2, "%s: can't stat '%s'", __func__, fname); - } + return contents; - contents = (char *)malloc(sb.st_size + 1); - fd = open(fname, O_RDONLY, 0); - if (fd == FAIL) { - cleanup(0); - errx(2, "%s: unable to open '%s' for reading", __func__, fname); - } - if (read(fd, contents, sb.st_size) != sb.st_size) { - cleanup(0); - errx(2, "%s: short read on '%s' - did not get %lld bytes", __func__, - fname, (long long)sb.st_size); - } - close(fd); - contents[sb.st_size] = '\0'; - return contents; } /* @@ -247,96 +256,66 @@ return TRUE; } -/* Write the contents of "str" to a file */ -void +/* + * Write the contents of "str" to a file + * + * Return the number of bytes successfully written out to str or -1 on + * failure. + */ +size_t write_file(const char *name, const char *str) { - FILE *fp; - size_t len; + FILE *fp = NULL; + off_t written_len = -1; + size_t len; - fp = fopen(name, "w"); - if (!fp) { - cleanup(0); - errx(2, "%s: cannot fopen '%s' for writing", __func__, name); - } - len = strlen(str); - if (fwrite(str, 1, len, fp) != len) { - cleanup(0); - errx(2, "%s: short fwrite on '%s', tried to write %ld bytes", - __func__, name, (long)len); - } - if (fclose(fp)) { - cleanup(0); - errx(2, "%s: failure to fclose '%s'", __func__, name); - } -} + errno = 0; -void -copy_file(const char *dir, const char *fname, const char *to) -{ - char cmd[FILENAME_MAX]; + fp = fopen(name, "w"); + if (fp == NULL) + warn("%s: cannot fopen '%s' for writing", __func__, name); + else { + len = strlen(str); + written_len = fwrite(str, 1, len, fp); + if ((len-written_len) != 0) + warn("%s: short fwrite on '%s', tried to write %ld " + "bytes", __func__, name, (long) len); - if (fname[0] == '/') - snprintf(cmd, FILENAME_MAX, "/bin/cp -r %s %s", fname, to); - else - 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); - } -} + if (fp != NULL) + if (fclose(fp) != 0) + warn("%s: failed to close file: '%s'", + __func__, name); + } -void -move_file(const char *dir, const char *fname, const char *tdir) -{ - char from[FILENAME_MAX]; - char to[FILENAME_MAX]; - - if (fname[0] == '/') - strncpy(from, fname, FILENAME_MAX); - else - snprintf(from, FILENAME_MAX, "%s/%s", dir, fname); + return (size_t) (errno == 0 && written_len > 0 ? written_len : -1); - snprintf(to, FILENAME_MAX, "%s/%s", tdir, fname); - - if (rename(from, to) == -1) { - if (vsystem("/bin/mv %s %s", from, to)) { - cleanup(0); - errx(2, "%s: could not move '%s' to '%s'", __func__, from, to); - } - } } /* - * Copy a hierarchy (possibly from dir) to the current directory, or - * if "to" is TRUE, from the current directory to a location someplace - * else. + * From a path specified by `from' to the path denoted as `to'. * - * Though slower, using tar to copy preserves symlinks and everything - * without me having to write some big hairy routine to do it. + * Returns 0 on success, -1 on failure. */ -void -copy_hierarchy(const char *dir, const char *fname, Boolean to) +int +move_file(const char *dir, const char *fname, const char *tdir) { - char cmd[FILENAME_MAX * 3]; + char from[FILENAME_MAX]; + char to[FILENAME_MAX]; + int rc; + + if (fname[0] == '/') + strncpy(from, fname, sizeof(from)); + else + snprintf(from, sizeof(from), "%s/%s", dir, fname); + + snprintf(to, FILENAME_MAX, "%s/%s", tdir, fname); + + if (rename(from, to) == 0 || vsystem("/bin/mv %s %s", from, to) == 0) + rc = 0; + else + rc = -1; - if (!to) { - /* If absolute path, use it */ - if (*fname == '/') - dir = "/"; - snprintf(cmd, FILENAME_MAX * 3, "/usr/bin/tar cf - -C %s %s | /usr/bin/tar xpf -", - dir, fname); - } - else - 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 - if (system(cmd)) { - cleanup(0); - errx(2, "%s: could not perform '%s'", __func__, cmd); - } + return rc; } #define EXTRACT_ARCHIVE_FLAGS (ARCHIVE_EXTRACT_OWNER |ARCHIVE_EXTRACT_PERM| \ ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pen.c#2 (text+ko) ==== @@ -21,13 +21,15 @@ #include __FBSDID("$FreeBSD: src/lib/libpkg/pen.c,v 1.1 2010/04/23 11:07:43 flz Exp $"); -#include "pkg.h" +#include +#include +#include #include +#include #include #include -#include -#include -#include + +#include "pkg.h" /* For keeping track of where we are */ static char PenLocation[FILENAME_MAX]; @@ -42,33 +44,30 @@ static char * find_play_pen(char *pen, off_t sz) { - char *cp; - struct stat sb; - char humbuf[6]; + char *cp; + struct stat sb; - if (pen[0] && isdir(dirname(pen)) == TRUE && (min_free(dirname(pen)) >= sz)) + if (pen[0] != '\0' && isdir(dirname(pen)) == TRUE && + (min_free(dirname(pen)) >= sz)) + return pen; + else if ((cp = getenv("PKG_TMPDIR")) != NULL && stat(cp, &sb) == 0 && + (min_free(cp) >= sz)) + sprintf(pen, "%s/instmp.XXXXXX", cp); + else if ((cp = getenv("TMPDIR")) != NULL && stat(cp, &sb) == 0 && + (min_free(cp) >= sz)) + sprintf(pen, "%s/instmp.XXXXXX", cp); + else if (stat("/var/tmp", &sb) == 0 && min_free("/var/tmp") >= sz) + strcpy(pen, "/var/tmp/instmp.XXXXXX"); + else if (stat("/tmp", &sb) == 0 && min_free("/tmp") >= sz) + strcpy(pen, "/tmp/instmp.XXXXXX"); + else if ((stat("/usr/tmp", &sb) == 0 || + mkdir("/usr/tmp", 01777) == SUCCESS) && min_free("/usr/tmp") >= sz) + strcpy(pen, "/usr/tmp/instmp.XXXXXX"); + else { + errno = ENOSPC; + return NULL; + } return pen; - else if ((cp = getenv("PKG_TMPDIR")) != NULL && stat(cp, &sb) != FAIL && (min_free(cp) >= sz)) - sprintf(pen, "%s/instmp.XXXXXX", cp); - else if ((cp = getenv("TMPDIR")) != NULL && stat(cp, &sb) != FAIL && (min_free(cp) >= sz)) - sprintf(pen, "%s/instmp.XXXXXX", cp); - else if (stat("/var/tmp", &sb) != FAIL && min_free("/var/tmp") >= sz) - strcpy(pen, "/var/tmp/instmp.XXXXXX"); - else if (stat("/tmp", &sb) != FAIL && min_free("/tmp") >= sz) - strcpy(pen, "/tmp/instmp.XXXXXX"); - else if ((stat("/usr/tmp", &sb) == SUCCESS || mkdir("/usr/tmp", 01777) == SUCCESS) && min_free("/usr/tmp") >= sz) - strcpy(pen, "/usr/tmp/instmp.XXXXXX"); - else { - cleanup(0); - humanize_number(humbuf, sizeof humbuf, sz, "", HN_AUTOSCALE, - HN_NOSPACE); - errx(2, -"%s: can't find enough temporary space to extract the files, please set your\n" -"PKG_TMPDIR environment variable to a location with at least %s bytes\n" -"free", __func__, humbuf); - return NULL; - } - return pen; } #define MAX_STACK 20 @@ -103,67 +102,61 @@ const char * make_playpen(char *pen, off_t sz) { - char humbuf[6]; - char cwd[FILENAME_MAX]; + char cwd[FILENAME_MAX]; + const char *pen_location = NULL; - if (!find_play_pen(pen, sz)) - return NULL; + if (find_play_pen(pen, sz) != NULL && mkdtemp(pen) == 0) { - if (!mkdtemp(pen)) { - cleanup(0); - errx(2, "%s: can't mktemp '%s'", __func__, pen); - } + if (min_free(pen) < sz) { + rmdir(pen); + errno = ENOSPC; + } + else if (getcwd(cwd, FILENAME_MAX) == 0 && chdir(pen) == 0) { + strcpy(PenLocation, pen); + pen_location = pushPen(cwd); + } - humanize_number(humbuf, sizeof humbuf, sz, "", HN_AUTOSCALE, HN_NOSPACE); + } - if (min_free(pen) < sz) { - rmdir(pen); - cleanup(0); - errx(2, "%s: not enough free space to create '%s'.\n" - "Please set your PKG_TMPDIR environment variable to a location\n" - "with at least %s and try the command again", - __func__, humbuf, pen); - } + return pen_location; - if (!getcwd(cwd, FILENAME_MAX)) { - upchuck("getcwd"); - return NULL; - } - - if (chdir(pen) == FAIL) { - cleanup(0); - errx(2, "%s: can't chdir to '%s'", __func__, pen); - } - - strcpy(PenLocation, pen); - return pushPen(cwd); } /* Convenience routine for getting out of playpen */ int leave_playpen() { - static char left[FILENAME_MAX]; - void (*oldsig)(int); + void (*oldsig)(int); + static char left[FILENAME_MAX]; + int rc = -1; + + if (PenLocation[0] == '\0') + rc = 0; + else { + + /* Don't interrupt while we're cleaning up */ + oldsig = signal(SIGINT, SIG_IGN); + strcpy(left, PenLocation); + popPen(PenLocation); + + if (chdir(PenLocation) == 0) { + + if (left[0] == '/' && + vsystem("/bin/rm -rf %s", left)) { + warnx("couldn't remove temporary dir '%s'", + left); + } + + rc = 1; - if (!PenLocation[0]) - return 0; + } - /* Don't interrupt while we're cleaning up */ - oldsig = signal(SIGINT, SIG_IGN); - strcpy(left, PenLocation); - popPen(PenLocation); + signal(SIGINT, oldsig); - if (chdir(PenLocation) == FAIL) { - cleanup(0); - errx(2, "%s: can't chdir back to '%s'", __func__, PenLocation); - } + } - if (left[0] == '/' && vsystem("/bin/rm -rf %s", left)) - warnx("couldn't remove temporary dir '%s'", left); - signal(SIGINT, oldsig); + return rc; - return 1; } off_t ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#8 (text+ko) ==== @@ -155,7 +155,6 @@ /* Misc */ int vsystem(const char *, ...); char *vpipe(const char *, ...); -void cleanup(int); const char *make_playpen(char *, off_t); char *where_playpen(void); int leave_playpen(void); @@ -183,22 +182,15 @@ const char *fileGetURL(const char *, const char *, int); char *fileFindByPath(const char *, const char *); char *fileGetContents(const char *); -void write_file(const char *, const char *); -void copy_file(const char *, const char *, const char *); -void move_file(const char *, const char *, const char *); -void copy_hierarchy(const char *, const char *, Boolean); +size_t write_file(const char *, const char *); +int move_file(const char *, const char *, const char *); int delete_hierarchy(const char *, Boolean, Boolean); char* unpack_to_buffer(const char *, const char *); int unpack_to_disk(const char *, const char *); int unpack_to_fd(const char *, const char *); -void format_cmd(char *, int, const char *, const char *, const char *); +void format_cmd(char *, int, const char *, const char *, + const char *); -/* Msg */ -void upchuck(const char *); -void barf(const char *, ...); -void whinge(const char *, ...); -Boolean y_or_n(Boolean, const char *, ...); - /* Packing list */ PackingList new_plist_entry(void); PackingList last_plist(Package *); @@ -211,8 +203,8 @@ void add_plist(Package *, plist_t, const char *); void add_plist_top(Package *, plist_t, const char *); void delete_plist(Package *pkg, Boolean all, plist_t type, const char *name); -void write_plist(Package *, FILE *); -void read_plist(Package *, int); +int write_plist(Package *, FILE *); +int read_plist(Package *, int); int plist_cmd(const char *, char **); int delete_package(Boolean, Boolean, Package *); Boolean make_preserve_name(char *, int, const char *, const char *); ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/tools/regression/lib/libpkg/tests/test_unpack.py#2 (text+ko) ==== @@ -1,7 +1,6 @@ #!/usr/bin/env python import ctypes -#from nose import import tarfile import tempfile import tests ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/extract.c#3 (text+ko) ==== @@ -26,6 +26,7 @@ #include #include "add.h" +extern void cleanup(int); #define STARTSTRING "/usr/bin/tar cf -" #define TOOBIG(str) \ ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/perform.c#11 (text+ko) ==== @@ -30,10 +30,12 @@ #include #include -static int pkg_do(char *); -static int sanity_check(char *); -static char LogDir[FILENAME_MAX]; -static int zapLogDir; /* Should we delete LogDir? */ +void cleanup(int); +static int pkg_do(char *); +static int sanity_check(char *); + +static char LogDir[FILENAME_MAX]; +static int zapLogDir; /* Should we delete LogDir? */ int pkg_perform(char **pkgs) @@ -74,6 +76,7 @@ int cfile; int code; int inPlace, conflictsfound, errcode; + int rc; /* support for separate pre/post install scripts */ int new_m = 0; int fd; @@ -95,7 +98,8 @@ warnx("pkg_add in SLAVE mode can't chdir to %s", playpen); return 1; } - read_plist(&Plist, fileno(stdin)); + if (read_plist(&Plist, fileno(stdin)) != 0) + return 1; where_to = playpen; } /* Nope - do it now */ @@ -104,6 +108,7 @@ if (isURL(pkg)) { if (!(where_to = fileGetURL(NULL, pkg, KeepPackage))) { warnx("unable to fetch '%s' by URL", pkg); + cleanup(0); return 1; } cfile = open(CONTENTS_FNAME, O_RDONLY); @@ -113,8 +118,10 @@ CONTENTS_FNAME); goto bomb; } - read_plist(&Plist, cfile); + rc = read_plist(&Plist, cfile); close(cfile); + if (rc != 0) + goto bomb; } else { @@ -133,7 +140,7 @@ goto bomb; } } - if (!(where_to = make_playpen(playpen, sb.st_size * 4))) + if ((where_to = make_playpen(playpen, sb.st_size * 4)) == NULL) errx(1, "unable to make playpen for %lld bytes", (long long)sb.st_size * 4); /* Since we can call ourselves recursively, keep notes on where we came from */ if (!getenv("_TOP")) @@ -155,8 +162,10 @@ CONTENTS_FNAME); goto bomb; } - read_plist(&Plist, cfile); + rc = read_plist(&Plist, cfile); close(cfile); + if (rc != 0) + goto bomb; /* Extract directly rather than moving? Oh goodie! */ if (find_plist_option(&Plist, "extract-in-place")) { @@ -217,7 +226,8 @@ /* If we're running in MASTER mode, just output the plist and return */ if (AddMode == MASTER) { printf("%s\n", where_playpen()); - write_plist(&Plist, stdout); + if (write_plist(&Plist, stdout) != 0) + return 1; return 0; } } @@ -369,26 +379,37 @@ ++code; } } - else if ((cp = fileGetURL(pkg, p->name, KeepPackage)) != NULL) { - if (Verbose) - printf("Finished loading %s via a URL\n", p->name); - if (!fexists(CONTENTS_FNAME)) { - warnx("autoloaded package %s has no %s file?", + else { + + if ((cp = fileGetURL(pkg, p->name, KeepPackage)) == NULL) { + cleanup(0); + warnx("Getting pkg '%s' by URL failed", pkg); + goto bomb; + } else { + + if (Verbose) + printf("Finished loading %s via a URL\n", p->name); + if (!fexists(CONTENTS_FNAME)) { + warnx("autoloaded package %s has no %s file?", p->name, CONTENTS_FNAME); - if (!Force) - ++code; - } - else if (vsystem("(pwd; /bin/cat " CONTENTS_FNAME ") | %s %s %s %s -S", PkgAddCmd, Verbose ? "-v" : "", PrefixRecursive ? prefixArg : "", KeepPackage ? "-K" : "")) { - warnx("pkg_add of dependency '%s' failed%s", + if (!Force) + ++code; + } + else if (vsystem("(pwd; /bin/cat " CONTENTS_FNAME ") | %s %s %s %s -S", PkgAddCmd, Verbose ? "-v" : "", PrefixRecursive ? prefixArg : "", KeepPackage ? "-K" : "")) { + warnx("pkg_add of dependency '%s' failed%s", p->name, Force ? " (proceeding anyway)" : "!"); - if (!Force) - ++code; + if (!Force) + ++code; + } + else if (Verbose) + printf("\t'%s' loaded successfully.\n", p->name); + /* Nuke the temporary playpen */ + leave_playpen(); + } - else if (Verbose) - printf("\t'%s' loaded successfully.\n", p->name); - /* Nuke the temporary playpen */ - leave_playpen(); + } + } else { if (Verbose) @@ -491,10 +512,10 @@ /* Time to record the deed? */ if (!NoRecord && !Fake) { + FILE *contfile; char contents[FILENAME_MAX]; char **depnames = NULL, **deporigins = NULL, ***depmatches; - int i, dep_count = 0; - FILE *contfile; + int i, dep_count = 0, rc; if (getuid() != 0) warnx("not running as root - trying to record install anyway"); @@ -510,26 +531,38 @@ goto success; /* close enough for government work */ } /* Make sure pkg_info can read the entry */ + + /* XXX (gcooper) fix return code checks. */ fd = open(LogDir, O_RDWR); fstat(fd, &sb); fchmod(fd, sb.st_mode | S_IRALL | S_IXALL); /* be sure, chmod a+rx */ close(fd); - move_file(".", DESC_FNAME, LogDir); + if (move_file(".", DESC_FNAME, LogDir) == -1) { + cleanup(0); + errx(EXIT_FAILURE, "failed to move %s to %s", 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); + +#define MOVE_IF_PRESENT(file) \ + do { \ + if (fexists(file)) { \ + if (move_file(".", file, LogDir) == -1) { \ + cleanup(0); \ + errx(EXIT_FAILURE, \ + "failed to move '%s' to '%s'", \ + file, LogDir); \ + } \ + } \ + } while (0) + + MOVE_IF_PRESENT(INSTALL_FNAME); + MOVE_IF_PRESENT(POST_INSTALL_FNAME); + MOVE_IF_PRESENT(POST_INSTALL_FNAME); + MOVE_IF_PRESENT(DEINSTALL_FNAME); + MOVE_IF_PRESENT(POST_DEINSTALL_FNAME); + MOVE_IF_PRESENT(REQUIRE_FNAME); + MOVE_IF_PRESENT(DISPLAY_FNAME); + MOVE_IF_PRESENT(MTREE_FNAME); sprintf(contents, "%s/%s", LogDir, CONTENTS_FNAME); contfile = fopen(contents, "w"); if (!contfile) { @@ -537,8 +570,10 @@ contents); goto success; /* can't log, but still keep pkg */ } - write_plist(&Plist, contfile); + rc = write_plist(&Plist, contfile); fclose(contfile); + if (rc != 0) + goto fail; for (p = Plist.head; p ; p = p->next) { char *deporigin; ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/perform.c#27 (text+ko) ==== @@ -46,12 +46,14 @@ #include #include "create.h" -static void sanity_check(void); +void cleanup(int); + +static void sanity_check(void); static const char* add_file(struct archive *, const char *, const char *, const int); -static void make_dist(const char *, const char *, const char *, Package *); -static int create_from_installed_recursive(const char *, const char *); -static int create_from_installed(const char *, const char *, const char *); +static void make_dist(const char *, const char *, const char *, Package *); +static int create_from_installed_recursive(const char *, const char *); +static int create_from_installed(const char *, const char *, const char *); int pkg_perform(char **pkgs) @@ -63,6 +65,7 @@ char *cp; int len; int pkg_in; + int rc; const char *suf; /* Preliminary setup */ @@ -219,7 +222,10 @@ } /* Slurp in the packing list */ - read_plist(&plist, pkg_in); + if (read_plist(&plist, pkg_in) != 0) { + close(pkg_in); + return FALSE; + } /* Prefix should add an @cwd to the packing list */ if (Prefix) @@ -250,12 +256,14 @@ */ if (PlistOnly) { check_list(home, &plist); - write_plist(&plist, stdout); - exit(0); + exit(write_plist(&plist, stdout) == 0 ? 0 : 1); } /* Make a directory to stomp around in */ - home = make_playpen(PlayPen, 0); + if ((home = make_playpen(PlayPen, 0)) == NULL) { + cleanup(0); + errx(EXIT_FAILURE, "failed to create a playpen"); + } signal(SIGINT, cleanup); signal(SIGHUP, cleanup); @@ -272,14 +280,24 @@ if (Prefix == NULL) add_plist(&plist, PLIST_CWD, "."); - 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 (write_file(COMMENT_FNAME, Comment) == 0) { + add_plist(&plist, PLIST_IGNORE, NULL); + add_plist(&plist, PLIST_FILE, COMMENT_FNAME); + add_cksum(&plist, plist.tail, COMMENT_FNAME); + } + else { + cleanup(0); + err(EXIT_FAILURE, "failed to write comment file"); + } + if (write_file(DESC_FNAME, Desc) == 0) { + add_plist(&plist, PLIST_IGNORE, NULL); + add_plist(&plist, PLIST_FILE, DESC_FNAME); + add_cksum(&plist, plist.tail, DESC_FNAME); + } + else { + cleanup(0); + err(EXIT_FAILURE, "failed to write description file"); + } if (Install != NULL) { add_plist(&plist, PLIST_IGNORE, NULL); @@ -323,12 +341,15 @@ fp = fopen(CONTENTS_FNAME, "w"); if (!fp) { cleanup(0); - err(2, "%s: can't open file %s for writing", __func__, CONTENTS_FNAME); + errx(2, "%s: can't open file %s for writing", __func__, CONTENTS_FNAME); } - write_plist(&plist, fp); + rc = write_plist(&plist, fp); if (fclose(fp)) { cleanup(0); - err(2, "%s: error occurred when closing %s", __func__, CONTENTS_FNAME); + errx(2, "%s: error occurred when closing %s", __func__, CONTENTS_FNAME); + } else if (rc != 0) { + cleanup(0); + errx(2, "%s: couldn't write to %s", __func__, CONTENTS_FNAME); } /* And stick it into a tarball */ @@ -775,82 +796,96 @@ Package plist; PackingList p; char tmp[PATH_MAX]; - int fd; - int rval; + int fd, rc; + int rval = FALSE; if (!create_from_installed(InstalledPkg, pkg, suf)) - return FALSE; + return rval; snprintf(tmp, sizeof(tmp), "%s/%s/%s", LOG_DIR, InstalledPkg, CONTENTS_FNAME); if (!fexists(tmp)) { warnx("can't find package '%s' installed!", InstalledPkg); - return FALSE; + return rval; } /* Suck in the contents list */ plist.head = plist.tail = NULL; fd = open(tmp, O_RDONLY); if (fd == -1) { warn("unable to open %s file", tmp); - return FALSE; + return rval; } - read_plist(&plist, fd); + rc = read_plist(&plist, fd); close(fd); - rval = TRUE; - for (p = plist.head; p != NULL && rval == TRUE; p = p->next) { - if (p->type == PLIST_PKGDEP) { - if (Verbose) - printf("Creating package %s\n", p->name); - if (!create_from_installed(p->name, p->name, suf)) - rval = FALSE; + if (rc == 0) { + + rval = TRUE; + + for (p = plist.head; p != NULL && rval == TRUE; p = p->next) { + + if (p->type == PLIST_PKGDEP) { + if (Verbose) + printf("Creating package %s\n", + p->name); + if (!create_from_installed(p->name, p->name, + suf)) + rval = FALSE; + } + } + + free_plist(&plist); + } - free_plist(&plist); + return rval; } static int create_from_installed(const char *ipkg, const char *pkg, const char *suf) { - int fd; - Package plist; - char homedir[MAXPATHLEN], log_dir[FILENAME_MAX]; + Package plist; + int fd, rc; + char homedir[MAXPATHLEN], log_dir[FILENAME_MAX]; + + snprintf(log_dir, sizeof(log_dir), "%s/%s", LOG_DIR, ipkg); + if (!fexists(log_dir)) { + warnx("can't find package '%s' installed!", ipkg); + return FALSE; + } + getcwd(homedir, sizeof(homedir)); + if (chdir(log_dir) == FAIL) { + warnx("can't change directory to '%s'!", log_dir); + return FALSE; + } + /* Suck in the contents list */ + plist.head = plist.tail = NULL; + fd = open(CONTENTS_FNAME, O_RDONLY); + if (fd == -1) { + warnx("unable to open %s file", CONTENTS_FNAME); + return FALSE; + } + rc = read_plist(&plist, fd); + (void) close(fd); - snprintf(log_dir, sizeof(log_dir), "%s/%s", LOG_DIR, ipkg); - if (!fexists(log_dir)) { - warnx("can't find package '%s' installed!", ipkg); - return FALSE; - } - getcwd(homedir, sizeof(homedir)); - if (chdir(log_dir) == FAIL) { - warnx("can't change directory to '%s'!", log_dir); - return FALSE; - } - /* Suck in the contents list */ - plist.head = plist.tail = NULL; - fd = open(CONTENTS_FNAME, O_RDONLY); - if (fd == -1) { - warnx("unable to open %s file", CONTENTS_FNAME); - return FALSE; - } - read_plist(&plist, fd); - (void) close(fd); + if (rc != 0) + return FALSE; - 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; + 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); + make_dist(homedir, pkg, suf, &plist); - free_plist(&plist); - if (chdir(homedir) == FAIL) { - warnx("can't change directory to '%s'!", homedir); - return FALSE; - } - return TRUE; + free_plist(&plist); + if (chdir(homedir) == FAIL) { + warnx("can't change directory to '%s'!", homedir); + return FALSE; + } + return TRUE; } ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/pl.c#3 (text+ko) ==== @@ -21,11 +21,15 @@ #include __FBSDID("$FreeBSD: src/usr.sbin/pkg_install/create/pl.c,v 1.29 2010/04/23 11:07:43 flz Exp $"); -#include -#include "create.h" +#include #include #include #include +#include + +#include "create.h" + +extern void cleanup(int); /* Add an MD5 checksum entry for a file or link */ void ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/perform.c#5 (text+ko) ==== >>> TRUNCATED FOR MAIL (1000 lines) <<<