PERFORCE change 178374 for review
Garrett Cooper
gcooper at FreeBSD.org
Mon May 17 09:35:08 UTC 2010
http://p4web.freebsd.org/@@178374?ac=10
Change 178374 by gcooper at 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;
}
More information about the p4-projects
mailing list