PERFORCE change 178293 for review

Garrett Cooper gcooper at FreeBSD.org
Sat May 15 08:13:19 UTC 2010


http://p4web.freebsd.org/@@178293?ac=10

Change 178293 by gcooper at starr-bastion on 2010/05/15 08:13:07

	GOOD BYE AND GOOD RIDDANCE BUFFERED read_plist!
	
	This is one big(ish) step towards a sane solution.

Affected files ...

.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#13 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#7 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/plist.c#2 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/perform.c#10 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/perform.c#26 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/perform.c#4 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/perform.c#5 edit
.. //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/version/perform.c#9 edit

Differences ...

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/file.c#13 (text+ko) ====

@@ -356,13 +356,13 @@
 unpack_to_buffer(const char *pkg, const char *file)
 {
 
-	FILE *fd = NULL;
+	struct stat sb;
 	char *buf = NULL; 
-	struct stat sb;
+	int fd;
 
-	if ((fd = unpack_to_fd(pkg, file)) != NULL) {
+	if ((fd = unpack_to_fd(pkg, file)) != -1) {
 
-		if (fstat(fileno(fd), &sb) == 0) {
+		if (fstat(fd, &sb) == 0) {
 
 			/*
 			 * User either passed in a non-NULL value or we need
@@ -371,15 +371,16 @@
 			 */
 			buf = malloc(sb.st_size);
 			if (buf != NULL) {
-				if (fread(buf, sb.st_size, 1, fd) !=
-				    sb.st_size) {
+				if (read(fd, buf, sb.st_size) != sb.st_size)
 					free(buf);
-				}	
 			}
 
 		}
 	}
 
+	if (fd != -1)
+		close(fd);
+
 	return buf;
 
 }
@@ -504,21 +505,9 @@
  * as to reduce the number of required steps needed when unpacking a tarball on
  * disk, as the previous method employed with tar(1) used -q // --fast-read .
  *
- * Return NULL on failure, and non-NULL on success
- *
- * XXX (gcooper): this is currently implemented with FILE* / fopen(3) due to
- * legacy issues that need to be sorted out over the next couple of weeks for
- * 1) locking to function properly, and to gain the potential performance boost
- * by using mmap(2), and read(2) (ugh).
- *
- * But first things first, we need a working solution with minimal changes;
- * then we move on from there.
- *
- * [The return code info will eventually be...]
- *
  * Return -1 on failure, a value greater than 0 on success.
  */
-FILE*
+int
 unpack_to_fd(const char *pkg, const char *file)
 {
 	struct archive *archive;
@@ -529,7 +518,7 @@
 	const char *error = NULL;
 	const char *pkg_name_humanized;
 
-	FILE *fd = NULL;
+	int fd = -1;
 	/* int fd = -1; */
 	int archive_fd = -1, r;
 
@@ -592,7 +581,7 @@
 					if (Verbose)
 						printf("X - %s\n",
 						    entry_pathname);
-					fd = fopen(entry_pathname, "r");
+					fd = open(entry_pathname, O_RDONLY);
 				} else {
 					error = archive_error_string(archive);
 					warnx("%s: extraction for %s failed: "

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/lib/libpkg/pkg.h#7 (text+ko) ====

@@ -190,7 +190,7 @@
 int		delete_hierarchy(const char *, Boolean, Boolean);
 char*		unpack_to_buffer(const char *, const char *);
 int		unpack_to_disk(const char *, const char *);
-FILE*		unpack_to_fd(const char *, const char *);
+int		unpack_to_fd(const char *, const char *);
 void		format_cmd(char *, int, const char *, const char *, const char *);
 
 /* Msg */
@@ -212,7 +212,7 @@
 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 *, FILE *);
+void		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/lib/libpkg/plist.c#2 (text+ko) ====

@@ -21,10 +21,14 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/lib/libpkg/plist.c,v 1.1 2010/04/23 11:07:43 flz Exp $");
 
-#include "pkg.h"
+#include <sys/types.h>
+#include <sys/uio.h>
+#include <unistd.h>
 #include <err.h>
 #include <md5.h>
 
+#include "pkg.h"
+
 /* Add an item to a packing list */
 void
 add_plist(Package *p, plist_t type, const char *arg)
@@ -257,7 +261,7 @@
 
 /* Read a packing list from a file */
 void
-read_plist(Package *pkg, FILE *fp)
+read_plist(Package *pkg, int fd)
 {
     char *cp, pline[FILENAME_MAX];
     int cmd, major, minor;
@@ -265,7 +269,9 @@
     pkg->fmtver_maj = 1;
     pkg->fmtver_mnr = 0;
     pkg->origin = NULL;
-    while (fgets(pline, FILENAME_MAX, fp)) {
+
+    /* XXX (gcooper): BAD BAD BAD -- this can be longer than FILENAME_MAX */
+    while (0 < read(fd, pline, FILENAME_MAX)) {
 	int len = strlen(pline);
 
 	while (len && isspace(pline[len - 1]))

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/add/perform.c#10 (text+ko) ====

@@ -71,7 +71,7 @@
     char **matched;
     char *extract;
     const char *where_to;
-    FILE *cfile;
+    int cfile;
     int code;
     int inPlace, conflictsfound, errcode;
     /* support for separate pre/post install scripts */
@@ -95,7 +95,7 @@
 	    warnx("pkg_add in SLAVE mode can't chdir to %s", playpen);
 	    return 1;
 	}
-	read_plist(&Plist, stdin);
+	read_plist(&Plist, fileno(stdin));
 	where_to = playpen;
     }
     /* Nope - do it now */
@@ -106,15 +106,15 @@
 		warnx("unable to fetch '%s' by URL", pkg);
 		return 1;
 	    }
-	    cfile = fopen(CONTENTS_FNAME, "r");
-	    if (!cfile) {
+	    cfile = open(CONTENTS_FNAME, O_RDONLY);
+	    if (cfile == -1) {
 		warnx(
 		"unable to open table of contents file '%s' - not a package?",
 		CONTENTS_FNAME);
 		goto bomb;
 	    }
 	    read_plist(&Plist, cfile);
-	    fclose(cfile);
+	    close(cfile);
 	}
 	else {
 
@@ -140,7 +140,7 @@
 		setenv("_TOP", where_to, 1);
 	    if (extract_whole_archive_from_stdin == TRUE) {
 		if (unpack_to_disk(NULL, NULL) == 0)
-		    cfile = fopen(CONTENTS_FNAME, "r");
+		    cfile = open(CONTENTS_FNAME, O_RDONLY);
 		else {
 		    warnx("unable to extract table of contents file from '%s' "
 			"- not a package?", pkg);
@@ -149,14 +149,14 @@
 	    } else
 		cfile = unpack_to_fd(pkg, CONTENTS_FNAME);
 
-	    if (!cfile) {
+	    if (cfile == -1) {
 		warnx(
 	"unable to open table of contents file '%s' - not a package?",
 		CONTENTS_FNAME);
 		goto bomb;
 	    }
 	    read_plist(&Plist, cfile);
-	    fclose(cfile);
+	    close(cfile);
 
 	    /* Extract directly rather than moving?  Oh goodie! */
 	    if (find_plist_option(&Plist, "extract-in-place")) {

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/create/perform.c#26 (text+ko) ====

@@ -31,6 +31,7 @@
 #include <assert.h>
 #include <err.h>
 #include <errno.h>
+#include <fcntl.h>
 #include <libgen.h>
 #include <limits.h>
 #include <signal.h>
@@ -55,12 +56,13 @@
 int
 pkg_perform(char **pkgs)
 {
+    Package plist;
+    FILE *fp;
     static const char *home;
     char *pkg = *pkgs;		/* Only one arg to create */
     char *cp;
-    FILE *pkg_in, *fp;
-    Package plist;
     int len;
+    int pkg_in;
     const char *suf;
 
     /* Preliminary setup */
@@ -135,10 +137,10 @@
     get_dash_string(&Comment);
     get_dash_string(&Desc);
     if (!strcmp(Contents, "-"))
-	pkg_in = stdin;
+	pkg_in = fileno(stdin);
     else {
-	pkg_in = fopen(Contents, "r");
-	if (!pkg_in) {
+	pkg_in = open(Contents, O_RDONLY);
+	if (pkg_in == -1) {
 	    cleanup(0);
 	    errx(2, "%s: unable to open contents file '%s' for input",
 		__func__, Contents);
@@ -770,10 +772,10 @@
 static int
 create_from_installed_recursive(const char *pkg, const char *suf)
 {
-	FILE *fp;
 	Package plist;
 	PackingList p;
 	char tmp[PATH_MAX];
+	int fd;
 	int rval;
 
 	if (!create_from_installed(InstalledPkg, pkg, suf))
@@ -786,13 +788,13 @@
 	}
 	/* Suck in the contents list */
 	plist.head = plist.tail = NULL;
-	fp = fopen(tmp, "r");
-	if (fp == NULL) {
-		warnx("unable to open %s file", tmp);
+	fd = open(tmp, O_RDONLY);
+	if (fd == -1) {
+		warn("unable to open %s file", tmp);
 		return FALSE;
 	}
-	read_plist(&plist, fp);
-	fclose(fp);
+	read_plist(&plist, fd);
+	close(fd);
 	rval = TRUE;
 	for (p = plist.head; p != NULL && rval == TRUE; p = p->next) {
 		if (p->type == PLIST_PKGDEP) {
@@ -809,7 +811,7 @@
 static int
 create_from_installed(const char *ipkg, const char *pkg, const char *suf)
 {
-    FILE *fp;
+    int fd;
     Package plist;
     char homedir[MAXPATHLEN], log_dir[FILENAME_MAX];
 
@@ -825,13 +827,13 @@
     }
     /* Suck in the contents list */
     plist.head = plist.tail = NULL;
-    fp = fopen(CONTENTS_FNAME, "r");
-    if (!fp) {
+    fd = open(CONTENTS_FNAME, O_RDONLY);
+    if (fd == -1) {
 	warnx("unable to open %s file", CONTENTS_FNAME);
 	return FALSE;
     }
-    read_plist(&plist, fp);
-    fclose(fp);
+    read_plist(&plist, fd);
+    (void) close(fd);
 
     Install = isfile(INSTALL_FNAME) ? (char *)INSTALL_FNAME : NULL;
     PostInstall = isfile(POST_INSTALL_FNAME) ?

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/delete/perform.c#4 (text+ko) ====

@@ -121,9 +121,9 @@
 static int
 pkg_do(char *pkg)
 {
-    FILE *cfile;
     char *deporigin, **deporigins = NULL, **depnames = NULL, ***depmatches, home[FILENAME_MAX];
     PackingList p;
+    int cfile;
     int i, len;
     int isinstalled;
     /* support for separate pre/post install scripts */
@@ -202,9 +202,9 @@
     }
 
     sanity_check(LogDir);
-    cfile = fopen(CONTENTS_FNAME, "r");
+    cfile = open(CONTENTS_FNAME, O_RDONLY);
 
-    if (!cfile) {
+    if (cfile == -1) {
 	warnx("unable to open '%s' file", CONTENTS_FNAME);
 	return 1;
     }
@@ -213,7 +213,7 @@
     if (Prefix)
 	add_plist(&Plist, PLIST_CWD, Prefix);
     read_plist(&Plist, cfile);
-    fclose(cfile);
+    (void) close(cfile);
     p = find_plist(&Plist, PLIST_CWD);
 
     if (!p) {

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/info/perform.c#5 (text+ko) ====

@@ -21,10 +21,13 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD: src/usr.sbin/pkg_install/info/perform.c,v 1.57 2010/04/23 11:07:43 flz Exp $");
 
+#include <err.h>
+#include <fcntl.h>
+#include <signal.h>
+
 #include <pkg.h>
+
 #include "info.h"
-#include <err.h>
-#include <signal.h>
 
 static int pkg_do(char *);
 static int find_pkg(struct which_head *);
@@ -92,10 +95,10 @@
     char log_dir[FILENAME_MAX];
     char fname[FILENAME_MAX];
     Package plist;
-    FILE *fp;
     struct stat sb;
     const char *cp = NULL;
     int code = 0;
+    int fd = -1;
 
     if (isURL(pkg)) {
 	if ((cp = fileGetURL(NULL, pkg, KeepPackage)) != NULL) {
@@ -164,15 +167,15 @@
 
     /* Suck in the contents list */
     plist.head = plist.tail = NULL;
-    fp = fopen(CONTENTS_FNAME, "r");
-    if (!fp) {
+    fd = open(CONTENTS_FNAME, O_RDONLY);
+    if (fd == -1) {
 	warnx("unable to open %s file", CONTENTS_FNAME);
 	code = 1;
 	goto bail;
     }
     /* If we have a prefix, add it now */
-    read_plist(&plist, fp);
-    fclose(fp);
+    read_plist(&plist, fd);
+    close(fd);
 
     /*
      * Index is special info type that has to override all others to make
@@ -368,7 +371,7 @@
         return errcode;
  
     for (i = 0; installed[i] != NULL; i++) {
-     	FILE *fp;
+     	int fd;
      	Package pkg;
      	PackingList itr;
      	char *cwd = NULL;
@@ -376,15 +379,15 @@
 
 	snprintf(tmp, PATH_MAX, "%s/%s/%s", LOG_DIR, installed[i],
 		 CONTENTS_FNAME);
-	fp = fopen(tmp, "r");
-	if (fp == NULL) {
+	fd = open(tmp, O_RDONLY);
+	if (fd == -1) {
 	    warn("%s", tmp);
 	    return 1;
 	}
 
 	pkg.head = pkg.tail = NULL;
-	read_plist(&pkg, fp);
-	fclose(fp);
+	read_plist(&pkg, fd);
+	close(fd);
 	for (itr = pkg.head; itr != pkg.tail; itr = itr->next) {
 	    if (itr->type == PLIST_CWD) {
 		cwd = itr->name;

==== //depot/projects/soc2007/gcooper-pkg_install-enhancements-simplified/usr.sbin/pkg_install/version/perform.c#9 (text+ko) ====

@@ -145,23 +145,23 @@
 static int
 pkg_do(char *pkg)
 {
-    char *ch, tmp[PATH_MAX], tmp2[PATH_MAX], *latest = NULL;
     Package plist;
     struct index_entry *ie;
-    FILE *fp;
+    char *ch, tmp[PATH_MAX], tmp2[PATH_MAX], *latest = NULL;
+    int fd;
     size_t len;
 
     /* Suck in the contents list. */
     plist.head = plist.tail = NULL;
     plist.name = plist.origin = NULL;
     snprintf(tmp, PATH_MAX, "%s/%s/%s", LOG_DIR, pkg, CONTENTS_FNAME);
-    fp = fopen(tmp, "r");
-    if (!fp) {
+    fd = open(tmp, O_RDONLY);
+    if (fd == -1) {
 	warnx("the package info for package '%s' is corrupt", pkg);
 	return 1;
     }
-    read_plist(&plist, fp);
-    fclose(fp);
+    read_plist(&plist, fd);
+    close(fd);
     if (plist.name == NULL) {
     	warnx("%s does not appear to be a valid package!", pkg);
     	return 1;


More information about the p4-projects mailing list