[Midnightbsd-cvs] src: lib/libmport: Improvements to the sub.package schema.

ctriv at midnightbsd.org ctriv at midnightbsd.org
Thu Sep 27 23:01:31 EDT 2007


Log Message:
-----------
Improvements to the sub.package schema.
Cleanup now always runs.
Fixed error handing in db_create.c

Modified Files:
--------------
    src/lib/libmport:
        create_pkg.c (r1.5 -> r1.6)
        db_schema.c (r1.2 -> r1.3)
        error.c (r1.3 -> r1.4)
        mport.h (r1.3 -> r1.4)
        plist.c (r1.2 -> r1.3)
        util.c (r1.5 -> r1.6)

-------------- next part --------------
Index: plist.c
===================================================================
RCS file: /home/cvs/src/lib/libmport/plist.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -Llib/libmport/plist.c -Llib/libmport/plist.c -u -r1.2 -r1.3
--- lib/libmport/plist.c
+++ lib/libmport/plist.c
@@ -143,7 +143,7 @@
   return MPORT_OK;  
 }
 
-     
+
     
 static mportPlistEntryType parse_command(const char *s) 
 {
Index: util.c
===================================================================
RCS file: /home/cvs/src/lib/libmport/util.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -Llib/libmport/util.c -Llib/libmport/util.c -u -r1.5 -r1.6
--- lib/libmport/util.c
+++ lib/libmport/util.c
@@ -41,7 +41,9 @@
 /* Package meta-data creation and destruction */
 mportPackageMeta* mport_new_packagemeta() 
 {
-  return (mportPackageMeta *)malloc(sizeof(mportPackageMeta));
+  /* we use calloc so any pointers that aren't set are NULL.
+     (calloc zero's out the memory region. */
+  return (mportPackageMeta *)calloc(1, sizeof(mportPackageMeta));
 }
 
 void mport_free_packagemeta(mportPackageMeta *pack)
@@ -60,7 +62,6 @@
   free(pack->pkginstall);
   free(pack->pkgdeinstall);
   free(pack->pkgmessage);
-  free(pack->req_script);
   free(pack);
 }
 
@@ -70,54 +71,22 @@
  */
 int mport_rmtree(const char *filename) 
 {
-  char *cmnd;
-  int ret;
-  
-  asprintf(&cmnd, "/bin/rm -r %s", filename);
+  return mport_xsystem("/bin/rm -r %s", filename);
+}  
+
 
-  if ((ret = system(cmnd)) != 0) {
-    RETURN_ERROR(MPORT_ERR_SYSCALL_FAILED, strerror(errno));
-  }
-  
-  free(cmnd); 
-  return MPORT_OK;
-}
 
 
 /*
- *Copy fromname to toname 
+ * Copy fromname to toname 
  *
- * XXX: This is needs some work.  perms?
  */
 int mport_copy_file(const char *fromname, const char *toname)
 {
-  int to;
-  int from;
-  int len;
-  char buf[8192];
-  
-  
-  if ((from = open(fromname, O_RDONLY)) == -1) {
-    RETURN_ERROR(MPORT_ERR_SYSCALL_FAILED, strerror(errno));
-  }
-  
-  if ((to = open(toname, O_WRONLY | O_CREAT)) == -1) {
-    RETURN_ERROR(MPORT_ERR_SYSCALL_FAILED, strerror(errno));
-  }
-  
-  len = read(from, buf, sizeof(buf));
-  
-  while (len > 0) {
-    write(to, buf, len);
-    len = read(from, buf, sizeof(buf));
-  }
-  
-  close(from);
-  close(to);
-  
-  return MPORT_OK;
+  return mport_xsystem("/bin/cp %s %s", fromname, toname);
 }
 
+
 /*
  * Quick test to see if a file exists.
  */
@@ -129,6 +98,33 @@
 }
   
 
+/* mport_xsystem(char *fmt, ...)
+ * 
+ * Our own version on system that takes a format string and a list 
+ * of values.  The fmt works exactly like the stdio output formats.
+ */
+int mport_xsystem(const char *fmt, ...) 
+{
+  va_list args;
+  char *cmnd;
+  int ret;
+  
+  va_start(args, fmt);
+  if (vasprintf(&cmnd, fmt, args) == -1) {
+    /* XXX How will the caller know this is no mem, and not a failed exec? */
+    return MPORT_ERR_NO_MEM;
+  }
+  
+  ret = system(cmnd);
+  
+  free(cmnd);
+  va_end(args);
+  
+  return ret;
+}
+  
+
+
 
 /*
  * mport_parselist(input, string_array_pointer)
Index: mport.h
===================================================================
RCS file: /home/cvs/src/lib/libmport/mport.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -Llib/libmport/mport.h -Llib/libmport/mport.h -u -r1.3 -r1.4
--- lib/libmport/mport.h
+++ lib/libmport/mport.h
@@ -86,7 +86,6 @@
   char *pkginstall;
   char *pkgdeinstall;
   char *pkgmessage;
-  char *req_script;
 } mportPackageMeta;  
 
 mportPackageMeta * mport_new_packagemeta(void);
@@ -98,8 +97,8 @@
 #include <sqlite3.h>
 
 /* schema */
-void mport_generate_plist_schema(sqlite3 *);
-void mport_generate_package_schema(sqlite3 *);
+int mport_generate_plist_schema(sqlite3 *);
+int mport_generate_stub_schema(sqlite3 *);
 
 /* Errors */
 
@@ -119,12 +118,14 @@
 #define MPORT_ERR_ARCHIVE		7
 
 #define RETURN_ERROR(code, msg) return mport_set_errx((code), "Error at %s:(%d): %s", __FILE__, __LINE__, (msg))
+#define SET_ERROR(code,msg) mport_set_errx((code), "Error at %s:(%d): %s", __FILE__, __LINE__, (msg))
 
 /* Utils */
 
 int mport_copy_file(const char *, const char *);
 int mport_rmtree(const char *);
 int mport_file_exists(const char *);
+int mport_xsystem(const char *, ...);
 void mport_parselist(char *, char ***);
 
 #endif
Index: error.c
===================================================================
RCS file: /home/cvs/src/lib/libmport/error.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -Llib/libmport/error.c -Llib/libmport/error.c -u -r1.3 -r1.4
--- lib/libmport/error.c
+++ lib/libmport/error.c
@@ -94,5 +94,7 @@
     
     free(err);
     
+    va_end(args);
+    
     return ret;
 }
Index: create_pkg.c
===================================================================
RCS file: /home/cvs/src/lib/libmport/create_pkg.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -Llib/libmport/create_pkg.c -Llib/libmport/create_pkg.c -u -r1.5 -r1.6
--- lib/libmport/create_pkg.c
+++ lib/libmport/create_pkg.c
@@ -64,37 +64,41 @@
   char dirtmpl[] = "/tmp/mport.XXXXXXXX"; 
   char *tmpdir   = mkdtemp(dirtmpl);
   
-  int ret = 0;
+  int ret;
   sqlite3 *db;
   
-  if (tmpdir == NULL) 
-    RETURN_ERROR(MPORT_ERR_FILEIO, strerror(errno));
-    
-  if (chdir(tmpdir) != 0) 
-    RETURN_ERROR(MPORT_ERR_FILEIO, strerror(errno));
+  if (tmpdir == NULL) {
+    SET_ERROR(MPORT_ERR_FILEIO, strerror(errno));
+    goto CLEANUP;
+  }
+  if (chdir(tmpdir) != 0)  {
+    SET_ERROR(MPORT_ERR_FILEIO, strerror(errno));
+    goto CLEANUP;
+  }
 
   if ((ret = create_package_db(&db)) != MPORT_OK)
-    return ret;
+    goto CLEANUP;
     
   if ((ret = create_plist(db, plist, pack)) != MPORT_OK)
-    return ret;
+    goto CLEANUP;
   
   if ((ret = create_meta(db, pack)) != MPORT_OK)
-    return ret;
+    goto CLEANUP;
     
-  if (sqlite3_close(db) != SQLITE_OK)
-    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  if (sqlite3_close(db) != SQLITE_OK) {
+    SET_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+    goto CLEANUP;
+  }
     
   if ((ret = copy_metafiles(pack)) != MPORT_OK) 
-    return ret;
+    goto CLEANUP;
     
   if ((ret = archive_files(plist, pack)) != MPORT_OK)
-    return ret;
-    
-  if ((ret = clean_up(tmpdir)) != MPORT_OK)
-    return ret;
+    goto CLEANUP;
   
-  return MPORT_OK;    
+  CLEANUP:  
+    clean_up(tmpdir);
+    return ret;
 }
 
 
@@ -106,9 +110,7 @@
   }
   
   /* create tables */
-  mport_generate_package_schema(*db);
-  
-  return MPORT_OK;
+  return mport_generate_stub_schema(*db);
 }
 
 static int create_plist(sqlite3 *db, mportPlist *plist, mportPackageMeta *pack)
@@ -121,7 +123,7 @@
   char md5[33];
   char file[FILENAME_MAX];
   char cwd[FILENAME_MAX];
-  
+
   strlcpy(cwd, pack->sourcedir, FILENAME_MAX);
   strlcat(cwd, pack->prefix, FILENAME_MAX);
   
@@ -132,8 +134,11 @@
   STAILQ_FOREACH(e, plist, next) {
     if (e->type == PLIST_CWD) {
       strlcpy(cwd, pack->sourcedir, FILENAME_MAX);
-      if (e->data != NULL) 
+      if (e->data == NULL) {
+        strlcat(cwd, pack->prefix, FILENAME_MAX);
+      } else {
         strlcat(cwd, e->data, FILENAME_MAX);
+      }
     }
     
     if (sqlite3_bind_text(stmnt, 1, pack->name, -1, SQLITE_STATIC) != SQLITE_OK) {
@@ -182,29 +187,31 @@
   struct timespec now;
   int ret;
   
-  char sql[]  = "INSERT INTO package (pkg, version, lang, date) VALUES (?,?,?,?)";
+  char sql[]  = "INSERT INTO package (pkg, version, origin, lang, prefix, date) VALUES (?,?,?,?,?,?)";
   
   if (sqlite3_prepare_v2(db, sql, -1, &stmnt, &rest) != SQLITE_OK) {
     RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
   }
-
   if (sqlite3_bind_text(stmnt, 1, pack->name, -1, SQLITE_STATIC) != SQLITE_OK) {
     RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
   }
-  
   if (sqlite3_bind_text(stmnt, 2, pack->version, -1, SQLITE_STATIC) != SQLITE_OK) {
     RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
   }
-  
-  if (sqlite3_bind_text(stmnt, 3, pack->lang, -1, SQLITE_STATIC) != SQLITE_OK) {
+  if (sqlite3_bind_text(stmnt, 3, pack->origin, -1, SQLITE_STATIC) != SQLITE_OK) {
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  }
+  if (sqlite3_bind_text(stmnt, 4, pack->lang, -1, SQLITE_STATIC) != SQLITE_OK) {
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  }
+  if (sqlite3_bind_text(stmnt, 5, pack->prefix, -1, SQLITE_STATIC) != SQLITE_OK) {
     RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
   }
-  
   if (clock_gettime(CLOCK_REALTIME, &now) != 0) {
     RETURN_ERROR(MPORT_ERR_SYSCALL_FAILED, strerror(errno));
   }
   
-  if (sqlite3_bind_int(stmnt, 4, now.tv_sec) != SQLITE_OK) {
+  if (sqlite3_bind_int(stmnt, 6, now.tv_sec) != SQLITE_OK) {
     RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
   }
     
Index: db_schema.c
===================================================================
RCS file: /home/cvs/src/lib/libmport/db_schema.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -Llib/libmport/db_schema.c -Llib/libmport/db_schema.c -u -r1.2 -r1.3
--- lib/libmport/db_schema.c
+++ lib/libmport/db_schema.c
@@ -34,21 +34,27 @@
 
 __MBSDID("$MidnightBSD$");
 
-static void run_sql(sqlite3 *db, const char *sql);
+static int run_sql(sqlite3 *db, const char *sql);
 
-void mport_generate_package_schema(sqlite3 *db) 
+int mport_generate_stub_schema(sqlite3 *db) 
 {
-  run_sql(db, "CREATE TABLE assets (pkg text not NULL, type int NOT NULL, data text, checksum text)");
-  run_sql(db, "CREATE TABLE package  (pkg text NOT NULL, version text NOT NULL, lang text, options text, date int NOT NULL)");
-  run_sql(db, "CREATE TABLE conflicts (pkg text NOT NULL, conflict_pkg text NOT NULL, conflict_version text NOT NULL)");
-  run_sql(db, "CREATE TABLE depends   (pkg text NOT NULL, depend_pkgname text NOT NULL, depend_pkgversion text NOT NULL, depend_port text NOT NULL)");
+  if (run_sql(db, "CREATE TABLE assets (pkg text not NULL, type int NOT NULL, data text, checksum text)") != SQLITE_OK)
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  if (run_sql(db, "CREATE TABLE package  (pkg text NOT NULL, version text NOT NULL, origin text NOT NULL, lang text, options text, date int NOT NULL, prefix text NOT NULL)") != SQLITE_OK)
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  if (run_sql(db, "CREATE TABLE conflicts (pkg text NOT NULL, conflict_pkg text NOT NULL, conflict_version text NOT NULL)") != SQLITE_OK)
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));
+  if (run_sql(db, "CREATE TABLE depends   (pkg text NOT NULL, depend_pkgname text NOT NULL, depend_pkgversion text NOT NULL, depend_port text NOT NULL)") != SQLITE_OK)
+    RETURN_ERROR(MPORT_ERR_SQLITE, sqlite3_errmsg(db));    
+    
+  return MPORT_OK;  
 }
 
-static void run_sql(sqlite3 *db, const char *sql)
+static int run_sql(sqlite3 *db, const char *sql)
 {
   char *error = 0;
   
-  sqlite3_exec(
+  return sqlite3_exec(
     db,
     sql,
     NULL,


More information about the Midnightbsd-cvs mailing list