r4473 - trunk/src/target/opkg/libopkg

thomas at docs.openmoko.org thomas at docs.openmoko.org
Wed Jun 4 16:49:45 CEST 2008


Author: thomas
Date: 2008-06-04 16:49:44 +0200 (Wed, 04 Jun 2008)
New Revision: 4473

Modified:
   trunk/src/target/opkg/libopkg/libopkg.c
   trunk/src/target/opkg/libopkg/opkg.c
   trunk/src/target/opkg/libopkg/opkg_cmd.c
   trunk/src/target/opkg/libopkg/opkg_cmd.h
   trunk/src/target/opkg/libopkg/opkg_conf.c
   trunk/src/target/opkg/libopkg/opkg_conf.h
   trunk/src/target/opkg/libopkg/opkg_error.h
Log:
opkg: Consolidate error reporting from opkg_conf_init and ensure return value is
      checked in the appropriate places.

opkg: Add a locking mechanism to prevent two instances of opkg being run at the
      same time.


Modified: trunk/src/target/opkg/libopkg/libopkg.c
===================================================================
--- trunk/src/target/opkg/libopkg/libopkg.c	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/libopkg.c	2008-06-04 14:49:44 UTC (rev 4473)
@@ -271,6 +271,7 @@
 	err = opkg_conf_init (&opkg_conf, args);
 	if (err)
 	{
+		opkg_print_error_list (&opkg_conf);
 		return err;
 	}
 
@@ -485,6 +486,7 @@
 	err = opkg_conf_init (&opkg_conf, &args);
 	if (err)
 	{
+		opkg_print_error_list (&opkg_conf);
 		return err;
 	}
 

Modified: trunk/src/target/opkg/libopkg/opkg.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg.c	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg.c	2008-06-04 14:49:44 UTC (rev 4473)
@@ -185,13 +185,28 @@
 opkg_new ()
 {
   opkg_t *opkg;
+  int err;
+
   opkg = malloc (sizeof (opkg_t));
 
   opkg->args = malloc (sizeof (args_t));
-  args_init (opkg->args);
+  err = args_init (opkg->args);
+  if (err)
+  {
+    free (opkg->args);
+    free (opkg);
+    return NULL;
+  }
 
   opkg->conf = malloc (sizeof (opkg_conf_t));
-  opkg_conf_init (opkg->conf, opkg->args);
+  err = opkg_conf_init (opkg->conf, opkg->args);
+  if (err)
+  {
+    free (opkg->conf);
+    free (opkg->args);
+    free (opkg);
+    return NULL;
+  }
 
   opkg_init_options_array (opkg->conf, &opkg->options);
   return opkg;

Modified: trunk/src/target/opkg/libopkg/opkg_cmd.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_cmd.c	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg_cmd.c	2008-06-04 14:49:44 UTC (rev 4473)
@@ -138,6 +138,23 @@
      return NULL;
 }
 
+void opkg_print_error_list (opkg_conf_t *conf)
+{
+  if ( error_list ) {
+     reverse_error_list(&error_list);
+
+     printf ("Collected errors:\n");
+     /* Here we print the errors collected and free the list */
+     while (error_list != NULL) {
+           printf (" * %s", error_list->errmsg);
+           error_list = error_list->next;
+
+     }
+     free_error_list(&error_list);
+  }
+
+}
+
 int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **argv, void *userdata)
 {
 	int result;
@@ -150,20 +167,8 @@
            opkg_message(conf, OPKG_NOTICE, "An error ocurred, return value: %d.\n", result);
         }
 
-        if ( error_list ) {
-           reverse_error_list(&error_list);
+        opkg_print_error_list (conf);
 
-           opkg_message(conf, OPKG_NOTICE, "Collected errors:\n");
-           /* Here we print the errors collected and free the list */
-           while (error_list != NULL) {
-                 opkg_message(conf, OPKG_NOTICE, " * %s", error_list->errmsg);
-                 error_list = error_list->next;
-
-           }
-           free_error_list(&error_list);
-
-        }
-   
 	p_userdata = NULL;
 	return result;
 }

Modified: trunk/src/target/opkg/libopkg/opkg_cmd.h
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_cmd.h	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg_cmd.h	2008-06-04 14:49:44 UTC (rev 4473)
@@ -38,5 +38,6 @@
 int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name);
 
 int pkg_mark_provides(pkg_t *pkg);
+void opkg_print_error_list (opkg_conf_t *conf);
 
 #endif

Modified: trunk/src/target/opkg/libopkg/opkg_conf.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_conf.c	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg_conf.c	2008-06-04 14:49:44 UTC (rev 4473)
@@ -17,6 +17,7 @@
 
 #include "includes.h"
 #include "opkg_conf.h"
+#include "opkg_error.h"
 
 #include "xregex.h"
 #include "sprintf_alloc.h"
@@ -28,6 +29,9 @@
 #include <glob.h>
 #include "opkg_defines.h"
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
 
 static int opkg_conf_parse_file(opkg_conf_t *conf, const char *filename,
 				pkg_src_list_t *pkg_src_list,
@@ -100,10 +104,10 @@
      int err;
      char *tmp_dir_base;
      nv_pair_list_t tmp_dest_nv_pair_list;
-     char * lists_dir =NULL;
+     char *lists_dir = NULL, *lock_file = NULL;
      glob_t globbuf;
      char *etc_opkg_conf_pattern = "/etc/opkg/*.conf";
-     char *pending_dir  =NULL;
+     char *pending_dir = NULL;
 
      memset(conf, 0, sizeof(opkg_conf_t));
 
@@ -117,7 +121,24 @@
      conf->restrict_to_default_dest = 0;
      conf->default_dest = NULL;
 
+     /* check for lock file */
+     if (args->offline_root)
+       sprintf_alloc (&lock_file, "%s/%s/lock", args->offline_root, OPKG_STATE_DIR_PREFIX);
+     else
+       sprintf_alloc (&lock_file, "%s/lock", OPKG_STATE_DIR_PREFIX);
 
+     conf->lock_fd = creat (lock_file, S_IRUSR | S_IWUSR | S_IRGRP);
+     err = lockf (conf->lock_fd, F_TLOCK, 0);
+
+     free (lock_file);
+
+     if (err)
+     {
+       opkg_message (conf, OPKG_ERROR, "Could not obtain administrative lock\n");
+       return OPKG_CONF_ERR_LOCK;
+     }
+
+
      if (args->tmp_dir)
 	  tmp_dir_base = args->tmp_dir;
      else 
@@ -129,7 +150,7 @@
      if (conf->tmp_dir == NULL) {
 	  fprintf(stderr, "%s: Failed to create temporary directory `%s': %s\n",
 		  __FUNCTION__, conf->tmp_dir, strerror(errno));
-	  return errno;
+	  return OPKG_CONF_ERR_TMP_DIR;
      }
 
      conf->force_depends = 0;
@@ -165,19 +186,17 @@
 	       if (opkg_conf_parse_file(conf, args->conf_file,
 				    &conf->pkg_src_list, &tmp_dest_nv_pair_list,&lists_dir)<0) {
                    /* Memory leakage from opkg_conf_parse-file */
-                   return -1;
+                   return OPKG_CONF_ERR_PARSE;
                }
-                   
      }
 
-     /* if (!lists_dir ){*/
      if (strlen(lists_dir)<=1 ){
         lists_dir = realloc(lists_dir,strlen(OPKG_CONF_LISTS_DIR)+2);
         sprintf (lists_dir,"%s",OPKG_CONF_LISTS_DIR);
      }
 
      if (args->offline_root) {
-            char *tmp;// = malloc(strlen(lists_dir) + strlen(args->offline_root) + 1);
+            char *tmp;
             sprintf_alloc(&tmp, "%s/%s",args->offline_root,lists_dir);
             free(lists_dir);
             lists_dir = tmp;
@@ -202,7 +221,7 @@
 		    if ( opkg_conf_parse_file(conf, globbuf.gl_pathv[i], 
 				         &conf->pkg_src_list, &tmp_dest_nv_pair_list,&lists_dir)<0) {
                         /* Memory leakage from opkg_conf_parse-file */
-                        return -1;
+                        return OPKG_CONF_ERR_PARSE;
 	            }
 	  }
      }
@@ -289,7 +308,7 @@
         if (args->dest) {
 	     err = opkg_conf_set_default_dest(conf, args->dest);
 	     if (err) {
-	          return err;
+	          return OPKG_CONF_ERR_DEFAULT_DEST;
 	     }
         }
      }

Modified: trunk/src/target/opkg/libopkg/opkg_conf.h
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_conf.h	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg_conf.h	2008-06-04 14:49:44 UTC (rev 4473)
@@ -41,6 +41,7 @@
 
 struct opkg_conf
 {
+     int lock_fd; /* file descriptor for the lock file */
      pkg_src_list_t pkg_src_list;
      pkg_dest_list_t pkg_dest_list;
      nv_pair_list_t arch_list;

Modified: trunk/src/target/opkg/libopkg/opkg_error.h
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_error.h	2008-06-04 06:34:12 UTC (rev 4472)
+++ trunk/src/target/opkg/libopkg/opkg_error.h	2008-06-04 14:49:44 UTC (rev 4473)
@@ -20,6 +20,11 @@
   OPKG_ERR_UNKNOWN = -1,
   OPKG_ERR_NONE = 0,
 
+  OPKG_CONF_ERR_DEFAULT_DEST,  /* could not set default dest */
+  OPKG_CONF_ERR_PARSE,         /* error parsing config file */
+  OPKG_CONF_ERR_TMP_DIR,       /* could not create temporary directory */
+  OPKG_CONF_ERR_LOCK,          /* could not get opkg lock */
+
   OPKG_PKG_DEPS_UNSATISFIED,
   OPKG_PKG_IS_ESSENTIAL,
   OPKG_PKG_HAS_DEPENDENTS,





More information about the commitlog mailing list