Updated to fedora-glibc-20080703T1203
[kopensolaris-gnu/glibc.git] / sunrpc / rpc_main.c
index a5249e3..bda432d 100644 (file)
@@ -31,8 +31,6 @@
 /*
  * From @(#)rpc_main.c 1.30 89/03/30 (C) 1987 SMI;
  */
-const char main_rcsid[] =
-  "$Id$";
 
 /*
  * rpc_main.c, Top level of the RPC protocol compiler.
@@ -42,11 +40,13 @@ const char main_rcsid[] =
 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
+#include <libintl.h>
 #include <ctype.h>
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sys/file.h>
 #include <sys/stat.h>
+#include <sys/wait.h>
 #include "rpc_parse.h"
 #include "rpc_util.h"
 #include "rpc_scan.h"
@@ -78,13 +78,14 @@ static const char *cmdname;
 #define SUNOS_CPP "/lib/cpp"
 
 static const char *svcclosetime = "120";
-static int cppDefined = 0;     /* explicit path for C preprocessor */
+static int cppDefined; /* explicit path for C preprocessor */
 static const char *CPP = SUNOS_CPP;
-static char CPPFLAGS[] = "-C";
+static const char CPPFLAGS[] = "-C";
 static char *pathbuf;
+static int cpp_pid;
 static const char *allv[] =
 {
-  "rpcgen", "-s", "udp", "-s", "tcp",
+  "rpcgen", "-s", "udp", "-s", "tcp"
 };
 static int allc = sizeof (allv) / sizeof (allv[0]);
 static const char *allnv[] =
@@ -131,8 +132,8 @@ static void addarg (const char *cp);
 static void putarg (int whereto, const char *cp);
 static void checkfiles (const char *infile, const char *outfile);
 static int parseargs (int argc, const char *argv[], struct commandline *cmd);
-static void usage (void);
-static void options_usage (void);
+static void usage (void) __attribute__ ((noreturn));
+static void options_usage (void) __attribute__ ((noreturn));
 static void c_initialize (void);
 static char *generate_guard (const char *pathname);
 
@@ -164,17 +165,17 @@ int newstyle;                     /* newstyle of passing arguments (by value) */
 #ifdef __GNU_LIBRARY__
 int Cflag = 1;                 /* ANSI C syntax */
 #else
-int Cflag = 0;                 /* ANSI C/C++ syntax */
+int Cflag;                     /* ANSI C/C++ syntax */
 #endif
-int CCflag = 0;                        /* C++ files */
+int CCflag;                    /* C++ files */
 static int allfiles;           /* generate all files */
 #ifdef __GNU_LIBRARY__
-int tirpcflag = 0;             /* generating code for tirpc, by default */
+int tirpcflag;                 /* generating code for tirpc, by default */
 #else
 int tirpcflag = 1;             /* generating code for tirpc, by default */
 #endif
-xdrfunc *xdrfunc_head = NULL;  /* xdr function list */
-xdrfunc *xdrfunc_tail = NULL;  /* xdr function list */
+xdrfunc *xdrfunc_head;         /* xdr function list */
+xdrfunc *xdrfunc_tail;         /* xdr function list */
 
 int
 main (int argc, const char *argv[])
@@ -244,8 +245,8 @@ main (int argc, const char *argv[])
          mkfile_output (&cmd);
        }
     }
-  exit (nonfatalerrors);
-  /* NOTREACHED */
+
+  return nonfatalerrors;
 }
 
 /*
@@ -289,13 +290,24 @@ open_output (const char *infile, const char *outfile)
   fout = fopen (outfile, "w");
   if (fout == NULL)
     {
-      fprintf (stderr, _ ("%s: unable to open "), cmdname);
-      perror (outfile);
+      fprintf (stderr, _ ("%s: unable to open %s: %m\n"), cmdname, outfile);
       crash ();
     }
   record_open (outfile);
 }
 
+/* Close the output file and check for write errors.  */
+static void
+close_output (const char *outfile)
+{
+  if (fclose (fout) == EOF)
+    {
+      fprintf (stderr, _("%s: while writing output %s: %m"), cmdname,
+              outfile ?: "<stdout>");
+      crash ();
+    }
+}
+
 static void
 add_warning (void)
 {
@@ -354,7 +366,8 @@ open_input (const char *infile, const char *define)
       perror ("pipe");
       exit (1);
     }
-  switch (fork ())
+  cpp_pid = fork ();
+  switch (cpp_pid)
     {
     case 0:
       find_cpp ();
@@ -384,6 +397,32 @@ open_input (const char *infile, const char *define)
     }
 }
 
+/* Close the connection to the C-preprocessor and check for successfull
+   termination.  */
+static void
+close_input (void)
+{
+  int status;
+
+  fclose (fin);
+  /* Check the termination status.  */
+  if (waitpid (cpp_pid, &status, 0) < 0)
+    {
+      perror ("waitpid");
+      crash ();
+    }
+  if (WIFSIGNALED (status) || WEXITSTATUS (status) != 0)
+    {
+      if (WIFSIGNALED (status))
+       fprintf (stderr, _("%s: C preprocessor failed with signal %d\n"),
+                cmdname, WTERMSIG (status));
+      else
+       fprintf (stderr, _("%s: C preprocessor failed with exit code %d\n"),
+                cmdname, WEXITSTATUS (status));
+      crash ();
+    }
+}
+
 /* valid tirpc nettypes */
 static const char *valid_ti_nettypes[] =
 {
@@ -418,7 +457,7 @@ check_nettype (const char *name, const char *list_to_check[])
          return 1;
        }
     }
-  fprintf (stderr, _ ("illegal nettype :\'%s\'\n"), name);
+  fprintf (stderr, _ ("illegal nettype: `%s'\n"), name);
   return 0;
 }
 
@@ -454,6 +493,8 @@ c_output (const char *infile, const char *define, int extend,
 
   if (extend && tell == ftell (fout))
     unlink (outfilename);
+  close_input ();
+  close_output (outfilename);
 }
 
 void
@@ -490,7 +531,7 @@ generate_guard (const char *pathname)
 
   filename = strrchr (pathname, '/');  /* find last component */
   filename = ((filename == NULL) ? pathname : filename + 1);
-  guard = strdup (filename);
+  guard = extendfile (filename, "_H_RPCGEN");
   /* convert to upper case */
   tmp = guard;
   while (*tmp)
@@ -500,7 +541,6 @@ generate_guard (const char *pathname)
       tmp++;
     }
 
-  guard = extendfile (guard, "_H_RPCGEN");
   return guard;
 }
 
@@ -620,6 +660,9 @@ h_output (const char *infile, const char *define, int extend,
     }
 
   fprintf (fout, "\n#endif /* !_%s */\n", guard);
+  free (guard);
+  close_input ();
+  close_output (outfilename);
 }
 
 /*
@@ -648,11 +691,9 @@ s_output (int argc, const char *argv[], const char *infile, const char *define,
 
   fprintf (fout, "#include <stdio.h>\n");
   fprintf (fout, "#include <stdlib.h>\n");
+  fprintf (fout, "#include <rpc/pmap_clnt.h>\n");
   if (Cflag)
-    {
-      fprintf (fout, "#include <rpc/pmap_clnt.h>\n");
-      fprintf (fout, "#include <string.h>\n");
-    }
+    fprintf (fout, "#include <string.h>\n");
   if (strcmp (svcclosetime, "-1") == 0)
     indefinitewait = 1;
   else if (strcmp (svcclosetime, "0") == 0)
@@ -750,6 +791,8 @@ s_output (int argc, const char *argv[], const char *infile, const char *define,
        }
       write_rest ();
     }
+  close_input ();
+  close_output (outfilename);
 }
 
 /*
@@ -787,6 +830,8 @@ l_output (const char *infile, const char *define, int extend,
       return;
     }
   write_stubs ();
+  close_input ();
+  close_output (outfilename);
 }
 
 /*
@@ -814,6 +859,8 @@ t_output (const char *infile, const char *define, int extend,
       return;
     }
   write_tables ();
+  close_input ();
+  close_output (outfilename);
 }
 
 /* sample routine for the server template */
@@ -851,6 +898,8 @@ svc_output (const char *infile, const char *define, int extend,
     {
       unlink (outfilename);
     }
+  close_input ();
+  close_output (outfilename);
 }
 
 
@@ -893,8 +942,12 @@ clnt_output (const char *infile, const char *define, int extend,
     {
       unlink (outfilename);
     }
+  close_input ();
+  close_output (outfilename);
 }
 
+static const char space[] = " ";
+
 static char *
 file_name (const char *file, const char *ext)
 {
@@ -903,17 +956,17 @@ file_name (const char *file, const char *ext)
 
   if (access (temp, F_OK) != -1)
     return (temp);
-  else
-    return ((char *) " ");
+
+  free (temp);
+  return (char *) space;
 }
 
 static void
 mkfile_output (struct commandline *cmd)
 {
   char *mkfilename;
-  const char *clientname, *clntname, *xdrname, *hdrname;
-  const char *servername, *svcname, *servprogname, *clntprogname;
-  char *temp;
+  char *clientname, *clntname, *xdrname, *hdrname;
+  char *servername, *svcname, *servprogname, *clntprogname;
 
   svcname = file_name (cmd->infile, "_svc.c");
   clntname = file_name (cmd->infile, "_clnt.c");
@@ -927,20 +980,22 @@ mkfile_output (struct commandline *cmd)
     }
   else
     {
-      servername = " ";
-      clientname = " ";
+      servername = (char *) space;
+      clientname = (char *) space;
     }
   servprogname = extendfile (cmd->infile, "_server");
   clntprogname = extendfile (cmd->infile, "_client");
 
   if (allfiles)
     {
-      mkfilename = alloc (strlen ("Makefile.") +
-                         strlen (cmd->infile) + 1);
-      temp = (char *) rindex (cmd->infile, '.');
-      strcat (mkfilename, "Makefile.");
-      strncat (mkfilename, cmd->infile,
-              (temp - cmd->infile));
+      char *cp, *temp;
+
+      mkfilename = alloc (strlen ("Makefile.") + strlen (cmd->infile) + 1);
+      if (mkfilename == NULL)
+       abort ();
+      temp = rindex (cmd->infile, '.');
+      cp = stpcpy (mkfilename, "Makefile.");
+      strncpy (cp, cmd->infile, (temp - cmd->infile));
     }
   else
     mkfilename = (char *) cmd->outfile;
@@ -995,6 +1050,24 @@ $(LDLIBS) \n\n");
   f_print (fout, "\t$(LINK.c) -o $(SERVER) $(OBJECTS_SVC) $(LDLIBS)\n\n ");
   f_print (fout, "clean:\n\t $(RM) core $(TARGETS) $(OBJECTS_CLNT) \
 $(OBJECTS_SVC) $(CLIENT) $(SERVER)\n\n");
+  close_output (mkfilename);
+
+  free (clntprogname);
+  free (servprogname);
+  if (servername != space)
+    free (servername);
+  if (clientname != space)
+    free (clientname);
+  if (mkfilename != (char *) cmd->outfile)
+    free (mkfilename);
+  if (svcname != space)
+    free (svcname);
+  if (clntname != space)
+    free (clntname);
+  if (xdrname != space)
+    free (xdrname);
+  if (hdrname != space)
+    free (hdrname);
 }
 
 /*
@@ -1089,7 +1162,9 @@ checkfiles (const char *infile, const char *outfile)
       else
        {
          fprintf (stderr,
-                  _("file '%s' already exists and may be overwritten\n"),
+                  /* TRANS: the file will not be removed; this is an
+                     TRANS: informative message.  */
+                  _("file `%s' already exists and may be overwritten\n"),
                   outfile);
          crash ();
        }
@@ -1299,6 +1374,15 @@ parseargs (int argc, const char *argv[], struct commandline *cmd)
   cmd->Scflag = flag['C'];
   cmd->makefileflag = flag['M'];
 
+#ifndef _RPC_THREAD_SAFE_
+  if (mtflag || newstyle)
+    {
+      /* glibc doesn't support these flags.  */
+      f_print (stderr,
+              _("This implementation doesn't support newstyle or MT-safe code!\n"));
+      return (0);
+    }
+#endif
   if (tirpcflag)
     {
       pmflag = inetdflag ? 0 : 1;    /* pmflag or inetdflag is always TRUE */
@@ -1356,7 +1440,7 @@ parseargs (int argc, const char *argv[], struct commandline *cmd)
 static void
 usage (void)
 {
-  fprintf (stderr, _("usage:  %s infile\n"), cmdname);
+  fprintf (stderr, _("usage: %s infile\n"), cmdname);
   fprintf (stderr, _("\t%s [-abkCLNTM][-Dname[=value]] [-i size] \
 [-I [-K seconds]] [-Y path] infile\n"), cmdname);
   fprintf (stderr, _("\t%s [-c | -h | -l | -m | -t | -Sc | -Ss | -Sm] \