summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2008-12-15 00:22:06 (EST)
committer ticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>2008-12-15 00:22:06 (EST)
commit9e85c59c8df6dd151fce6238811844d8d66ea1c0 (patch)
treefda715b0c88fb02029a6a42ed1768511a0ae4a0f
parent38171e005d8bc496389bccdf8b9f8449b7b227a5 (diff)
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. git-svn-id: http://opkg.googlecode.com/svn/trunk@130 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
-rw-r--r--libopkg/libopkg.c2
-rw-r--r--libopkg/opkg.c19
-rw-r--r--libopkg/opkg_cmd.c31
-rw-r--r--libopkg/opkg_cmd.h1
-rw-r--r--libopkg/opkg_conf.c37
-rw-r--r--libopkg/opkg_conf.h1
-rw-r--r--libopkg/opkg_error.h5
7 files changed, 72 insertions, 24 deletions
diff --git a/libopkg/libopkg.c b/libopkg/libopkg.c
index dba1983..68da96d 100644
--- a/libopkg/libopkg.c
+++ b/libopkg/libopkg.c
@@ -271,6 +271,7 @@ opkg_packages_download (args_t * args, const char *name)
err = opkg_conf_init (&opkg_conf, args);
if (err)
{
+ opkg_print_error_list (&opkg_conf);
return err;
}
@@ -485,6 +486,7 @@ opkg_op (int argc, char *argv[])
err = opkg_conf_init (&opkg_conf, &args);
if (err)
{
+ opkg_print_error_list (&opkg_conf);
return err;
}
diff --git a/libopkg/opkg.c b/libopkg/opkg.c
index 038469e..9f081cf 100644
--- a/libopkg/opkg.c
+++ b/libopkg/opkg.c
@@ -185,13 +185,28 @@ opkg_t *
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;
diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c
index 94cfb99..e91a24c 100644
--- a/libopkg/opkg_cmd.c
+++ b/libopkg/opkg_cmd.c
@@ -138,6 +138,23 @@ opkg_cmd_t *opkg_cmd_find(const char *name)
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 @@ int opkg_cmd_exec(opkg_cmd_t *cmd, opkg_conf_t *conf, int argc, const char **arg
opkg_message(conf, OPKG_NOTICE, "An error ocurred, return value: %d.\n", result);
}
- if ( error_list ) {
- reverse_error_list(&error_list);
-
- 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;
+ opkg_print_error_list (conf);
- }
- free_error_list(&error_list);
-
- }
-
p_userdata = NULL;
return result;
}
diff --git a/libopkg/opkg_cmd.h b/libopkg/opkg_cmd.h
index b6496c8..43fc428 100644
--- a/libopkg/opkg_cmd.h
+++ b/libopkg/opkg_cmd.h
@@ -38,5 +38,6 @@ int opkg_install_wanted_packages(opkg_conf_t *conf);
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
diff --git a/libopkg/opkg_conf.c b/libopkg/opkg_conf.c
index ba0daf5..965618f 100644
--- a/libopkg/opkg_conf.c
+++ b/libopkg/opkg_conf.c
@@ -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 opkg_conf_init(opkg_conf_t *conf, const args_t *args)
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,6 +121,23 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
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;
@@ -129,7 +150,7 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
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 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
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 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
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 @@ int opkg_conf_init(opkg_conf_t *conf, const args_t *args)
if (args->dest) {
err = opkg_conf_set_default_dest(conf, args->dest);
if (err) {
- return err;
+ return OPKG_CONF_ERR_DEFAULT_DEST;
}
}
}
diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
index 6e202d4..3c5dfe4 100644
--- a/libopkg/opkg_conf.h
+++ b/libopkg/opkg_conf.h
@@ -41,6 +41,7 @@ typedef struct opkg_conf opkg_conf_t;
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;
diff --git a/libopkg/opkg_error.h b/libopkg/opkg_error.h
index b04bd0b..94dbdea 100644
--- a/libopkg/opkg_error.h
+++ b/libopkg/opkg_error.h
@@ -20,6 +20,11 @@ enum opkg_error {
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,