mirror of
https://github.com/sheumann/hush.git
synced 2024-09-12 00:55:11 +00:00
Reorganise status field to use 3 chars instead of one bit shifted long int.
Generates status file properly now, not compatable with full dpkg yet.
This commit is contained in:
parent
37849f3320
commit
305fdfa755
223
archival/dpkg.c
223
archival/dpkg.c
@ -48,39 +48,30 @@ static const char dpkgcidir[] = "/var/lib/dpkg/tmp.ci/";
|
||||
static const char infodir[] = "/var/lib/dpkg/info/";
|
||||
static const char udpkg_quiet[] = "UDPKG_QUIET";
|
||||
|
||||
//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_want_unknown = 1;
|
||||
static const int status_want_install = 2;
|
||||
//static const int status_want_hold = 3;
|
||||
//static const int status_want_deinstall = 4;
|
||||
//static const int status_want_purge = 5;
|
||||
|
||||
//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_flag_ok = 1;
|
||||
//static const int status_flag_reinstreq = 2;
|
||||
//static const int status_flag_hold = 3;
|
||||
//static const int status_flag_holdreinstreq = 4;
|
||||
|
||||
//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 int status_statusnoninstalled = 1;
|
||||
static const int status_status_unpacked = 2;
|
||||
static const int status_status_halfconfigured = 3;
|
||||
static const int status_status_installed = 4;
|
||||
static const int status_status_halfinstalled = 5;
|
||||
//static const int status_statusconfigfiles = 6;
|
||||
//static const int status_statuspostinstfailed = 7;
|
||||
//static const int status_statusremovalfailed = 8;
|
||||
|
||||
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 }
|
||||
};
|
||||
static const char *status_words_want[] = { "unknown", "install", "hold", "deinstall", "purge", 0 };
|
||||
static const char *status_words_flag[] = { "ok", "reinstreq", "hold", "hold-reinstreq", 0 };
|
||||
static const char *status_words_status[] = { "not-installed", "unpacked", "half-configured", "installed",
|
||||
"half-installed", "config-files", "post-inst-failed", "removal-failed", 0 };
|
||||
|
||||
static const int color_white = 0;
|
||||
static const int color_grey = 1;
|
||||
@ -95,7 +86,9 @@ typedef struct package_s {
|
||||
char *provides;
|
||||
char *description;
|
||||
int installer_menu_item;
|
||||
unsigned long status;
|
||||
unsigned char status_want;
|
||||
unsigned char status_flag;
|
||||
unsigned char status_status;
|
||||
char color; /* for topo-sort */
|
||||
struct package_s *requiredfor[DEPENDSMAX];
|
||||
unsigned short requiredcount;
|
||||
@ -271,10 +264,9 @@ static package_t *depends_resolve(package_t *pkgs, void *status)
|
||||
while (dependsvec[i] != 0) {
|
||||
/* Check for dependencies; first look for installed packages */
|
||||
dependpkg.package = dependsvec[i];
|
||||
if ((found = tfind(&dependpkg, &status, package_compare)) == 0 ||
|
||||
((chk = *(package_t **)found) &&
|
||||
(chk->status & (status_flagok | status_statusinstalled)) !=
|
||||
(status_flagok | status_statusinstalled))) {
|
||||
if (((found = tfind(&dependpkg, &status, package_compare)) == 0) ||
|
||||
((chk = *(package_t **)found) && (chk->status_flag & status_flag_ok) &&
|
||||
(chk->status_status & status_status_installed))) {
|
||||
|
||||
/* if it fails, we look through the list of packages we are going to
|
||||
* install */
|
||||
@ -318,58 +310,21 @@ static package_t *depends_resolve(package_t *pkgs, void *status)
|
||||
* replacing any pre-existing entries. when a merge happens, status info
|
||||
* read using the status_read function is written back to the status file
|
||||
*/
|
||||
static unsigned long status_parse(const char *line)
|
||||
static unsigned char status_parse(const char *line, const char **status_words)
|
||||
{
|
||||
char *p;
|
||||
int i, j;
|
||||
unsigned long l = 0;
|
||||
unsigned char status_num;
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if ((p = strchr(line, ' ')) != NULL) {
|
||||
*p = 0;
|
||||
while (status_words[i] != 0) {
|
||||
if (strncmp(line, status_words[i], strlen(status_words[i])) == 0) {
|
||||
status_num = (char)i;
|
||||
return(status_num);
|
||||
}
|
||||
j = 1;
|
||||
while (statuswords[i][j] != 0) {
|
||||
if (strcmp(line, statuswords[i][j]) == 0) {
|
||||
l |= (1 << ((int)statuswords[i][0] + j - 1));
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
/* parse error */
|
||||
if (statuswords[i][j] == 0) {
|
||||
return 0;
|
||||
}
|
||||
line = p+1;
|
||||
i++;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
static const char *status_print(unsigned long flags)
|
||||
{
|
||||
/* this function returns a static buffer... */
|
||||
static char buf[256];
|
||||
int i, j;
|
||||
|
||||
buf[0] = 0;
|
||||
for (i = 0; i < 3; i++) {
|
||||
j = 1;
|
||||
while (statuswords[i][j] != 0) {
|
||||
if ((flags & (1 << ((int)statuswords[i][0] + j - 1))) != 0) {
|
||||
strcat(buf, statuswords[i][j]);
|
||||
if (i < 2) strcat(buf, " ");
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
if (statuswords[i][j] == 0) {
|
||||
fprintf(stderr, "corrupted status flag!!\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return buf;
|
||||
/* parse error */
|
||||
error_msg("Invalid status word");
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -385,24 +340,30 @@ static int control_read(FILE *file, package_t *p)
|
||||
|
||||
if (strlen(line) == 0) {
|
||||
break;
|
||||
} else
|
||||
if (strstr(line, "Package: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Package: ") == line) {
|
||||
p->package = xstrdup(line + 9);
|
||||
} else
|
||||
if (strstr(line, "Status: ") == line) {
|
||||
p->status = status_parse(line + 8);
|
||||
} else
|
||||
if (strstr(line, "Depends: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Status: ") == line) {
|
||||
char *word_pointer;
|
||||
word_pointer = strchr(line, ' ') + 1;
|
||||
p->status_want = status_parse(word_pointer, status_words_want);
|
||||
word_pointer = strchr(word_pointer, ' ') + 1;
|
||||
p->status_flag = status_parse(word_pointer, status_words_flag);
|
||||
word_pointer = strchr(word_pointer, ' ') + 1;
|
||||
p->status_status = status_parse(word_pointer, status_words_status);
|
||||
}
|
||||
else if (strstr(line, "Depends: ") == line) {
|
||||
p->depends = xstrdup(line + 9);
|
||||
} else
|
||||
if (strstr(line, "Provides: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Provides: ") == line) {
|
||||
p->provides = xstrdup(line + 10);
|
||||
} else
|
||||
if (strstr(line, "Description: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Description: ") == line) {
|
||||
p->description = xstrdup(line + 13);
|
||||
/* This is specific to the Debian Installer. Ifdef? */
|
||||
} else
|
||||
if (strstr(line, "installer-menu-item: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "installer-menu-item: ") == line) {
|
||||
p->installer_menu_item = atoi(line + 21);
|
||||
}
|
||||
/* TODO: localized descriptions */
|
||||
@ -417,15 +378,14 @@ static void *status_read(void)
|
||||
void *status = 0;
|
||||
package_t *m = 0, *p = 0, *t = 0;
|
||||
|
||||
if ((f = fopen(statusfile, "r")) == NULL) {
|
||||
perror_msg(statusfile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getenv(udpkg_quiet) == NULL) {
|
||||
printf("(Reading database...)\n");
|
||||
}
|
||||
|
||||
if ((f = fopen(statusfile, "r")) == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
while (!feof(f)) {
|
||||
m = (package_t *)xcalloc(1, sizeof(package_t));
|
||||
control_read(f, m);
|
||||
@ -445,22 +405,22 @@ static void *status_read(void)
|
||||
*/
|
||||
p = (package_t *)xcalloc(1, sizeof(package_t));
|
||||
p->package = xstrdup(m->provides);
|
||||
|
||||
t = *(package_t **)tsearch(p, &status, package_compare);
|
||||
if (t != p) {
|
||||
free(p->package);
|
||||
free(p);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/*
|
||||
* Pseudo package status is the
|
||||
* same as the status of the
|
||||
* package providing it
|
||||
* FIXME: (not quite right, if 2
|
||||
* packages of different statuses
|
||||
* provide it).
|
||||
*/
|
||||
t->status = m->status;
|
||||
* provide it).
|
||||
*/
|
||||
t->status_want = m->status_want;
|
||||
t->status_flag = m->status_flag;
|
||||
t->status_status = m->status_status;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -485,6 +445,7 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
if (getenv(udpkg_quiet) == NULL) {
|
||||
printf("(Updating database...)\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Dont use wfopen here, handle errors ourself
|
||||
*/
|
||||
@ -517,8 +478,10 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
continue;
|
||||
}
|
||||
if (strstr(line, "Status: ") == line && statpkg != 0) {
|
||||
snprintf(line, sizeof(line), "Status: %s",
|
||||
status_print(statpkg->status));
|
||||
snprintf(line, sizeof(line), "Status: %s %s %s",
|
||||
status_words_want[statpkg->status_want - 1],
|
||||
status_words_flag[statpkg->status_flag - 1],
|
||||
status_words_status[statpkg->status_status - 1]);
|
||||
}
|
||||
fputs(line, fout);
|
||||
fputc('\n', fout);
|
||||
@ -529,8 +492,11 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
|
||||
// Print out packages we processed.
|
||||
for (pkg = pkgs; pkg != 0; pkg = pkg->next) {
|
||||
fprintf(fout, "Package: %s\nStatus: %s\n",
|
||||
pkg->package, status_print(pkg->status));
|
||||
fprintf(fout, "Package: %s\nStatus: %s %s %s\n",
|
||||
pkg->package, status_words_want[pkg->status_want - 1],
|
||||
status_words_flag[pkg->status_flag - 1],
|
||||
status_words_status[pkg->status_status - 1]);
|
||||
|
||||
if (pkg->depends)
|
||||
fprintf(fout, "Depends: %s\n", pkg->depends);
|
||||
if (pkg->provides)
|
||||
@ -548,10 +514,11 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
*/
|
||||
if (rename(statusfile, bak_statusfile) == -1) {
|
||||
struct stat stat_buf;
|
||||
error_msg("Couldnt create backup status file");
|
||||
if (stat(statusfile, &stat_buf) == 0) {
|
||||
error_msg("Couldnt create backup status file");
|
||||
return(EXIT_FAILURE);
|
||||
}
|
||||
error_msg("No status file found, creating new one");
|
||||
}
|
||||
|
||||
if (rename(new_statusfile, statusfile) == -1) {
|
||||
@ -578,18 +545,18 @@ static int dpkg_doconfigure(package_t *pkg)
|
||||
char buf[1024];
|
||||
|
||||
DPRINTF("Configuring %s\n", pkg->package);
|
||||
pkg->status &= status_statusmask;
|
||||
pkg->status_status = 0;
|
||||
snprintf(postinst, sizeof(postinst), "%s%s.postinst", infodir, pkg->package);
|
||||
|
||||
if (is_file(postinst)) {
|
||||
snprintf(buf, sizeof(buf), "%s configure", postinst);
|
||||
if ((r = do_system(buf)) != 0) {
|
||||
fprintf(stderr, "postinst exited with status %d\n", r);
|
||||
pkg->status |= status_statushalfconfigured;
|
||||
pkg->status_status = status_status_halfconfigured;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
pkg->status |= status_statusinstalled;
|
||||
pkg->status_status = status_status_installed;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -597,6 +564,7 @@ static int dpkg_doconfigure(package_t *pkg)
|
||||
static int dpkg_dounpack(package_t *pkg)
|
||||
{
|
||||
int r = 0, i;
|
||||
int status = TRUE;
|
||||
char *cwd;
|
||||
char *src_file = NULL;
|
||||
char *dst_file = NULL;
|
||||
@ -630,12 +598,14 @@ static int dpkg_dounpack(package_t *pkg)
|
||||
if (lstat(src_file, &src_stat_buf) == 0) {
|
||||
if ((src_fd = open(src_file, O_RDONLY)) != -1) {
|
||||
if ((dst_fd = open(dst_file, O_WRONLY | O_CREAT, 0644)) == -1) {
|
||||
status = FALSE;
|
||||
perror_msg("Opening %s", dst_file);
|
||||
}
|
||||
copy_file_chunk(src_fd, dst_fd, src_stat_buf.st_size);
|
||||
close(src_fd);
|
||||
close(dst_fd);
|
||||
} else {
|
||||
status = FALSE;
|
||||
error_msg("couldnt open [%s]\n", src_file);
|
||||
}
|
||||
}
|
||||
@ -652,17 +622,15 @@ static int dpkg_dounpack(package_t *pkg)
|
||||
deb_extract(dpkg_deb_list, NULL, pkg->file);
|
||||
*/
|
||||
|
||||
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_want = status_want_install;
|
||||
pkg->status_flag = status_flag_ok;
|
||||
|
||||
if (status == TRUE) {
|
||||
pkg->status_status = status_status_unpacked;
|
||||
} else {
|
||||
pkg->status |= status_statushalfinstalled;
|
||||
pkg->status_status = status_status_halfinstalled;
|
||||
}
|
||||
|
||||
chdir(cwd);
|
||||
return r;
|
||||
}
|
||||
@ -781,19 +749,18 @@ static int dpkg_install(package_t *pkgs, void *status)
|
||||
|
||||
/* Stage 3: install */
|
||||
for (p = ordered; p != 0; p = p->next) {
|
||||
p->status &= status_wantmask;
|
||||
p->status |= status_wantinstall;
|
||||
p->status_want = status_want_install;
|
||||
|
||||
/* 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_flag = status_flag_ok;
|
||||
|
||||
DPRINTF("Installing %s\n", p->package);
|
||||
if (dpkg_dounpack(p) != 0) {
|
||||
perror_msg(p->file);
|
||||
}
|
||||
|
||||
if (dpkg_doconfigure(p) != 0) {
|
||||
perror_msg(p->file);
|
||||
}
|
||||
|
223
dpkg.c
223
dpkg.c
@ -48,39 +48,30 @@ static const char dpkgcidir[] = "/var/lib/dpkg/tmp.ci/";
|
||||
static const char infodir[] = "/var/lib/dpkg/info/";
|
||||
static const char udpkg_quiet[] = "UDPKG_QUIET";
|
||||
|
||||
//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_want_unknown = 1;
|
||||
static const int status_want_install = 2;
|
||||
//static const int status_want_hold = 3;
|
||||
//static const int status_want_deinstall = 4;
|
||||
//static const int status_want_purge = 5;
|
||||
|
||||
//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_flag_ok = 1;
|
||||
//static const int status_flag_reinstreq = 2;
|
||||
//static const int status_flag_hold = 3;
|
||||
//static const int status_flag_holdreinstreq = 4;
|
||||
|
||||
//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 int status_statusnoninstalled = 1;
|
||||
static const int status_status_unpacked = 2;
|
||||
static const int status_status_halfconfigured = 3;
|
||||
static const int status_status_installed = 4;
|
||||
static const int status_status_halfinstalled = 5;
|
||||
//static const int status_statusconfigfiles = 6;
|
||||
//static const int status_statuspostinstfailed = 7;
|
||||
//static const int status_statusremovalfailed = 8;
|
||||
|
||||
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 }
|
||||
};
|
||||
static const char *status_words_want[] = { "unknown", "install", "hold", "deinstall", "purge", 0 };
|
||||
static const char *status_words_flag[] = { "ok", "reinstreq", "hold", "hold-reinstreq", 0 };
|
||||
static const char *status_words_status[] = { "not-installed", "unpacked", "half-configured", "installed",
|
||||
"half-installed", "config-files", "post-inst-failed", "removal-failed", 0 };
|
||||
|
||||
static const int color_white = 0;
|
||||
static const int color_grey = 1;
|
||||
@ -95,7 +86,9 @@ typedef struct package_s {
|
||||
char *provides;
|
||||
char *description;
|
||||
int installer_menu_item;
|
||||
unsigned long status;
|
||||
unsigned char status_want;
|
||||
unsigned char status_flag;
|
||||
unsigned char status_status;
|
||||
char color; /* for topo-sort */
|
||||
struct package_s *requiredfor[DEPENDSMAX];
|
||||
unsigned short requiredcount;
|
||||
@ -271,10 +264,9 @@ static package_t *depends_resolve(package_t *pkgs, void *status)
|
||||
while (dependsvec[i] != 0) {
|
||||
/* Check for dependencies; first look for installed packages */
|
||||
dependpkg.package = dependsvec[i];
|
||||
if ((found = tfind(&dependpkg, &status, package_compare)) == 0 ||
|
||||
((chk = *(package_t **)found) &&
|
||||
(chk->status & (status_flagok | status_statusinstalled)) !=
|
||||
(status_flagok | status_statusinstalled))) {
|
||||
if (((found = tfind(&dependpkg, &status, package_compare)) == 0) ||
|
||||
((chk = *(package_t **)found) && (chk->status_flag & status_flag_ok) &&
|
||||
(chk->status_status & status_status_installed))) {
|
||||
|
||||
/* if it fails, we look through the list of packages we are going to
|
||||
* install */
|
||||
@ -318,58 +310,21 @@ static package_t *depends_resolve(package_t *pkgs, void *status)
|
||||
* replacing any pre-existing entries. when a merge happens, status info
|
||||
* read using the status_read function is written back to the status file
|
||||
*/
|
||||
static unsigned long status_parse(const char *line)
|
||||
static unsigned char status_parse(const char *line, const char **status_words)
|
||||
{
|
||||
char *p;
|
||||
int i, j;
|
||||
unsigned long l = 0;
|
||||
unsigned char status_num;
|
||||
int i = 0;
|
||||
|
||||
for (i = 0; i < 3; i++) {
|
||||
if ((p = strchr(line, ' ')) != NULL) {
|
||||
*p = 0;
|
||||
while (status_words[i] != 0) {
|
||||
if (strncmp(line, status_words[i], strlen(status_words[i])) == 0) {
|
||||
status_num = (char)i;
|
||||
return(status_num);
|
||||
}
|
||||
j = 1;
|
||||
while (statuswords[i][j] != 0) {
|
||||
if (strcmp(line, statuswords[i][j]) == 0) {
|
||||
l |= (1 << ((int)statuswords[i][0] + j - 1));
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
/* parse error */
|
||||
if (statuswords[i][j] == 0) {
|
||||
return 0;
|
||||
}
|
||||
line = p+1;
|
||||
i++;
|
||||
}
|
||||
|
||||
return l;
|
||||
}
|
||||
|
||||
static const char *status_print(unsigned long flags)
|
||||
{
|
||||
/* this function returns a static buffer... */
|
||||
static char buf[256];
|
||||
int i, j;
|
||||
|
||||
buf[0] = 0;
|
||||
for (i = 0; i < 3; i++) {
|
||||
j = 1;
|
||||
while (statuswords[i][j] != 0) {
|
||||
if ((flags & (1 << ((int)statuswords[i][0] + j - 1))) != 0) {
|
||||
strcat(buf, statuswords[i][j]);
|
||||
if (i < 2) strcat(buf, " ");
|
||||
break;
|
||||
}
|
||||
j++;
|
||||
}
|
||||
if (statuswords[i][j] == 0) {
|
||||
fprintf(stderr, "corrupted status flag!!\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
return buf;
|
||||
/* parse error */
|
||||
error_msg("Invalid status word");
|
||||
return(0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -385,24 +340,30 @@ static int control_read(FILE *file, package_t *p)
|
||||
|
||||
if (strlen(line) == 0) {
|
||||
break;
|
||||
} else
|
||||
if (strstr(line, "Package: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Package: ") == line) {
|
||||
p->package = xstrdup(line + 9);
|
||||
} else
|
||||
if (strstr(line, "Status: ") == line) {
|
||||
p->status = status_parse(line + 8);
|
||||
} else
|
||||
if (strstr(line, "Depends: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Status: ") == line) {
|
||||
char *word_pointer;
|
||||
word_pointer = strchr(line, ' ') + 1;
|
||||
p->status_want = status_parse(word_pointer, status_words_want);
|
||||
word_pointer = strchr(word_pointer, ' ') + 1;
|
||||
p->status_flag = status_parse(word_pointer, status_words_flag);
|
||||
word_pointer = strchr(word_pointer, ' ') + 1;
|
||||
p->status_status = status_parse(word_pointer, status_words_status);
|
||||
}
|
||||
else if (strstr(line, "Depends: ") == line) {
|
||||
p->depends = xstrdup(line + 9);
|
||||
} else
|
||||
if (strstr(line, "Provides: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Provides: ") == line) {
|
||||
p->provides = xstrdup(line + 10);
|
||||
} else
|
||||
if (strstr(line, "Description: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "Description: ") == line) {
|
||||
p->description = xstrdup(line + 13);
|
||||
/* This is specific to the Debian Installer. Ifdef? */
|
||||
} else
|
||||
if (strstr(line, "installer-menu-item: ") == line) {
|
||||
}
|
||||
else if (strstr(line, "installer-menu-item: ") == line) {
|
||||
p->installer_menu_item = atoi(line + 21);
|
||||
}
|
||||
/* TODO: localized descriptions */
|
||||
@ -417,15 +378,14 @@ static void *status_read(void)
|
||||
void *status = 0;
|
||||
package_t *m = 0, *p = 0, *t = 0;
|
||||
|
||||
if ((f = fopen(statusfile, "r")) == NULL) {
|
||||
perror_msg(statusfile);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (getenv(udpkg_quiet) == NULL) {
|
||||
printf("(Reading database...)\n");
|
||||
}
|
||||
|
||||
if ((f = fopen(statusfile, "r")) == NULL) {
|
||||
return(NULL);
|
||||
}
|
||||
|
||||
while (!feof(f)) {
|
||||
m = (package_t *)xcalloc(1, sizeof(package_t));
|
||||
control_read(f, m);
|
||||
@ -445,22 +405,22 @@ static void *status_read(void)
|
||||
*/
|
||||
p = (package_t *)xcalloc(1, sizeof(package_t));
|
||||
p->package = xstrdup(m->provides);
|
||||
|
||||
t = *(package_t **)tsearch(p, &status, package_compare);
|
||||
if (t != p) {
|
||||
free(p->package);
|
||||
free(p);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/*
|
||||
* Pseudo package status is the
|
||||
* same as the status of the
|
||||
* package providing it
|
||||
* FIXME: (not quite right, if 2
|
||||
* packages of different statuses
|
||||
* provide it).
|
||||
*/
|
||||
t->status = m->status;
|
||||
* provide it).
|
||||
*/
|
||||
t->status_want = m->status_want;
|
||||
t->status_flag = m->status_flag;
|
||||
t->status_status = m->status_status;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -485,6 +445,7 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
if (getenv(udpkg_quiet) == NULL) {
|
||||
printf("(Updating database...)\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* Dont use wfopen here, handle errors ourself
|
||||
*/
|
||||
@ -517,8 +478,10 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
continue;
|
||||
}
|
||||
if (strstr(line, "Status: ") == line && statpkg != 0) {
|
||||
snprintf(line, sizeof(line), "Status: %s",
|
||||
status_print(statpkg->status));
|
||||
snprintf(line, sizeof(line), "Status: %s %s %s",
|
||||
status_words_want[statpkg->status_want - 1],
|
||||
status_words_flag[statpkg->status_flag - 1],
|
||||
status_words_status[statpkg->status_status - 1]);
|
||||
}
|
||||
fputs(line, fout);
|
||||
fputc('\n', fout);
|
||||
@ -529,8 +492,11 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
|
||||
// Print out packages we processed.
|
||||
for (pkg = pkgs; pkg != 0; pkg = pkg->next) {
|
||||
fprintf(fout, "Package: %s\nStatus: %s\n",
|
||||
pkg->package, status_print(pkg->status));
|
||||
fprintf(fout, "Package: %s\nStatus: %s %s %s\n",
|
||||
pkg->package, status_words_want[pkg->status_want - 1],
|
||||
status_words_flag[pkg->status_flag - 1],
|
||||
status_words_status[pkg->status_status - 1]);
|
||||
|
||||
if (pkg->depends)
|
||||
fprintf(fout, "Depends: %s\n", pkg->depends);
|
||||
if (pkg->provides)
|
||||
@ -548,10 +514,11 @@ static int status_merge(void *status, package_t *pkgs)
|
||||
*/
|
||||
if (rename(statusfile, bak_statusfile) == -1) {
|
||||
struct stat stat_buf;
|
||||
error_msg("Couldnt create backup status file");
|
||||
if (stat(statusfile, &stat_buf) == 0) {
|
||||
error_msg("Couldnt create backup status file");
|
||||
return(EXIT_FAILURE);
|
||||
}
|
||||
error_msg("No status file found, creating new one");
|
||||
}
|
||||
|
||||
if (rename(new_statusfile, statusfile) == -1) {
|
||||
@ -578,18 +545,18 @@ static int dpkg_doconfigure(package_t *pkg)
|
||||
char buf[1024];
|
||||
|
||||
DPRINTF("Configuring %s\n", pkg->package);
|
||||
pkg->status &= status_statusmask;
|
||||
pkg->status_status = 0;
|
||||
snprintf(postinst, sizeof(postinst), "%s%s.postinst", infodir, pkg->package);
|
||||
|
||||
if (is_file(postinst)) {
|
||||
snprintf(buf, sizeof(buf), "%s configure", postinst);
|
||||
if ((r = do_system(buf)) != 0) {
|
||||
fprintf(stderr, "postinst exited with status %d\n", r);
|
||||
pkg->status |= status_statushalfconfigured;
|
||||
pkg->status_status = status_status_halfconfigured;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
pkg->status |= status_statusinstalled;
|
||||
pkg->status_status = status_status_installed;
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -597,6 +564,7 @@ static int dpkg_doconfigure(package_t *pkg)
|
||||
static int dpkg_dounpack(package_t *pkg)
|
||||
{
|
||||
int r = 0, i;
|
||||
int status = TRUE;
|
||||
char *cwd;
|
||||
char *src_file = NULL;
|
||||
char *dst_file = NULL;
|
||||
@ -630,12 +598,14 @@ static int dpkg_dounpack(package_t *pkg)
|
||||
if (lstat(src_file, &src_stat_buf) == 0) {
|
||||
if ((src_fd = open(src_file, O_RDONLY)) != -1) {
|
||||
if ((dst_fd = open(dst_file, O_WRONLY | O_CREAT, 0644)) == -1) {
|
||||
status = FALSE;
|
||||
perror_msg("Opening %s", dst_file);
|
||||
}
|
||||
copy_file_chunk(src_fd, dst_fd, src_stat_buf.st_size);
|
||||
close(src_fd);
|
||||
close(dst_fd);
|
||||
} else {
|
||||
status = FALSE;
|
||||
error_msg("couldnt open [%s]\n", src_file);
|
||||
}
|
||||
}
|
||||
@ -652,17 +622,15 @@ static int dpkg_dounpack(package_t *pkg)
|
||||
deb_extract(dpkg_deb_list, NULL, pkg->file);
|
||||
*/
|
||||
|
||||
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_want = status_want_install;
|
||||
pkg->status_flag = status_flag_ok;
|
||||
|
||||
if (status == TRUE) {
|
||||
pkg->status_status = status_status_unpacked;
|
||||
} else {
|
||||
pkg->status |= status_statushalfinstalled;
|
||||
pkg->status_status = status_status_halfinstalled;
|
||||
}
|
||||
|
||||
chdir(cwd);
|
||||
return r;
|
||||
}
|
||||
@ -781,19 +749,18 @@ static int dpkg_install(package_t *pkgs, void *status)
|
||||
|
||||
/* Stage 3: install */
|
||||
for (p = ordered; p != 0; p = p->next) {
|
||||
p->status &= status_wantmask;
|
||||
p->status |= status_wantinstall;
|
||||
p->status_want = status_want_install;
|
||||
|
||||
/* 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_flag = status_flag_ok;
|
||||
|
||||
DPRINTF("Installing %s\n", p->package);
|
||||
if (dpkg_dounpack(p) != 0) {
|
||||
perror_msg(p->file);
|
||||
}
|
||||
|
||||
if (dpkg_doconfigure(p) != 0) {
|
||||
perror_msg(p->file);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user