Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 29 May 2009 00:00:18 GMT
From:      David Forsythe <dforsyth@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 162982 for review
Message-ID:  <200905290000.n4T00I0b024511@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=162982

Change 162982 by dforsyth@squirrel on 2009/05/28 23:59:32

	Modified read_subdir routine.

Affected files ...

.. //depot/projects/soc2009/dforsyth_libpkg/pkg.c#3 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkg.h#2 edit
.. //depot/projects/soc2009/dforsyth_libpkg/pkgdb.c#3 edit

Differences ...

==== //depot/projects/soc2009/dforsyth_libpkg/pkg.c#3 (text+ko) ====

@@ -28,12 +28,11 @@
 		return (p);
 	memset(p, 0, sizeof(*p));
 
-	p->ident = malloc(strlen(ident) + 1);
+	p->ident = strdup(ident);
 	if (p->ident == NULL) {
 		pkg_free(p);
 		return (NULL);
 	}
-	strcpy(p->ident, ident);
 
 	return (p);
 }

==== //depot/projects/soc2009/dforsyth_libpkg/pkg.h#2 (text+ko) ====

@@ -2,7 +2,7 @@
 /* pkgdb. */
 struct pkgdb;
 struct pkgdb_subdir;
-struct sd_head;
+struct subdir_head;
 struct dirent;
 
 struct pkgdb *pkgdb_new_hierdb(const char *db_root);

==== //depot/projects/soc2009/dforsyth_libpkg/pkgdb.c#3 (text+ko) ====

@@ -16,7 +16,7 @@
 
 	int sd_count;
 	struct pkgdb_subdir *sd_curr;
-	TAILQ_HEAD(sd_head, pkgdb_subdir) *sd_headp;
+	TAILQ_HEAD(subdir_head, pkgdb_subdir) sd_head;
 
 	/* Callbacks */
 	/* tuuuummmmbbbllleeewwwweeeedddddd*/
@@ -26,8 +26,9 @@
 	TAILQ_ENTRY(pkgdb_subdir) next;
 
 	char *name;
+	char *path;
+	int file_count;
 	char **file_list;
-	int num_files;
 	int dirty;
 };
 
@@ -42,36 +43,29 @@
 	int s;
 	struct stat sb;
 	struct pkgdb *db;
+	char *new_db_root;
+	struct sd_head *new_sd_headp;
 	
 	if (db_root == NULL)
 		return (NULL);
-
+	
 	s = stat(db_root, &sb);
-	if (s != 0)
+	if (s != 0 || !S_ISDIR(sb.st_mode))
 		return (NULL);
-	if (!S_ISDIR(sb.st_mode))
+	
+	db = calloc(1, sizeof(*db));
+	new_db_root = strdup(db_root);
+	// new_sd_headp = calloc(1, sizeof(*db->sd_headp));
+	if (db == NULL || new_db_root == NULL/* || new_sd_headp == NULL*/) {
+		free(db);
+		free(new_db_root);
+		// free(new_sd_headp);
 		return (NULL);
-
-	db = malloc(sizeof(*db));
-	if (db == NULL)
-		return (db);
-	memset(db, 0, sizeof(*db));
-
-	db->db_root = malloc(strlen(db_root) + 1);
-	if (db->db_root == NULL) {
-		pkgdb_free_hierdb(db);
-		return (NULL);
 	}
-	strcpy(db->db_root, db_root);
+	db->db_root = new_db_root;
+	// db->sd_headp = new_sd_headp;
+	TAILQ_INIT(&db->sd_head);
 
-	db->sd_headp = malloc(sizeof(*db->sd_headp));
-	if (db->sd_headp == NULL) {
-		pkgdb_free_hierdb(db);
-		return (NULL);
-	}
-	memset(db->sd_headp, 0, sizeof(*db->sd_headp));
-	TAILQ_INIT(db->sd_headp);
-
 	db->sd_count = 0;
 	db->dirty = 1;
 
@@ -125,7 +119,7 @@
 	if (db->dirty == 0) {
 		/* No changes since the last reset, don't bother walking the
 		 * database again. */
-		db->sd_curr = TAILQ_FIRST(db->sd_headp);
+		db->sd_curr = TAILQ_FIRST(&db->sd_head);
 		return (db->sd_count);
 	}
 	
@@ -133,22 +127,24 @@
 	
 	/* Clear out old list. */
 	pkgdb_free_pkgdb_subdir_list(db);
-	
-	TAILQ_INIT(db->sd_headp);
+	/* Later on I should look into inserting changes into the existing
+	 * list, rather than just bombing the whole thing. */
+
+	TAILQ_INIT(&db->sd_head);
 	for (i = 0; i < db->sd_count; ++i) {
 		sd = pkgdb_read_subdir(db, ents[i]->d_name);
 		if (sd == NULL) {
 			pkgdb_free_pkgdb_subdir_list(db);
+			free(ents);
 			return (-1);
 		}
-		TAILQ_INSERT_TAIL(db->sd_headp, sd, next);
+		TAILQ_INSERT_TAIL(&db->sd_head, sd, next);
 		free(ents[i]);
 	}
-	
+	free(ents);
+	db->sd_curr = TAILQ_FIRST(&db->sd_head);
 	db->dirty = 0;
 	
-	db->sd_curr = TAILQ_FIRST(db->sd_headp);
-
 	return (db->sd_count);
 }
 
@@ -163,18 +159,56 @@
 struct pkgdb_subdir *
 pkgdb_read_subdir(struct pkgdb *db, const char *name)
 {
+	int i;
+	int s;
+	int slash;
+	struct stat sb;
 	struct pkgdb_subdir *sd;
+	char *new_name;
+	char *new_path;
+	DIR *sd_dirp;
+	struct dirent **ents;
+
+	slash = (db->db_root[strlen(db->db_root) - 1] == '/' ? 0 : 1);
+
+	sd = calloc(1, sizeof(*sd));
+	new_name = strdup(name);
+	new_path = malloc(strlen(db->db_root) + slash + strlen(name) + 1);
+	if (sd == NULL || new_name == NULL || new_path == NULL) {
+		free(sd);
+		free(new_name);
+		free(new_path);
+	}
+	strcpy(new_path, db->db_root);
+	strcat(new_path, "/");
+	strcat(new_path, name);
 	
-	sd = malloc(sizeof(*sd));
-	if (sd == NULL)
+	sd->name = new_name;
+	sd->path = new_path;
+	
+	s = lstat(sd->path, &sb);
+	if (s < 0 || S_ISLNK(sb.st_mode) || !S_ISDIR(sb.st_mode)) {
+		pkgdb_free_pkgdb_subdir(sd);
 		return (NULL);
+	}
 
-	sd->name = malloc(strlen(name) + 1);
-	if (sd->name == NULL) {
-		free(sd);
+	sd->file_count = scandir(sd->path, &ents, subdir_sel, alphasort);
+	sd->file_list = calloc(sd->file_count, sizeof(char *));
+	if (sd->file_list == NULL) {
+		pkgdb_free_pkgdb_subdir(sd);
 		return (NULL);
 	}
-	strcpy(sd->name, name);
+	for (i = 0; i < sd->file_count; ++i) {
+		sd->file_list[i] = strdup(ents[i]->d_name);
+		if (sd->file_list[i] == NULL) { 
+			sd->file_count = i; /* free up to */
+			pkgdb_free_pkgdb_subdir(sd);
+			free(ents);
+			return (NULL);
+		}
+		free(ents[i]);
+	}
+	free(ents);
 
 	return (sd);
 }
@@ -182,25 +216,42 @@
 /* Move the current subdir pointer to the next one in the list.  Return
  * the previous subdir.  Return NULL if there are no more left. */
 
-struct pkg *
-pkgdb_next_pkg(struct pkgdb *db)
+struct pkgdb_subdir *
+pkgdb_next_pkgdb_subdir(struct pkgdb *db)
 {
-	struct pkg *p;
 	struct pkgdb_subdir *sd;
 
 	if (db == NULL)
 		return (NULL);
 
 	sd = db->sd_curr;
-	if (db->sd_curr == NULL)
+	if (sd == NULL)
 		return (NULL);
 	
 	db->sd_curr = TAILQ_NEXT(db->sd_curr, next);
+	return (sd);
+}
+
+struct pkg *
+pkgdb_next_pkg(struct pkgdb *db)
+{
+	struct pkgdb_subdir *sd;
+	struct pkg *p;
+
+	
+	if (db == NULL)
+		return (NULL);
+
+	sd = pkgdb_next_pkgdb_subdir(db);
+	if (sd == NULL)
+		return (NULL);
 
 	p = pkg_new(sd->name);
 	return (p);
 }
 
+	
+
 /* Free a hierdb. */
 
 void
@@ -220,35 +271,27 @@
 	struct pkgdb_subdir *sd;
 	struct pkgdb_subdir *sdn;
 
-	sd = TAILQ_FIRST(db->sd_headp);
+	sd = TAILQ_FIRST(&db->sd_head);
 	while (sd != NULL) {
 		sdn = TAILQ_NEXT(sd, next);
 		pkgdb_free_pkgdb_subdir(sd);
 		sd = sdn;
 	}
-	TAILQ_INIT(db->sd_headp);
+	TAILQ_INIT(&db->sd_head);
 }
 
 void
 pkgdb_free_pkgdb_subdir(struct pkgdb_subdir *sd)
 {
+	int i;
+
 	if (sd == NULL)
 		return;
 
 	free(sd->name);
+	free(sd->path);
+	for (i = 0; i < sd->file_count; ++i)
+		free(sd->file_list[i]);
+	free(sd->file_list);
 	free(sd);
 }
-
-void
-free_ptr_array(void **arr, int c)
-{
-	int i;
-
-	if (arr == NULL)
-		return;
-
-	for (i = 0; i < c; ++i)
-		free(arr[i]);
-
-	free(arr);
-}



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200905290000.n4T00I0b024511>