fbsplash: support this usage:
authorDenis Vlasenko <vda.linux@googlemail.com>
Thu, 27 Mar 2008 13:14:29 +0000 (13:14 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Thu, 27 Mar 2008 13:14:29 +0000 (13:14 -0000)
mkfifo cmd_pipe
fbsplash -f cmd_pipe .... &
...
echo 33 >cmd_pipe
...
echo 66 >cmd_pipe

Code size: fbsplash_main +116 bytes :(

include/usage.h
miscutils/Config.in
miscutils/fbsplash.c

index f830fb35c7d02e58569098cf9694f2a45408eb9c..f950a0a4943a27c1da08139739166f9f27775f9a 100644 (file)
      "\n       -f      Control pipe (else exit after drawing image)" \
      "\n                       commands: 'NN' (% for progress bar) or 'exit'" \
 
-
-
 #define brctl_trivial_usage \
        "COMMAND [BRIDGE [INTERFACE]]"
 #define brctl_full_usage \
index e740a4451f22e1578d0099234507addd1938d235..c6c1490df2c5cadd6bc0faded39d6addaa394621 100644 (file)
@@ -214,13 +214,13 @@ config FBSPLASH
            -c: hide cursor
            -d /dev/fbN: framebuffer device (if not /dev/fb0)
            -s path_to_image_file (can be "-" for stdin)
-           -i path_to_cfg_file
+           -i path_to_cfg_file (can be "-" for stdin)
            -f path_to_fifo (can be "-" for stdin)
          - if you want to run it only in presence of kernel parameter:
            grep -q "fbsplash=on" </proc/cmdline && setsid fbsplash [params] &
          - commands for fifo:
            "NN" (ASCII decimal number) - percentage to show on progress bar
-           "exit" (or just close fifo) - well you guessed it
+           "exit" - well you guessed it
 
 config LAST
        bool "last"
index 2fc3fae13c89c57763097c4d7d78ea686ccf212b..f254f56307d85ba30e5b51bd1ec0754d3cad22a3 100644 (file)
@@ -394,7 +394,8 @@ int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv)
 
        fb_drawimage();
 
-       if (fifo_filename) {
+       if (fifo_filename) while (1) {
+               struct stat statbuf;
                unsigned num;
                char *num_buf;
 
@@ -402,11 +403,16 @@ int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv)
                // Block on read, waiting for some input.
                // Use of <stdio.h> style I/O allows to correctly
                // handle a case when we have many buffered lines
-               // already in the pipe.
+               // already in the pipe
                while ((num_buf = xmalloc_fgetline(fp)) != NULL) {
                        if (strncmp(num_buf, "exit", 4) == 0) {
                                DEBUG_MESSAGE("exit");
-                               break;
+ exit_cmd:
+                               if (bCursorOff) {
+                                       // restore cursor
+                                       full_write(STDOUT_FILENO, "\x1b" "[?25h", 6);
+                               }
+                               return EXIT_SUCCESS;
                        }
                        num = atoi(num_buf);
                        if (isdigit(num_buf[0]) && (num <= 100)) {
@@ -419,13 +425,28 @@ int fbsplash_main(int argc ATTRIBUTE_UNUSED, char **argv)
                        }
                        free(num_buf);
                }
-               if (bCursorOff) {
-                       // restore cursor
-                       full_write(STDOUT_FILENO, "\x1b" "[?25h", 6);
+               // We got EOF/error on fp
+               if (ferror(fp))
+                       goto exit_cmd;
+               fclose(fp);
+               if (LONE_DASH(fifo_filename)
+                || stat(fifo_filename, &statbuf) != 0
+                || !S_ISFIFO(statbuf.st_mode)
+               ) {
+                       goto exit_cmd;
                }
-               if (ENABLE_FEATURE_CLEAN_UP)
-                       fclose(fp);
-       }
+               // It's really a named pipe!
+               // For named pipes, we want to support this:
+               //  mkfifo cmd_pipe
+               //  fbsplash -f cmd_pipe .... &
+               //  ...
+               //  echo 33 >cmd_pipe
+               //  ...
+               //  echo 66 >cmd_pipe
+               // This means that on EOF, we need to close/open cmd_pipe
+               // (just reading again works too, but it hogs CPU)
+               fp = xfopen_stdin(fifo_filename); // blocks on open
+       } // end of while (1)
 
        return EXIT_SUCCESS;
 }