From 72b3442aeb948a9f27822d8888df765393b9ecd4 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 27 Mar 2008 13:14:29 +0000 Subject: [PATCH] fbsplash: support this usage: mkfifo cmd_pipe fbsplash -f cmd_pipe .... & ... echo 33 >cmd_pipe ... echo 66 >cmd_pipe Code size: fbsplash_main +116 bytes :( --- include/usage.h | 2 -- miscutils/Config.in | 4 ++-- miscutils/fbsplash.c | 39 ++++++++++++++++++++++++++++++--------- 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/usage.h b/include/usage.h index f830fb35c..f950a0a49 100644 --- a/include/usage.h +++ b/include/usage.h @@ -133,8 +133,6 @@ "\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 \ diff --git a/miscutils/Config.in b/miscutils/Config.in index e740a4451..c6c1490df 100644 --- a/miscutils/Config.in +++ b/miscutils/Config.in @@ -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" 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; }