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