lpd: small shrink
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 25 Mar 2008 06:03:19 +0000 (06:03 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 25 Mar 2008 06:03:19 +0000 (06:03 -0000)
lpd_main     761     747     -14

printutils/lpd.c

index f4c902c79719648c46fe9395f91a3181cedc66de..953324452d7c8b3e7c1b3e80804965b4725c93ee 100644 (file)
@@ -87,43 +87,6 @@ static char *sane(char *str)
        return str;
 }
 
-// we can use leaky setenv since we are about to exec or exit
-static void exec_helper(char **filenames, char **argv) ATTRIBUTE_NORETURN;
-static void exec_helper(char **filenames, char **argv)
-{
-       char *p, *q;
-       char var[2];
-
-       var[1] = '\0';
-
-       // read and delete ctrlfile
-       q = xmalloc_open_read_close(filenames[0], NULL);
-       unlink(filenames[0]);
-       // provide datafile name
-       xsetenv("DATAFILE", filenames[1]);
-       // parse control file by "\n"
-       while ((p = strchr(q, '\n')) != NULL
-        && isalpha(*q)
-       ) {
-               *p++ = '\0';
-               // q is a line of <SYM><VALUE>,
-               // we are setting environment string <SYM>=<VALUE>.
-               // Ignoring "l<datafile>", exporting others:
-               if (*q != 'l') {
-                       var[0] = *q++;
-                       xsetenv(var, q);
-               }
-               // next line, plz!
-               q = p;
-       }
-       // we are the helper, we wanna be silent.
-       // this call reopens stdio fds to "/dev/null"
-       // (no daemonization is done)
-       bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL);
-       BB_EXECVP(*argv, argv);
-       exit(127); // it IS error if helper cannot be executed!
-}
-
 static char *xmalloc_read_stdin(void)
 {
        // SECURITY:
@@ -184,12 +147,42 @@ int lpd_main(int argc ATTRIBUTE_UNUSED, char *argv[])
                // N.B. we bail out on any error
                s = xmalloc_read_stdin();
                if (!s) { // (probably) EOF
-                       if (spooling /* && 7 != spooling - always true */) {
-                               // we didn't see both ctrlfile & datafile!
-                               goto err_exit;
+                       char *p, *q, var[2];
+
+                       // non-spooling mode or no spool helper specified
+                       if (!spooling || !*argv)
+                               return EXIT_SUCCESS; // the only non-error exit
+                       // spooling mode but we didn't see both ctrlfile & datafile
+                       if (spooling != 7)
+                               goto err_exit; // reject job
+
+                       // spooling mode and spool helper specified -> exec spool helper
+                       // (we exit 127 if helper cannot be executed)
+                       var[1] = '\0';
+                       // read and delete ctrlfile
+                       q = xmalloc_open_read_close(filenames[0], NULL);
+                       unlink(filenames[0]);
+                       // provide datafile name
+                       // we can use leaky setenv since we are about to exec or exit
+                       xsetenv("DATAFILE", filenames[1]);
+                       // parse control file by "\n"
+                       while ((p = strchr(q, '\n')) != NULL && isalpha(*q)) {
+                               *p++ = '\0';
+                               // q is a line of <SYM><VALUE>,
+                               // we are setting environment string <SYM>=<VALUE>.
+                               // Ignoring "l<datafile>", exporting others:
+                               if (*q != 'l') {
+                                       var[0] = *q++;
+                                       xsetenv(var, q);
+                               }
+                               q = p; // next line
                        }
-                       // one of only two non-error exits
-                       return EXIT_SUCCESS;
+                       // helper should not talk over network.
+                       // this call reopens stdio fds to "/dev/null"
+                       // (no daemonization is done)
+                       bb_daemonize_or_rexec(DAEMON_DEVNULL_STDIO | DAEMON_ONLY_SANITIZE, NULL);
+                       BB_EXECVP(*argv, argv);
+                       exit(127);
                }
 
                // validate input.
@@ -269,14 +262,6 @@ int lpd_main(int argc ATTRIBUTE_UNUSED, char *argv[])
 
                free(s);
                close(fd); // NB: can do close(-1). Who cares?
-
-               // spawn spool helper and exit if all files are dumped
-               if (7 == spooling && *argv) {
-                       // signal OK
-                       safe_write(STDOUT_FILENO, "", 1);
-                       // does not return (exits 0)
-                       exec_helper(filenames, argv);
-               }
        } // while (1)
 
  err_exit: