diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/dpkg.c | 119 |
1 files changed, 58 insertions, 61 deletions
diff --git a/archival/dpkg.c b/archival/dpkg.c index 9519eeb..e8c5557 100644 --- a/archival/dpkg.c +++ b/archival/dpkg.c @@ -42,35 +42,43 @@ #define UDPKG_QUIET "UDPKG_QUIET" #define DEPENDSMAX 64 /* maximum number of depends we can handle */ -#define STATUS_WANTSTART (0) -#define STATUS_WANTUNKNOWN (1 << 0) -#define STATUS_WANTINSTALL (1 << 1) -#define STATUS_WANTHOLD (1 << 2) -#define STATUS_WANTDEINSTALL (1 << 3) -#define STATUS_WANTPURGE (1 << 4) -#define STATUS_WANTMASK ~(STATUS_WANTUNKNOWN | STATUS_WANTINSTALL | STATUS_WANTHOLD | STATUS_WANTDEINSTALL | STATUS_WANTPURGE) - -#define STATUS_FLAGSTART (5) -#define STATUS_FLAGOK (1 << 5) -#define STATUS_FLAGREINSTREQ (1 << 6) -#define STATUS_FLAGHOLD (1 << 7) -#define STATUS_FLAGHOLDREINSTREQ (1 << 8) -#define STATUS_FLAGMASK ~(STATUS_FLAGOK | STATUS_FLAGREINSTREQ | STATUS_FLAGHOLD | STATUS_FLAGHOLDREINSTREQ) - -#define STATUS_STATUSSTART (9) -#define STATUS_STATUSNOTINSTALLED (1 << 9) -#define STATUS_STATUSUNPACKED (1 << 10) -#define STATUS_STATUSHALFCONFIGURED (1 << 11) -#define STATUS_STATUSINSTALLED (1 << 12) -#define STATUS_STATUSHALFINSTALLED (1 << 13) -#define STATUS_STATUSCONFIGFILES (1 << 14) -#define STATUS_STATUSPOSTINSTFAILED (1 << 15) -#define STATUS_STATUSREMOVALFAILED (1 << 16) -#define STATUS_STATUSMASK ~(STATUS_STATUSNOTINSTALLED | STATUS_STATUSUNPACKED | STATUS_STATUSHALFCONFIGURED | STATUS_STATUSCONFIGFILES | STATUS_STATUSPOSTINSTFAILED | STATUS_STATUSREMOVALFAILED | STATUS_STATUSHALFINSTALLED) - -#define COLOR_WHITE 0 -#define COLOR_GRAY 1 -#define COLOR_BLACK 2 +//static const int status_wantstart = 0; +//static const int status_wantunknown = (1 << 0); +static const int status_wantinstall = (1 << 1); +//static const int status_wanthold = (1 << 2); +//static const int status_wantdeinstall = (1 << 3); +//static const int status_wantpurge = (1 << 4); +static const int status_wantmask = 31; + +//static const int status_flagstart = 5; +static const int status_flagok = (1 << 5); /* 32 */ +//static const int status_flagreinstreq = (1 << 6); +//static const int status_flaghold = (1 << 7); +//static const int status_flagholdreinstreq = (1 << 8); +static const int status_flagmask = 480; + +//static const int status_statusstart = 9; +//static const int status_statusnoninstalled = (1 << 9); /* 512 */ +static const int status_statusunpacked = (1 << 10); +static const int status_statushalfconfigured = (1 << 11); +static const int status_statusinstalled = (1 << 12); +static const int status_statushalfinstalled = (1 << 13); +//static const int status_statusconfigfiles = (1 << 14); +//static const int status_statuspostinstfailed = (1 << 15); +//static const int status_statusremovalfailed = (1 << 16); +static const int status_statusmask = 130560; /* i assume status_statusinstalled is supposed to be included */ + +static const char *statuswords[][10] = { + { (char *) 0, "unknown", "install", "hold", "deinstall", "purge", 0 }, + { (char *) 5, "ok", "reinstreq", "hold", "hold-reinstreq", 0 }, + { (char *) 9, "not-installed", "unpacked", "half-configured", + "installed", "half-installed", "config-files", + "post-inst-failed", "removal-failed", 0 } +}; + +const int color_white = 0; +const int color_grey = 1; +const int color_black = 2; /* data structures */ struct package_t { @@ -147,11 +155,11 @@ static void depends_sort_visit(struct package_t **ordered, unsigned short i; /* mark node as processing */ - pkg->color = COLOR_GRAY; + pkg->color = color_grey; /* visit each not-yet-visited node */ for (i = 0; i < pkg->requiredcount; i++) - if (pkg->requiredfor[i]->color == COLOR_WHITE) + if (pkg->requiredfor[i]->color == color_white) depends_sort_visit(ordered, pkgs, pkg->requiredfor[i]); #if 0 @@ -166,7 +174,7 @@ static void depends_sort_visit(struct package_t **ordered, *ordered = pkg; /* mark node as done */ - pkg->color = COLOR_BLACK; + pkg->color = color_black; } static struct package_t *depends_sort(struct package_t *pkgs) @@ -177,10 +185,10 @@ static struct package_t *depends_sort(struct package_t *pkgs) struct package_t *pkg; for (pkg = pkgs; pkg != 0; pkg = pkg->next) - pkg->color = COLOR_WHITE; + pkg->color = color_white; for (pkg = pkgs; pkg != 0; pkg = pkg->next) - if (pkg->color == COLOR_WHITE) + if (pkg->color == color_white) depends_sort_visit(&ordered, pkgs, pkg); /* Leaks the old list... return the new one... */ @@ -217,8 +225,8 @@ struct package_t *depends_resolve(struct package_t *pkgs, void *status) dependpkg.package = dependsvec[i]; if ((found = tfind(&dependpkg, &status, package_compare)) == 0 || ((chk = *(struct package_t **)found) && - (chk->status & (STATUS_FLAGOK | STATUS_STATUSINSTALLED)) != - (STATUS_FLAGOK | STATUS_STATUSINSTALLED))) + (chk->status & (status_flagok | status_statusinstalled)) != + (status_flagok | status_statusinstalled))) { /* if it fails, we look through the list of packages we are going to * install */ @@ -268,17 +276,6 @@ struct package_t *depends_resolve(struct package_t *pkgs, void *status) * read using the status_read function is written back to the status file */ -static const char *statuswords[][10] = { - { (char *)STATUS_WANTSTART, "unknown", "install", "hold", - "deinstall", "purge", 0 }, - { (char *)STATUS_FLAGSTART, "ok", "reinstreq", "hold", - "hold-reinstreq", 0 }, - { (char *)STATUS_STATUSSTART, "not-installed", "unpacked", "half-configured", - "installed", "half-installed", - "config-files", "post-inst-failed", - "removal-failed", 0 } -}; - int package_compare(const void *p1, const void *p2) { return strcmp(((struct package_t *)p1)->package, @@ -596,7 +593,7 @@ static int dpkg_doconfigure(struct package_t *pkg) char postinst[1024]; char buf[1024]; DPRINTF("Configuring %s\n", pkg->package); - pkg->status &= STATUS_STATUSMASK; + pkg->status &= status_statusmask; snprintf(postinst, sizeof(postinst), "%s%s.postinst", INFODIR, pkg->package); if (is_file(postinst)) { @@ -604,12 +601,12 @@ static int dpkg_doconfigure(struct package_t *pkg) if ((r = do_system(buf)) != 0) { fprintf(stderr, "postinst exited with status %d\n", r); - pkg->status |= STATUS_STATUSHALFCONFIGURED; + pkg->status |= status_statushalfconfigured; return 1; } } - pkg->status |= STATUS_STATUSINSTALLED; + pkg->status |= status_statusinstalled; return 0; } @@ -690,15 +687,15 @@ static int dpkg_dounpack(struct package_t *pkg) fclose(outfp); } } - pkg->status &= STATUS_WANTMASK; - pkg->status |= STATUS_WANTINSTALL; - pkg->status &= STATUS_FLAGMASK; - pkg->status |= STATUS_FLAGOK; - pkg->status &= STATUS_STATUSMASK; + pkg->status &= status_wantmask; + pkg->status |= status_wantinstall; + pkg->status &= status_flagmask; + pkg->status |= status_flagok; + pkg->status &= status_statusmask; if (r == 0) - pkg->status |= STATUS_STATUSUNPACKED; + pkg->status |= status_statusunpacked; else - pkg->status |= STATUS_STATUSHALFINSTALLED; + pkg->status |= status_statushalfinstalled; } chdir(cwd); return r; @@ -824,14 +821,14 @@ static int dpkg_install(struct package_t *pkgs) /* Stage 3: install */ for (p = ordered; p != 0; p = p->next) { - p->status &= STATUS_WANTMASK; - p->status |= STATUS_WANTINSTALL; + p->status &= status_wantmask; + p->status |= status_wantinstall; /* for now the flag is always set to ok... this is probably * not what we want */ - p->status &= STATUS_FLAGMASK; - p->status |= STATUS_FLAGOK; + p->status &= status_flagmask; + p->status |= status_flagok; if (dpkg_doinstall(p) != 0) { |