* 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>
+#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"
struct commandline {
int ansic_flag;
+ int brief_flag;
int cflag;
int hflag;
- int lflag;
- int sflag;
- int mflag;
int Cflag;
int Sflag;
int rflag;
};
#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];
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 AFS_NT40_ENV
-static char *CPP = NULL;
-#else /* AFS_NT40_ENV */
#ifdef PATH_CPP
-static char CPP[] = 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
-#endif /* AFS_NT40_ENV */
-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"
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);
main(int argc, char *argv[])
{
struct commandline cmd;
+ char *ep;
-#ifdef AFS_NT40_ENV
- /* initialize CPP with the correct pre-processor for Windows */
- CPP = getenv("RXGEN_CPPCMD");
- if (!CPP)
- CPP = "cl /EP /C /nologo";
-#endif /* AFS_NT40_ENV */
-
+ ep = getenv("RXGEN_CPPCMD");
+ if (ep)
+ 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.
*/
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);
}
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);
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)
}
/*
- * Open output file with given extension
+ * Open output file with given extension
*/
static void
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) {
} 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");
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");
}
}
}
+
f_print(fout, "\n};\n");
}
+ er_Proc_CodeGeneration();
}
if (extend && tell == ftell(fout)) {
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");
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 <afsconfig.h>\n");
f_print(fout, "#include <afs/param.h>\n");
f_print(fout, "#include <afs/stds.h>\n");
f_print(fout, "#include <sys/types.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, "#include <afs/rxgen_consts.h>\n");
if (uflag)
f_print(fout, "#include <ubik.h>\n");
}
}
-/*
- * 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)
{
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);
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");
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 (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);
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");
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");
}
}
}
/*
- * Parse command line arguments
+ * Parse command line arguments
*/
static int
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':
flag[(int)c] = 1;
break;
case 'o':
- case 's':
if (argv[i][j - 1] != '-' || argv[i][j + 1] != 0) {
return (0);
}
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] != '-')
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];
}
}
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'];
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);