The following commit has been merged in the master branch: commit 2533ebc755dc0e197d51e7d50beaac2ec3a70e22 Author: Raphaël Hertzog <hert...@debian.org> Date: Thu Jul 7 15:18:31 2011 +0200
dpkg-deb: adjust code now that extracthalf() no longer chdir() as a side-effect dpkg-deb -I, -f, -W were no longer working because they relied on the fact that extracthalf() changed the current directory to the extracted one. Regression introduced in commit 87809163331a320f9562d75591fcc6c954b9f80c. diff --git a/dpkg-deb/info.c b/dpkg-deb/info.c index 2bd0a5d..cd67d78 100644 --- a/dpkg-deb/info.c +++ b/dpkg-deb/info.c @@ -130,22 +130,31 @@ info_list(const char *debar, const char *dir) { char interpreter[INTERPRETER_MAX+1], *p; int il, lines; + struct varbuf controlfile = VARBUF_INIT; struct dirent **cdlist, *cdep; int cdn, n; FILE *cc; struct stat stab; int c; + size_t dirlen; - cdn= scandir(".", &cdlist, &ilist_select, alphasort); + cdn = scandir(dir, &cdlist, &ilist_select, alphasort); if (cdn == -1) ohshite(_("cannot scan directory `%.255s'"), dir); + varbuf_add_str(&controlfile, dir); + varbuf_add_char(&controlfile, '/'); + dirlen = controlfile.used; for (n = 0; n < cdn; n++) { cdep = cdlist[n]; - if (stat(cdep->d_name,&stab)) + varbuf_trunc(&controlfile, dirlen); + varbuf_add_str(&controlfile, cdep->d_name); + varbuf_end_str(&controlfile); + if (stat(controlfile.buf, &stab)) ohshite(_("cannot stat `%.255s' (in `%.255s')"), cdep->d_name, dir); if (S_ISREG(stab.st_mode)) { - if (!(cc= fopen(cdep->d_name,"r"))) + cc = fopen(controlfile.buf, "r"); + if (!cc) ohshite(_("cannot open `%.255s' (in `%.255s')"), cdep->d_name, dir); lines = 0; interpreter[0] = '\0'; @@ -174,7 +183,11 @@ info_list(const char *debar, const char *dir) } free(cdlist); - if (!(cc= fopen("control","r"))) { + varbuf_trunc(&controlfile, dirlen); + varbuf_add_str(&controlfile, "control"); + varbuf_end_str(&controlfile); + cc = fopen(controlfile.buf, "r"); + if (!cc) { if (errno != ENOENT) ohshite(_("failed to read `%.255s' (in `%.255s')"), "control", dir); fputs(_("(no `control' file in control archive!)\n"), stdout); @@ -195,12 +208,14 @@ info_list(const char *debar, const char *dir) } m_output(stdout, _("<standard output>")); + varbuf_destroy(&controlfile); } static void info_field(const char *debar, const char *dir, const char *const *fields, bool showfieldname) { + struct varbuf controlfile = VARBUF_INIT; FILE *cc; char fieldname[MAXFIELDNAME+1]; char *pf; @@ -208,7 +223,13 @@ info_field(const char *debar, const char *dir, const char *const *fields, int c, lno, fnl; bool doing; - if (!(cc= fopen("control","r"))) ohshite(_("could not open the `control' component")); + varbuf_add_str(&controlfile, dir); + varbuf_add_char(&controlfile, '/'); + varbuf_add_str(&controlfile, CONTROLFILE); + varbuf_end_str(&controlfile); + cc = fopen(controlfile.buf, "r"); + if (!cc) + ohshite(_("could not open the `control' component")); doing = true; lno = 1; for (;;) { @@ -252,11 +273,13 @@ info_field(const char *debar, const char *dir, const char *const *fields, ohshite(_("error closing the '%s' component"), "control"); if (doing) putc('\n',stdout); m_output(stdout, _("<standard output>")); + varbuf_destroy(&controlfile); } int do_showinfo(const char *const *argv) { + struct varbuf controlfile = VARBUF_INIT; const char *debar, *dir; struct pkginfo *pkg; struct pkg_format_node *fmt = pkg_format_parse(showformat); @@ -266,9 +289,14 @@ do_showinfo(const char *const *argv) info_prepare(&argv, &debar, &dir, 1); - parsedb(CONTROLFILE, pdb_recordavailable | pdb_rejectstatus | pdb_ignorefiles, - &pkg); + varbuf_add_str(&controlfile, dir); + varbuf_add_char(&controlfile, '/'); + varbuf_add_str(&controlfile, CONTROLFILE); + varbuf_end_str(&controlfile); + parsedb(controlfile.buf, + pdb_recordavailable | pdb_rejectstatus | pdb_ignorefiles, &pkg); pkg_format_show(fmt, pkg, &pkg->available); + varbuf_destroy(&controlfile); return 0; } -- dpkg's main repository -- To UNSUBSCRIBE, email to debian-dpkg-cvs-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org