diff options
author | Guillem Jover <guillem@debian.org> | 2011-02-27 09:19:20 +0100 |
---|---|---|
committer | Guillem Jover <guillem@debian.org> | 2011-03-02 07:35:01 +0100 |
commit | 598d605202413affb749a96bab8a39d60e6902ff (patch) | |
tree | c4c450abe67ec7a7cacd22e7f2dd0ee36df4e368 | |
parent | a2acd17d3c5a6980cf4516f6f5c5f93e67832882 (diff) | |
download | dpkg-598d605202413affb749a96bab8a39d60e6902ff.tar.gz |
dpkg: Refactor infodb update on unpack into new pkg_infodb_update()
-rw-r--r-- | src/processarc.c | 164 |
1 files changed, 90 insertions, 74 deletions
diff --git a/src/processarc.c b/src/processarc.c index b7b950c34..54dbf1e79 100644 --- a/src/processarc.c +++ b/src/processarc.c @@ -215,6 +215,94 @@ pkg_infodb_update_file(const char *filename, const char *filetype) } static void +pkg_infodb_update(struct pkginfo *pkg, char *cidir, char *cidirrest) +{ + struct match_node *match_node; + DIR *dsd; + struct dirent *de; + + /* Deallocate the match list in case we aborted previously. */ + while ((match_node = match_head)) { + match_head = match_node->next; + match_node_free(match_node); + } + + pkg_infodb_foreach(pkg, pkg_infodb_update_file); + + while ((match_node = match_head)) { + strcpy(cidirrest, match_node->filetype); + + if (!rename(cidir, match_node->filename)) { + debug(dbg_scripts, "process_archive info installed %s as %s", + cidir, match_node->filename); + } else if (errno == ENOENT) { + /* Right, no new version. */ + if (unlink(match_node->filename)) + ohshite(_("unable to remove obsolete info file `%.250s'"), + match_node->filename); + debug(dbg_scripts, "process_archive info unlinked %s", + match_node->filename); + } else { + ohshite(_("unable to install (supposed) new info file `%.250s'"), cidir); + } + match_head = match_node->next; + match_node_free(match_node); + } + + /* The control directory itself. */ + cidirrest[0] = '\0'; + dsd = opendir(cidir); + if (!dsd) + ohshite(_("unable to open temp control directory")); + push_cleanup(cu_closedir, ~0, NULL, 0, 1, (void *)dsd); + while ((de = readdir(dsd))) { + const char *newinfofilename; + + if (strchr(de->d_name, '.')) { + debug(dbg_scripts,"process_archive tmp.ci script/file `%s' contains dot", + de->d_name); + continue; + } + if (strlen(de->d_name) > MAXCONTROLFILENAME) + ohshit(_("package contains overly-long control info file name (starting `%.50s')"), + de->d_name); + + strcpy(cidirrest, de->d_name); + + /* First we check it's not a directory. */ + if (rmdir(cidir) == 0) + ohshit(_("package control info contained directory `%.250s'"), cidir); + else if (errno != ENOTDIR) + ohshite(_("package control info rmdir of `%.250s' didn't say not a dir"), + de->d_name); + + /* Ignore the control file. */ + if (strcmp(de->d_name, CONTROLFILE) == 0) { + debug(dbg_scripts, "process_archive tmp.ci script/file `%s' is control", + cidir); + continue; + } + if (strcmp(de->d_name, LISTFILE) == 0) { + warning(_("package %s contained list as info file"), pkg->name); + continue; + } + + /* Right, install it */ + newinfofilename = pkgadminfile(pkg,de->d_name); + if (rename(cidir, newinfofilename)) + ohshite(_("unable to install new info file `%.250s' as `%.250s'"), + cidir, newinfofilename); + + debug(dbg_scripts, + "process_archive tmp.ci script/file `%s' installed as `%s'", + cidir, newinfofilename); + } + pop_cleanup(ehflag_normaltidy); /* closedir */ + + dir_sync_path(pkgadmindir()); +} + +static void pkg_infodb_remove_file(const char *filename, const char *filetype) { if (unlink(filename)) @@ -251,7 +339,7 @@ void process_archive(const char *filename) { char *cidirrest, *p; char conffilenamebuf[MAXCONFFILENAME]; char *psize; - const char *pfilename, *newinfofilename; + const char *pfilename; struct fileinlist *newconff, **newconffileslastp; struct fileinlist *cfile; struct reversefilelistiter rlistit; @@ -260,12 +348,9 @@ void process_archive(const char *filename) { struct dependency *newdep, *dep, *providecheck; struct deppossi *psearch, **newpossilastp, *possi, *newpossi, *pdep; FILE *conff; - DIR *dsd; struct filenamenode *namenode; - struct dirent *de; struct stat stab, oldfs; struct pkg_deconf_list *deconpil, *deconpiltemp; - struct match_node *match_node; cleanup_pkg_failed= cleanup_conflictor_failed= 0; @@ -926,76 +1011,7 @@ void process_archive(const char *filename) { * them as appropriate; then we go through the new scripts * (any that are left) and install them. */ debug(dbg_general, "process_archive updating info directory"); - - /* Deallocate the match list in case we aborted previously. */ - while ((match_node = match_head)) { - match_head = match_node->next; - match_node_free(match_node); - } - - pkg_infodb_foreach(pkg, pkg_infodb_update_file); - - while ((match_node = match_head)) { - strcpy(cidirrest, match_node->filetype); - - if (!rename(cidir, match_node->filename)) { - debug(dbg_scripts, "process_archive info installed %s as %s", - cidir, match_node->filename); - } else if (errno == ENOENT) { - /* Right, no new version. */ - if (unlink(match_node->filename)) - ohshite(_("unable to remove obsolete info file `%.250s'"), - match_node->filename); - debug(dbg_scripts, "process_archive info unlinked %s", - match_node->filename); - } else { - ohshite(_("unable to install (supposed) new info file `%.250s'"), - cidir); - } - match_head = match_node->next; - match_node_free(match_node); - } - - /* The directory itself. */ - *cidirrest = '\0'; - dsd= opendir(cidir); - if (!dsd) ohshite(_("unable to open temp control directory")); - push_cleanup(cu_closedir, ~0, NULL, 0, 1, (void *)dsd); - while ((de= readdir(dsd))) { - if (strchr(de->d_name,'.')) { - debug(dbg_scripts,"process_archive tmp.ci script/file `%s' contains dot", - de->d_name); - continue; - } - if (strlen(de->d_name) > MAXCONTROLFILENAME) - ohshit(_("package contains overly-long control info file name (starting `%.50s')"), - de->d_name); - strcpy(cidirrest,de->d_name); - /* First we check it's not a directory. */ - if (!rmdir(cidir)) - ohshit(_("package control info contained directory `%.250s'"),cidir); - else if (errno != ENOTDIR) - ohshite(_("package control info rmdir of `%.250s' didn't say not a dir"),de->d_name); - /* Ignore the control file. */ - if (!strcmp(de->d_name,CONTROLFILE)) { - debug(dbg_scripts,"process_archive tmp.ci script/file `%s' is control",cidir); - continue; - } - if (!strcmp(de->d_name,LISTFILE)) { - warning(_("package %s contained list as info file"), pkg->name); - continue; - } - /* Right, install it */ - newinfofilename= pkgadminfile(pkg,de->d_name); - if (rename(cidir,newinfofilename)) - ohshite(_("unable to install new info file `%.250s' as `%.250s'"), - cidir,newinfofilename); - debug(dbg_scripts,"process_archive tmp.ci script/file `%s' installed as `%s'", - cidir, newinfofilename); - } - pop_cleanup(ehflag_normaltidy); /* closedir */ - - dir_sync_path(pkgadmindir()); + pkg_infodb_update(pkg, cidir, cidirrest); /* * Update the status database. |