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