Date: Mon, 17 May 2010 09:35:07 GMT From: Garrett Cooper <gcooper@FreeBSD.org> To: Perforce Change Reviews <perforce@FreeBSD.org> Subject: PERFORCE change 178374 for review Message-ID: <201005170935.o4H9Z7G2094040@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@178374?ac=10 Change 178374 by gcooper@gcooper-bayonetta on 2010/05/17 09:35:04 Get rid of all references to cleanup within fileGetUrl(). Affected files ... .. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/url.c#2 edit Differences ... ==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/url.c#2 (text+ko) ==== @@ -35,137 +35,149 @@ const char * fileGetURL(const char *base, const char *spec, int keep_package) { - const char *rp; - char *cp, *tmp; - char fname[FILENAME_MAX]; - char pen[FILENAME_MAX]; - char pkg[FILENAME_MAX]; - char buf[8192]; - FILE *ftp; - pid_t tpid; - int pfd[2], pstat, r, w = 0; - char *hint; - int fd, pkgfd = 0; + FILE *ftp = NULL; + const char *rp = NULL; + char *cp, *hint, *tmp; + char fname[FILENAME_MAX]; + char pen[FILENAME_MAX]; + char pkg[FILENAME_MAX]; + char buf[8192]; + int fd = -1, pkgfd = -1; + int pfd[2], pstat, r, w = 0; + pid_t tpid; + + rp = NULL; + /* Special tip that sysinstall left for us */ + hint = getenv("PKG_ADD_BASE"); + if (!isURL(spec)) { + /* + * 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 != NULL) { + + 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 != NULL) { + *(cp + 1) = '\0'; + strcat(cp, "All/"); + strcat(cp, spec); + strcat(cp, ".tbz"); + } + else + return NULL; + } + else if (hint != NULL) { + /* + * Otherwise, we've been given an environment variable + * hinting at the right location from sysinstall + */ + strcpy(fname, hint); + strcat(fname, spec); + strcat(fname, ".tbz"); + + } + else + return NULL; - 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, ".tbz"); - } - 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, ".tbz"); + else + strcpy(fname, spec); + + if (keep_package) { + + tmp = getenv("PKGDIR"); + strlcpy(pkg, tmp ? tmp : ".", sizeof(pkg)); + tmp = basename(fname); + strlcat(pkg, "/", sizeof(pkg)); + strlcat(pkg, tmp, sizeof(pkg)); + + if ((pkgfd = open(pkg, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) { + warn("Error: Unable to open %s", pkg); + return NULL; + } + } - } - else - strcpy(fname, spec); - if (keep_package) { - tmp = getenv("PKGDIR"); - strlcpy(pkg, tmp ? tmp : ".", sizeof(pkg)); - tmp = basename(fname); - strlcat(pkg, "/", sizeof(pkg)); - strlcat(pkg, tmp, sizeof(pkg)); - if ((pkgfd = open(pkg, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1) { - printf("Error: Unable to open %s\n", pkg); - perror("open"); - return NULL; + fetchDebug = (Verbose > 0); + if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) { + warnx("Error: Unable to get %s: %s\n", fname, + fetchLastErrString); + /* If the fetch fails, yank the package. */ + if (keep_package && unlink(pkg) < 0) { + warnx("failed to remove partially fetched package: %s", + pkg); + } + return NULL; } - } - fetchDebug = (Verbose > 0); - if ((ftp = fetchGetURL(fname, Verbose ? "v" : NULL)) == NULL) { - printf("Error: Unable to get %s: %s\n", - fname, fetchLastErrString); - /* If the fetch fails, yank the package. */ - if (keep_package && unlink(pkg) < 0) { - warnx("failed to remove partially fetched package: %s", pkg); + if (isatty(0) || Verbose) { + printf("Fetching %s...", fname); + fflush(stdout); } - return NULL; - } + pen[0] = '\0'; + if ((rp = make_playpen(pen, 0)) == NULL) + warn("Error: Unable to construct a new playpen for FTP!"); + else if (pipe(pfd) == -1) + warn("pipe()"); + else + switch ((tpid = fork())) { + case -1: + warn("fork()"); + break; + case 0: + dup2(pfd[0], 0); + for (fd = getdtablesize() - 1; fd >= 3; --fd) + close(fd); + execl("/usr/bin/tar", "tar", + Verbose ? "-xpjvf" : "-xpjf", "-", (char *)0); + _exit(2); + default: + close(pfd[0]); + + for (;;) { + + if ((r = fread(buf, 1, sizeof(buf), ftp)) < 1) + break; + if ((w = write(pfd[1], buf, r)) != r) + break; + if (keep_package) + if ((w = write(pkgfd, buf, r)) != r) + break; + + } + if (w == -1) + warn("warning: error writing to tar"); + if (ferror(ftp)) + warn("warning: error reading from server"); + + close(pfd[1]); + tpid = waitpid(tpid, &pstat, 0); + if (Verbose) + printf("tar command returned %d status\n", + WEXITSTATUS(pstat)); + if (rp != NULL && (isatty(0) || Verbose)) + printf(" Done.\n"); + break; + } + + if (0 < fd) + close(fd); + if (ftp != NULL) + fclose(ftp); + if (0 < pkgfd) + close(pkgfd); + + return rp; - 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 ? "-xpjvf" : "-xpjf", - "-", (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 (keep_package) { - if ((w = write(pkgfd, buf, r)) != r) - break; - } - } - if (ferror(ftp)) - warn("warning: error reading from server"); - fclose(ftp); - if (keep_package) { - close(pkgfd); - } - 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; }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201005170935.o4H9Z7G2094040>