Sigh. Patch really attached this time.
--
Branden Robinson | GPG signed/encrypted mail welcome
[EMAIL PROTECTED] | 1024D/9C0BCBFB
Progeny Linux Systems | D5F6 D4C9 E25B 3D37 068C
| 72E8 0F42 191A 9C0B CBFB
Index: dpkg/branches/dpkg-opensolaris/src/main.c
===================================================================
--- dpkg/branches/dpkg-opensolaris/src/main.c (revision 5334)
+++ dpkg/branches/dpkg-opensolaris/src/main.c (revision 5335)
@@ -349,16 +349,17 @@
void execbackend(const char *const *argv) NONRETURNING;
void commandfd(const char *const *argv);
static const struct cmdinfo cmdinfos[]= {
- /* This table has both the action entries in it and the normal options.
- * The action entries are made with the ACTION macro, as they all
+ /*
+ * This table has both the action entries in it and the normal options.
+ * The action entries are made with the ACTION macros, as they all
* have a very similar structure.
*/
#define ACTION(longopt,shortopt,code,function) \
{ longopt, shortopt, 0,0,0, setaction, code, 0, (voidfnp)function }
#define OBSOLETE(longopt,shortopt) \
{ longopt, shortopt, 0,0,0, setobsolete, 0, 0, 0 }
-#define ACTIONBACKEND(longopt,shortop, backend) \
- { longopt, shortop, 0,0,0, setaction, 0, (void*)backend, (voidfnp)execbackend
}
+#define ACTIONBACKEND(longopt,shortopt,backend) \
+ { longopt, shortopt, 0,0,0, setaction, 0, (void*)backend,
(voidfnp)execbackend }
ACTION( "install", 'i', act_install,
archivefiles ),
ACTION( "unpack", 0, act_unpack,
archivefiles ),
@@ -433,27 +434,57 @@
};
void execbackend(const char *const *argv) {
- char **nargv;
- int i, argc = 1;
+ char **nargv; /* argv for backend command */
+ int i = 0; /* index for nargv */
+ int offset = 0; /* offset for copying argv strings to nargv */
+ int argc = 1; /* for nargv */
const char *const *arg = argv;
while(*arg != 0) { arg++; argc++; }
nargv= malloc(sizeof(char *) * (argc + 2));
if (!nargv) ohshite(_("couldn't malloc in execbackend"));
- nargv[0]= strdup(cipaction->parg);
- if (!nargv[0]) ohshite(_("couldn't strdup in execbackend"));
- nargv[1]= malloc(strlen(cipaction->olong) + 3);
- if (!nargv[1]) ohshite(_("couldn't malloc in execbackend"));
- strcpy(nargv[1], "--");
- strcat(nargv[1], cipaction->olong);
- for (i= 2; i <= argc; i++) {
- nargv[i]= strdup(argv[i-2]);
+ nargv[i]= strdup(cipaction->parg);
+ if (!nargv[i]) ohshite(_("couldn't strdup in execbackend"));
+ i++, offset++;
+
+ /*
+ * Special case: dpkg-query takes the --admindir option, and
+ * if dpkg itself was given a different admin directory, we
+ * need to pass it along to dpkg-query.
+ *
+ * No other backend takes any of --root, --admindir, or
+ * --instdir.
+ */
+ if (!strcmp(nargv[0], DPKGQUERY)) {
+ if (strcmp(admindir, ADMINDIR)) {
+ nargv[i] = malloc((strlen("--admindir=") + strlen(admindir) + 1));
+ if (!nargv[i]) ohshite(_("couldn't malloc in execbackend"));
+ (void) sprintf(nargv[i], "--admindir=%s", admindir);
+ /*
+ * We've added an argument, so increment the current
+ * position, the offset, and the number of arguments.
+ */
+ i++, offset++, argc++;
+ }
+ }
+
+ nargv[i]= malloc(strlen(cipaction->olong) + 3);
+ if (!nargv[i]) ohshite(_("couldn't malloc in execbackend"));
+ strcpy(nargv[i], "--");
+ strcat(nargv[i], cipaction->olong);
+ i++, offset++;
+
+ /* Copy arguments from argv to nargv. */
+ for (; i <= argc; i++) {
+ nargv[i]= strdup(argv[i - offset]);
if (!nargv[i]) ohshite(_("couldn't strdup in execbackend"));
}
nargv[i]= 0;
+
execvp(cipaction->parg, nargv);
ohshite(_("failed to exec %s"),(char *)cipaction->parg);
}
+
void commandfd(const char *const *argv) {
jmp_buf ejbuf;
struct varbuf linevb;