Make RXGEN_CPPCMD work on unix
[openafs.git] / src / rxgen / rpc_main.c
index facdba9..ec97dc3 100644 (file)
@@ -6,53 +6,41 @@
  * may copy or modify Sun RPC without charge, but are not authorized
  * to license or distribute it to anyone else except as part of a product or
  * program developed by the user.
- * 
+ *
  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
- * 
+ *
  * Sun RPC is provided with no support and without any obligation on the
  * part of Sun Microsystems, Inc. to assist in its use, correction,
  * modification or enhancement.
- * 
+ *
  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
  * OR ANY PART THEREOF.
- * 
+ *
  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
  * or profits or other special, indirect and consequential damages, even if
  * Sun has been advised of the possibility of such damages.
- * 
+ *
  * Sun Microsystems, Inc.
  * 2550 Garcia Avenue
  * Mountain View, California  94043
  */
 
 /*
- * rpc_main.c, Top level of the RPC protocol compiler. 
- * Copyright (C) 1987, Sun Microsystems, Inc. 
+ * rpc_main.c, Top level of the RPC protocol compiler.
+ * Copyright (C) 1987, Sun Microsystems, Inc.
  */
 
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
+#include <roken.h>
 
 #include <limits.h>
-#include <stdio.h>
-#include <stdlib.h>
 #include <ctype.h>
-#include <string.h>
-#ifdef HAVE_SIGNAL_H
-#include <signal.h>
-#endif
-#ifdef HAVE_SYS_FILE_H
-#include <sys/file.h>
-#endif
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
+
 #include "rpc_scan.h"
 #include "rpc_parse.h"
 #include "rpc_util.h"
@@ -61,6 +49,7 @@ RCSID
 
 struct commandline {
     int ansic_flag;
+    int brief_flag;
     int cflag;
     int hflag;
     int lflag;
@@ -80,7 +69,6 @@ struct commandline {
 };
 
 #define MAXCPPARGS     256     /* maximum number of arguments to cpp */
-#define MAXCMDLINE      1024   /* MAX chars on a single  cmd line */
 
 char *prefix = "";
 static char *IncludeDir[MAXCPPARGS];
@@ -89,35 +77,39 @@ char *OutFileFlag = "";
 char OutFile[256];
 char Sflag = 0, Cflag = 0, hflag = 0, cflag = 0, kflag = 0, uflag = 0;
 char ansic_flag = 0;           /* If set, build ANSI C style prototypes */
+char brief_flag = 0;           /* If set, shorten names */
 char zflag = 0;                        /* If set, abort server stub if rpc call returns non-zero */
 char xflag = 0;                        /* if set, add stats code to stubs */
 char yflag = 0;                        /* if set, only emit function name arrays to xdr file */
 int debug = 0;
+static int pclose_fin = 0;
 static char *cmdname;
-#ifdef __PROG_CPP__
-static char CPP[] = __PROG_CPP__;
+#ifdef PATH_CPP
+static char *CPP = PATH_CPP;
 #else
-static char CPP[] = "/lib/cpp";
+#ifdef AFS_NT40_ENV
+static char *CPP = "cl /EP /C /nologo";
+#else
+static char *CPP = "/lib/cpp";
+#endif
 #endif
-static char CPPFLAGS[] = "-C";
 
-#ifdef AFS_ALPHA_ENV
 /*
  * Running "cpp" directly on DEC OSF/1 does not define anything; the "cc"
  * driver is responsible.  To compensate (and allow for other definitions
  * which should always be passed to "cpp"), place definitions which whould
- * always be passed to "rxgen" in this table.
+ * always be passed to "rxgen" in this string.
  */
-static char *XTRA_CPPFLAGS[] = {
+static char *CPPFLAGS = "-C"
+#ifdef AFS_ALPHA_ENV
 #ifdef __alpha
-    "-D__alpha",
+    " -D__alpha"
 #endif /* __alpha */
 #ifdef OSF
-    "-DOSF",
+    " -DOSF"
 #endif /* OSF */
-    NULL
-};
 #endif
+;
 
 #include "AFS_component_version_number.c"
 
@@ -144,20 +136,15 @@ int
 main(int argc, char *argv[])
 {
     struct commandline cmd;
-#ifdef AFS_NT40_ENV
     char *ep;
 
-    /* initialize CPP with the correct pre-processor on NT */
     ep = getenv("RXGEN_CPPCMD");
     if (ep)
-       strcpy(CPP, ep);
-    else
-       strcpy(CPP, "cl /EP /C /nologo");
-#endif
+       CPP = ep;
 #ifdef AFS_AIX32_ENV
     /*
-     * The following signal action for AIX is necessary so that in case of a 
-     * crash (i.e. core is generated) we can include the user's data section 
+     * The following signal action for AIX is necessary so that in case of a
+     * crash (i.e. core is generated) we can include the user's data section
      * in the core dump. Unfortunately, by default, only a partial core is
      * generated which, in many cases, isn't too useful.
      */
@@ -172,7 +159,7 @@ main(int argc, char *argv[])
     if (!parseargs(argc, argv, &cmd)) {
        f_print(stderr, "usage: %s infile\n", cmdname);
        f_print(stderr,
-               "       %s [-c | -h | -l | -m | -C | -S | -r | -k | -R | -p | -d | -z | -u] [-Pprefix] [-Idir] [-o outfile] [infile]\n",
+               "       %s [-c | -h | -l | -m | -C | -S | -r | -b | -k | -R | -p | -d | -z | -u] [-Pprefix] [-Idir] [-o outfile] [infile]\n",
                cmdname);
        f_print(stderr, "       %s [-s udp|tcp]* [-o outfile] [infile]\n",
                cmdname);
@@ -223,11 +210,17 @@ main(int argc, char *argv[])
            reinitialize();
        }
     }
+    if (fin && pclose_fin) {
+       /* the cpp command we called returned a non-zero exit status */
+       if (pclose(fin)) {
+           crash();
+       }
+    }
     exit(0);
 }
 
 /*
- * add extension to filename 
+ * add extension to filename
  */
 static char *
 extendfile(char *file, char *ext)
@@ -255,7 +248,7 @@ extendfile(char *file, char *ext)
 }
 
 /*
- * Open output file with given extension 
+ * Open output file with given extension
  */
 static void
 open_output(char *infile, char *outfile)
@@ -278,41 +271,40 @@ open_output(char *infile, char *outfile)
 }
 
 /*
- * Open input file with given define for C-preprocessor 
+ * Open input file with given define for C-preprocessor
  */
 static void
 open_input(char *infile, char *define)
 {
-    char cpp_cmdline[MAXCMDLINE];
+    char *cpp_cmdline;
+    int i, l = 0;
 
-    int i;
     if (debug == 0) {
        infilename = (infile == NULL) ? "<stdin>" : infile;
-       strcpy(cpp_cmdline, CPP);
-       strcat(cpp_cmdline, " ");
-       strcat(cpp_cmdline, CPPFLAGS);
-       strcat(cpp_cmdline, " ");
-       strcat(cpp_cmdline, define);
-
-#ifdef AFS_ALPHA_ENV
-       for (i = 0;
-            i < (sizeof(XTRA_CPPFLAGS) / sizeof(XTRA_CPPFLAGS[0])) - 1;
-            i++) {
-           strcat(cpp_cmdline, " ");
-           strcat(cpp_cmdline, XTRA_CPPFLAGS[i]);
+        l = strlen(CPP) + strlen(CPPFLAGS) + strlen(define) + 3;
+       for (i = 0; i < nincludes; i++)
+           l += strlen(IncludeDir[i]) + 1;
+        l += strlen(infile) + 1;
+       cpp_cmdline = malloc(l);
+       if (!cpp_cmdline) {
+         perror("Unable to allocate space for cpp command line");
+         crash();
        }
-#endif
+
+       sprintf(cpp_cmdline, "%s %s %s", CPP, CPPFLAGS, define);
+       l = strlen(cpp_cmdline);
        for (i = 0; i < nincludes; i++) {
-           strcat(cpp_cmdline, " ");
-           strcat(cpp_cmdline, IncludeDir[i]);
+           cpp_cmdline[l++] = ' ';
+           strcpy(cpp_cmdline + l, IncludeDir[i]);
+            l += strlen(IncludeDir[i]);
        }
-
-       strcat(cpp_cmdline, " ");
-       strcat(cpp_cmdline, infile);
+       cpp_cmdline[l++] = ' ';
+       strcpy(cpp_cmdline + l, infile);
 
        fin = popen(cpp_cmdline, "r");
        if (fin == NULL)
            perror("popen");
+       pclose_fin = 1;
 
     } else {
        if (infile == NULL) {
@@ -355,9 +347,12 @@ c_output(char *infile, char *define, int extend, char *outfile, int append)
     f_print(fout, "/* Machine generated file -- Do NOT edit */\n\n");
     if (xflag) {
        if (kflag) {
+           f_print(fout, "#include \"afsconfig.h\"\n");
            f_print(fout, "#include \"afs/param.h\"\n");
        } else {
+           f_print(fout, "#include <afsconfig.h>\n");
            f_print(fout, "#include <afs/param.h>\n");
+           f_print(fout, "#include <roken.h>\n");
        }
        f_print(fout, "#ifdef AFS_NT40_ENV\n");
        f_print(fout, "#define AFS_RXGEN_EXPORT __declspec(dllexport)\n");
@@ -379,7 +374,7 @@ c_output(char *infile, char *define, int extend, char *outfile, int append)
            f_print(fout, "#include \"netinet/in.h\"\n");
            f_print(fout, "#include \"h/time.h\"\n");
            f_print(fout, "#include \"rx/xdr.h\"\n");
-           f_print(fout, "#include \"rxgen_consts.h\"\n");
+           f_print(fout, "#include \"afs/rxgen_consts.h\"\n");
        } else {
            f_print(fout, "#include <rx/xdr.h>\n");
        }
@@ -412,8 +407,10 @@ c_output(char *infile, char *define, int extend, char *outfile, int append)
                }
            }
 
+
            f_print(fout, "\n};\n");
        }
+       er_Proc_CodeGeneration();
     }
 
     if (extend && tell == ftell(fout)) {
@@ -461,6 +458,9 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     if (xflag) {
        f_print(fout, "#include \"rx/rx_globals.h\"\n");
     }
+    if (brief_flag) {
+       f_print(fout, "#include \"rx/rx_opaque.h\"\n");
+    }
     if (uflag)
        f_print(fout, "#include <ubik.h>\n");
     f_print(fout, "#else       /* UKERNEL */\n");
@@ -499,12 +499,15 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     f_print(fout, "#include \"rx/xdr.h\"\n");
     f_print(fout, "#endif /* XDR_GETLONG */\n");
     f_print(fout, "#endif   /* UKERNEL */\n");
-    f_print(fout, "#include \"rxgen_consts.h\"\n");
+    f_print(fout, "#include \"afs/rxgen_consts.h\"\n");
     f_print(fout, "#include \"afs_osi.h\"\n");
     f_print(fout, "#include \"rx/rx.h\"\n");
     if (xflag) {
        f_print(fout, "#include \"rx/rx_globals.h\"\n");
     }
+    if (brief_flag) {
+       f_print(fout, "#include \"rx/rx_opaque.h\"\n");
+    }
     f_print(fout, "#else       /* KERNEL */\n");
     f_print(fout, "#include <afs/param.h>\n");
     f_print(fout, "#include <afs/stds.h>\n");
@@ -514,6 +517,9 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     if (xflag) {
        f_print(fout, "#include <rx/rx_globals.h>\n");
     }
+    if (brief_flag) {
+       f_print(fout, "#include <rx/rx_opaque.h>\n");
+    }
     f_print(fout, "#include <afs/rxgen_consts.h>\n");
     if (uflag)
        f_print(fout, "#include <ubik.h>\n");
@@ -529,6 +535,7 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     while ((def = get_definition())) {
        print_datadef(def);
     }
+    h_Proc_CodeGeneration();
     h_opcode_stats();
     hflag = 0;
     f_print(fout, "#endif      /* _RXGEN_%s_ */\n", uppercase(fullname));
@@ -567,7 +574,7 @@ s_output(int argc, char *argv[], char *infile, char *define, int extend,
        return;
     }
     if (nomain) {
-       write_programs((char *)NULL);
+       write_programs(NULL);
     } else {
        write_most();
        do_registers(argc, argv);
@@ -605,7 +612,7 @@ l_output(char *infile, char *define, int extend, char *outfile)
 }
 
 /*
- * Perform registrations for service output 
+ * Perform registrations for service output
  */
 static void
 do_registers(int argc, char *argv[])
@@ -645,6 +652,13 @@ C_output(char *infile, char *define, int extend, char *outfile, int append)
        if (kflag) {
            f_print(fout, "#include \"%s\"\n\n", include);
        } else {
+           f_print(fout, "#include <afsconfig.h>\n");
+           f_print(fout, "#include <afs/param.h>\n");
+           f_print(fout, "#include <roken.h>\n");
+           f_print(fout, "#include <afs/opr.h>\n");
+           f_print(fout, "#ifdef AFS_PTHREAD_ENV\n");
+           f_print(fout, "# include <opr/lock.h>\n");
+           f_print(fout, "#endif\n");
            f_print(fout, "#include \"%s\"\n\n", include);
        }
        free(include);
@@ -658,12 +672,15 @@ C_output(char *infile, char *define, int extend, char *outfile, int append)
            f_print(fout, "#include \"h/time.h\"\n");
            f_print(fout, "#include \"rpc/types.h\"\n");
            f_print(fout, "#include \"rx/xdr.h\"\n");
-           f_print(fout, "#include \"rxgen_consts.h\"\n");
+           f_print(fout, "#include \"afs/rxgen_consts.h\"\n");
            f_print(fout, "#include \"afs/afs_osi.h\"\n");
            f_print(fout, "#include \"rx/rx.h\"\n");
            if (xflag) {
                f_print(fout, "#include \"rx/rx_globals.h\"\n");
            }
+           if (brief_flag) {
+               f_print(fout, "#include \"rx/rx_opaque.h\"\n");
+           }
        } else {
            f_print(fout, "#include <sys/types.h>\n");
            f_print(fout, "#include <rx/xdr.h>\n");
@@ -671,6 +688,9 @@ C_output(char *infile, char *define, int extend, char *outfile, int append)
            if (xflag) {
                f_print(fout, "#include <rx/rx_globals.h>\n");
            }
+           if (brief_flag) {
+               f_print(fout, "#include <rx/rx_opaque.h\"\n");
+           }
            f_print(fout, "#include <afs/rxgen_consts.h>\n");
        }
     }
@@ -710,6 +730,9 @@ S_output(char *infile, char *define, int extend, char *outfile, int append)
        if (kflag) {
            f_print(fout, "#include \"%s\"\n", include);
        } else {
+           f_print(fout, "#include <afsconfig.h>\n");
+           f_print(fout, "#include <afs/param.h>\n");
+           f_print(fout, "#include <roken.h>\n");
            f_print(fout, "#include \"%s\"\n\n", include);
        }
        free(include);
@@ -723,12 +746,15 @@ S_output(char *infile, char *define, int extend, char *outfile, int append)
            f_print(fout, "#include \"h/time.h\"\n");
            f_print(fout, "#include \"rpc/types.h\"\n");
            f_print(fout, "#include \"rx/xdr.h\"\n");
-           f_print(fout, "#include \"rxgen_consts.h\"\n");
+           f_print(fout, "#include \"afs/rxgen_consts.h\"\n");
            f_print(fout, "#include \"afs/afs_osi.h\"\n");
            f_print(fout, "#include \"rx/rx.h\"\n");
            if (xflag) {
                f_print(fout, "#include \"rx/rx_globals.h\"\n");
            }
+           if (brief_flag) {
+               f_print(fout, "#include \"rx/rx_opaque.h\"\n");
+           }
        } else {
            f_print(fout, "#include <sys/types.h>\n");
            f_print(fout, "#include <rx/xdr.h>\n");
@@ -736,6 +762,9 @@ S_output(char *infile, char *define, int extend, char *outfile, int append)
            if (xflag) {
                f_print(fout, "#include <rx/rx_globals.h>\n");
            }
+           if (brief_flag) {
+               f_print(fout, "#include <rx/rx_opaque.h>\n");
+           }
            f_print(fout, "#include <afs/rxgen_consts.h>\n");
        }
     }
@@ -770,7 +799,7 @@ uppercase(char *str)
 }
 
 /*
- * Parse command line arguments 
+ * Parse command line arguments
  */
 static int
 parseargs(int argc, char *argv[], struct commandline *cmd)
@@ -805,6 +834,7 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
                case 'm':
                case 'C':
                case 'S':
+               case 'b':
                case 'r':
                case 'R':
                case 'k':
@@ -845,6 +875,10 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
                    prefix = &argv[i][j + 1];
                    goto nextarg;
                case 'I':
+                   if (nincludes >= MAXCPPARGS) {
+                       f_print(stderr, "Too many -I arguments\n");
+                       return (0);
+                   }
                    if (argv[i][j - 1] != '-')
                        return (0);
                    IncludeDir[nincludes++] = &argv[i][j - 1];
@@ -858,6 +892,7 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
        }
     }
     cmd->ansic_flag = ansic_flag = flag['A'];
+    cmd->brief_flag = brief_flag = flag['b'];
     cmd->cflag = cflag = flag['c'];
     cmd->hflag = hflag = flag['h'];
     cmd->sflag = flag['s'];