#include "includes.h"
#include <dirent.h>
#include <glob.h>
+#include <fnmatch.h>
#include "opkg_conf.h"
#include "opkg_cmd.h"
#include "libbb/libbb.h"
#include "opkg_utils.h"
#include "opkg_defines.h"
-
-#include <fnmatch.h>
-
-
#include "opkg_download.h"
#include "opkg_install.h"
#include "opkg_upgrade.h"
#include "opkg_remove.h"
#include "opkg_configure.h"
#include "opkg_message.h"
-
#include "libopkg.h"
+#include "xsystem.h"
static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv);
static int opkg_upgrade_cmd(opkg_conf_t *conf, int argc, char **argv);
"%s: ERROR: %s exists, but is not a directory\n",
__FUNCTION__, lists_dir);
free(lists_dir);
- return EINVAL;
+ return -1;
}
err = file_mkdir_hier(lists_dir, 0755);
if (err) {
"%s: ERROR: failed to make directory %s: %s\n",
__FUNCTION__, lists_dir, strerror(errno));
free(lists_dir);
- return EINVAL;
+ return -1;
}
}
failures = 0;
-
- tmp = xstrdup("/tmp/opkg.XXXXXX");
-
+ sprintf_alloc(&tmp, "%s/update-XXXXXX", conf->tmp_dir);
if (mkdtemp (tmp) == NULL) {
perror ("mkdtemp");
- failures++;
+ return -1;
}
{
opkg_intercept_t ctx;
char *newpath;
- int gen;
ctx = xcalloc(1, sizeof (*ctx));
ctx->oldpath = xstrdup(getenv("PATH"));
-
- sprintf_alloc (&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath);
- setenv ("PATH", newpath, 1);
- free (newpath);
-
- gen = 0;
- retry:
- sprintf_alloc (&ctx->statedir, "/tmp/opkg-intercept-%d-%d", getpid (), gen);
- if (mkdir (ctx->statedir, 0770) < 0) {
- if (errno == EEXIST) {
- free (ctx->statedir);
- gen++;
- goto retry;
- }
- perror (ctx->statedir);
+ sprintf_alloc(&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath);
+ sprintf_alloc(&ctx->statedir, "%s/opkg-intercept-XXXXXX", conf->tmp_dir);
+
+ if (mkdtemp(ctx->statedir) == NULL) {
+ fprintf(stderr, "%s: mkdtemp: %s\n", __FUNCTION__, strerror(errno));
+ free(ctx->oldpath);
+ free(ctx->statedir);
+ free(newpath);
+ free(ctx);
return NULL;
}
- setenv ("OPKG_INTERCEPT_DIR", ctx->statedir, 1);
+
+ setenv("OPKG_INTERCEPT_DIR", ctx->statedir, 1);
+ setenv("PATH", newpath, 1);
+ free(newpath);
+
return ctx;
}
DIR *dir;
int err = 0;
- if (ctx->oldpath) {
- setenv ("PATH", ctx->oldpath, 1);
- free (ctx->oldpath);
- }
+ setenv ("PATH", ctx->oldpath, 1);
+ free (ctx->oldpath);
dir = opendir (ctx->statedir);
if (dir) {
struct dirent *de;
while (de = readdir (dir), de != NULL) {
char *path;
-
+
if (de->d_name[0] == '.')
continue;
sprintf_alloc (&path, "%s/%s", ctx->statedir, de->d_name);
if (access (path, X_OK) == 0) {
- if (system (path)) {
- err = errno;
- perror (de->d_name);
- }
+ xsystem (path);
}
free (path);
}
perror (ctx->statedir);
sprintf_alloc (&cmd, "rm -rf %s", ctx->statedir);
- err = system (cmd);
+ err = xsystem (cmd);
free (cmd);
free (ctx->statedir);
static int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name)
{
- pkg_vec_t *all, *ordered, *visited;
+ pkg_vec_t *all, *ordered, *visited;
int i;
pkg_t *pkg;
opkg_intercept_t ic;
opkg_recurse_pkgs_in_order(conf, pkg, all, visited, ordered);
}
-
ic = opkg_prep_intercepts (conf);
+ if (ic == NULL) {
+ err = -1;
+ goto error;
+ }
for(i = 0; i < all->len; i++) {
pkg = all->pkgs[i];
if (r && !err)
err = r;
+error:
pkg_vec_free(all);
pkg_vec_free(ordered);
pkg_vec_free(visited);