tech-userlevel archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: rpcgen with env variable CPP set to "cc -E"



David Holland writes:
| But I'm wondering if it would be better to pass the lot to system() or
| sh -c instead of reimplementing arg splitting yet again. Or just use
| popen() instead of forking explicitly.
Here is my proposal, with a popen().
I didn't compile/test the __MSDOS__ case (where does that #ifdef come
from??); I replaced the spawnvp by a system, I guess it should work.
The good news is that rpcgen now handle `env CPP="cc -E"` correctly.
The bad news is that it doesn't help me much since cc -E doesn't handle
files ending in .x correctly ... it needs a "-x c" option ... sigh ...
But that's definitely not the rpcgen problem anymore.
Here's the diff:
Index: rpc_main.c
===================================================================
RCS file: /cvsroot/src/usr.bin/rpcgen/rpc_main.c,v
retrieving revision 1.29
diff -u -r1.29 rpc_main.c
--- rpc_main.c 12 Jan 2008 05:49:46 -0000 1.29
+++ rpc_main.c 14 Jan 2008 22:46:37 -0000
@@ -96,11 +96,8 @@
 };
 static int allnc = sizeof(allnv) / sizeof(allnv[0]);
 
-#define ARGLISTLEN 20
-#define FIXEDARGS 2
-
-static char *arglist[ARGLISTLEN];
-static int argcount = FIXEDARGS;
+static char *arglist = NULL;
+static int argcount = 0;
 
 
 int nonfatalerrors; /* errors */
@@ -150,7 +147,6 @@
 static void clnt_output __P((char *, char *, int, char *));
 static int do_registers __P((int, char *[]));
 static void addarg __P((char *));
-static void putarg __P((int, char *));
 static void checkfiles __P((char *, char *));
 static int parseargs __P((int, char *[], struct commandline *));
 static void usage __P((void));
@@ -236,6 +232,10 @@
 (void) fclose(fin);
 (void) unlink(dos_cppfile);
 }
+#else
+ if (fin != NULL) {
+ pclose(fin);
+ }
 #endif
 exit(nonfatalerrors);
 /* NOTREACHED */
@@ -309,10 +309,11 @@
 static void 
 clear_args()
 {
- int i;
- for (i = FIXEDARGS; i < ARGLISTLEN; i++)
- arglist[i] = NULL;
- argcount = FIXEDARGS;
+ if (arglist != NULL) {
+ free(arglist);
+ arglist = NULL;
+ }
+ argcount = 0;
 }
 
 /*
@@ -323,8 +324,6 @@
 char *infile;
 char *define;
 {
- int pd[2];
-
 infilename = (infile == NULL) ? "<stdin>" : infile;
 #ifdef __MSDOS__
 #define DOSCPP "\\prog\\bc31\\bin\\cpp.exe"
@@ -338,14 +337,14 @@
 && (cpp = getenv("RPCGENCPP")) == NULL)
 cpp = DOSCPP;
 
- putarg(0, cpp);
- putarg(1, "-P-");
- putarg(2, CPPFLAGS);
+ clear_args();
+ addarg(cpp);
+ addarg("-P-");
+ addarg(CPPFLAGS);
 addarg(define);
 addarg(infile);
- addarg(NULL);
 
- retval = spawnvp(P_WAIT, arglist[0], arglist);
+ retval = system(arglist);
 if (retval != 0) {
 fprintf(stderr, "%s: C PreProcessor failed\n", cmdname);
 crash();
@@ -366,25 +365,13 @@
 }
 }
 #else
- (void) pipe(pd);
- switch (fork()) {
- case 0:
- putarg(0, CPP);
- putarg(1, CPPFLAGS);
- addarg(define);
- addarg(infile);
- addarg((char *) NULL);
- (void) close(1);
- (void) dup2(pd[1], 1);
- (void) close(pd[0]);
- execvp(arglist[0], arglist);
- err(1, "$CPP: %s", CPP);
- case -1:
- perror("fork");
- exit(1);
- }
- (void) close(pd[1]);
- fin = fdopen(pd[0], "r");
+ clear_args();
+ addarg(CPP);
+ addarg(CPPFLAGS);
+ addarg(define);
+ addarg(infile);
+
+ fin = popen(arglist, "r");
 #endif
 if (fin == NULL) {
 f_print(stderr, "%s: ", cmdname);
@@ -843,28 +830,25 @@
 addarg(cp)
 char *cp;
 {
- if (argcount >= ARGLISTLEN) {
+ size_t len;
+ char *newarg;
+
+ len = strlen(cp) + 1 /* space, or 0円 if arglist == NULL */;
+ newarg = realloc(arglist, argcount + len);
+ if (newarg == NULL) {
 f_print(stderr, "rpcgen: too many defines\n");
 crash();
 /* NOTREACHED */
 }
- arglist[argcount++] = cp;
-
+ arglist = newarg;
+ if (argcount > 0)
+ strcat(arglist, " ");
+ else
+ arglist[0] = '0円';
+ strcat(arglist, cp);
+ argcount += len;
 }
 
-static void
-putarg(where, cp)
- char *cp;
- int where;
-{
- if (where >= ARGLISTLEN) {
- f_print(stderr, "rpcgen: arglist coding error\n");
- crash();
- /* NOTREACHED */
- }
- arglist[where] = cp;
-
-}
 /*
 * if input file is stdin and an output file is specified then complain
 * if the file already exists. Otherwise the file may get overwritten


Home | Main Index | Thread Index | Old Index

AltStyle によって変換されたページ (->オリジナル) /