Remove sunrpc compatibility
[openafs.git] / src / rxgen / rpc_main.c
index e2d2b56..168794a 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,11 +49,9 @@ RCSID
 
 struct commandline {
     int ansic_flag;
+    int brief_flag;
     int cflag;
     int hflag;
-    int lflag;
-    int sflag;
-    int mflag;
     int Cflag;
     int Sflag;
     int rflag;
@@ -80,7 +66,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 +74,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 PATH_CPP
-static char CPP[] = PATH_CPP;
+static char *CPP = PATH_CPP;
+#else
+#ifdef AFS_NT40_ENV
+static char *CPP = "cl /EP /C /nologo";
 #else
-static char CPP[] = "/lib/cpp";
+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"
 
@@ -129,10 +118,6 @@ static void c_output(char *infile, char *define, int extend, char *outfile,
                     int append);
 static void h_output(char *infile, char *define, int extend, char *outfile,
                     int append);
-static void s_output(int argc, char *argv[], char *infile, char *define,
-                    int extend, char *outfile, int nomain);
-static void l_output(char *infile, char *define, int extend, char *outfile);
-static void do_registers(int argc, char *argv[]);
 static int parseargs(int argc, char *argv[], struct commandline *cmd);
 static void C_output(char *infile, char *define, int extend, char *outfile,
                     int append);
@@ -144,20 +129,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,9 +152,9 @@ 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 | -C | -S | -r | -b | -k | -p | -d | -z | -u] [-Pprefix] [-Idir] [-o outfile] [infile]\n",
                cmdname);
-       f_print(stderr, "       %s [-s udp|tcp]* [-o outfile] [infile]\n",
+       f_print(stderr, "       %s [-o outfile] [infile]\n",
                cmdname);
        exit(1);
     }
@@ -186,11 +166,6 @@ main(int argc, char *argv[])
        c_output(cmd.infile, "-DRPC_XDR", !EXTEND, cmd.outfile, 0);
     } else if (cmd.hflag) {
        h_output(cmd.infile, "-DRPC_HDR", !EXTEND, cmd.outfile, 0);
-    } else if (cmd.lflag) {
-       l_output(cmd.infile, "-DRPC_CLNT", !EXTEND, cmd.outfile);
-    } else if (cmd.sflag || cmd.mflag) {
-       s_output(argc, argv, cmd.infile, "-DRPC_SVC", !EXTEND, cmd.outfile,
-                cmd.mflag);
     } else if (cmd.Cflag) {
        OutFileFlag = NULL;
        C_output(cmd.infile, "-DRPC_CLIENT", !EXTEND, cmd.outfile, 1);
@@ -223,11 +198,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 +236,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 +259,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 +335,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 +362,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 +395,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,14 +446,14 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     if (xflag) {
        f_print(fout, "#include \"rx/rx_globals.h\"\n");
     }
-    if (uflag)
-       f_print(fout, "#include <ubik.h>\n");
+    if (brief_flag) {
+       f_print(fout, "#include \"rx/rx_opaque.h\"\n");
+    }
     f_print(fout, "#else       /* UKERNEL */\n");
     f_print(fout, "#include \"h/types.h\"\n");
     f_print(fout, "#ifndef     SOCK_DGRAM  /* XXXXX */\n");
     f_print(fout, "#include \"h/socket.h\"\n");
     f_print(fout, "#endif\n");
-    f_print(fout, "struct ubik_client;\n");
     f_print(fout, "#ifndef     DTYPE_SOCKET  /* XXXXX */\n");
     f_print(fout, "#ifndef AFS_LINUX22_ENV\n");
     f_print(fout, "#include \"h/file.h\"\n");
@@ -499,12 +484,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 +502,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 +520,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));
@@ -537,90 +529,6 @@ h_output(char *infile, char *define, int extend, char *outfile, int append)
     }
 }
 
-/*
- * Compile into an RPC service
- */
-static void
-s_output(int argc, char *argv[], char *infile, char *define, int extend,
-        char *outfile, int nomain)
-{
-    char *include;
-    definition *def;
-    int foundprogram;
-    char *outfilename;
-
-    open_input(infile, define);
-    outfilename = extend ? extendfile(infile, outfile) : outfile;
-    open_output(infile, outfilename);
-    f_print(fout, "#include <stdio.h>\n");
-    f_print(fout, "#include <rpc/rpc.h>\n");
-    if (infile && (include = extendfile(infile, ".h"))) {
-       f_print(fout, "#include \"%s\"\n", include);
-       free(include);
-    }
-    foundprogram = 0;
-    while ((def = get_definition())) {
-       foundprogram |= (def->def_kind == DEF_PROGRAM);
-    }
-    if (extend && !foundprogram) {
-       (void)unlink(outfilename);
-       return;
-    }
-    if (nomain) {
-       write_programs((char *)NULL);
-    } else {
-       write_most();
-       do_registers(argc, argv);
-       write_rest();
-       write_programs("static");
-    }
-}
-
-static void
-l_output(char *infile, char *define, int extend, char *outfile)
-{
-    char *include;
-    definition *def;
-    int foundprogram;
-    char *outfilename;
-
-    open_input(infile, define);
-    outfilename = extend ? extendfile(infile, outfile) : outfile;
-    open_output(infile, outfilename);
-    f_print(fout, "#include <rpc/rpc.h>\n");
-    f_print(fout, "#include <sys/time.h>\n");
-    if (infile && (include = extendfile(infile, ".h"))) {
-       f_print(fout, "#include \"%s\"\n", include);
-       free(include);
-    }
-    foundprogram = 0;
-    while ((def = get_definition())) {
-       foundprogram |= (def->def_kind == DEF_PROGRAM);
-    }
-    if (extend && !foundprogram) {
-       (void)unlink(outfilename);
-       return;
-    }
-    write_stubs();
-}
-
-/*
- * Perform registrations for service output 
- */
-static void
-do_registers(int argc, char *argv[])
-{
-    int i;
-
-    for (i = 1; i < argc; i++) {
-       if (streq(argv[i], "-s")) {
-           write_register(argv[i + 1]);
-           i++;
-       }
-    }
-}
-
-
 static void
 C_output(char *infile, char *define, int extend, char *outfile, int append)
 {
@@ -645,6 +553,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 +573,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 +589,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 +631,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 +647,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 +663,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 +700,7 @@ uppercase(char *str)
 }
 
 /*
- * Parse command line arguments 
+ * Parse command line arguments
  */
 static int
 parseargs(int argc, char *argv[], struct commandline *cmd)
@@ -801,12 +731,10 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
                case 'A':
                case 'c':
                case 'h':
-               case 'l':
-               case 'm':
                case 'C':
                case 'S':
+               case 'b':
                case 'r':
-               case 'R':
                case 'k':
                case 'p':
                case 'd':
@@ -820,7 +748,6 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
                    flag[(int)c] = 1;
                    break;
                case 'o':
-               case 's':
                    if (argv[i][j - 1] != '-' || argv[i][j + 1] != 0) {
                        return (0);
                    }
@@ -828,16 +755,10 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
                    if (++i == argc) {
                        return (0);
                    }
-                   if (c == 's') {
-                       if (!streq(argv[i], "udp") && !streq(argv[i], "tcp")) {
-                           return (0);
-                       }
-                   } else if (c == 'o') {
-                       if (cmd->outfile) {
-                           return (0);
-                       }
-                       cmd->outfile = argv[i];
+                   if (cmd->outfile) {
+                       return (0);
                    }
+                   cmd->outfile = argv[i];
                    goto nextarg;
                case 'P':
                    if (argv[i][j - 1] != '-')
@@ -845,6 +766,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,11 +783,9 @@ 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'];
-    cmd->lflag = flag['l'];
-    cmd->mflag = flag['m'];
     cmd->xflag = xflag = flag['x'];
     cmd->yflag = yflag = flag['y'];
     cmd->Cflag = Cflag = flag['C'];
@@ -876,8 +799,7 @@ parseargs(int argc, char *argv[], struct commandline *cmd)
     if (cmd->pflag)
        combinepackages = 1;
     nflags =
-       cmd->cflag + cmd->hflag + cmd->sflag + cmd->lflag + cmd->mflag +
-       cmd->Cflag + cmd->Sflag + cmd->rflag;
+       cmd->cflag + cmd->hflag + cmd->Cflag + cmd->Sflag + cmd->rflag;
     if (nflags == 0) {
        if (cmd->outfile != NULL || cmd->infile == NULL) {
            return (0);