From 72b3442aeb948a9f27822d8888df765393b9ecd4 Mon Sep 17 00:00:00 2001 From: Denis Vlasenko Date: Thu, 27 Mar 2008 13:14:29 +0000 Subject: 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 :( --- miscutils/fbsplash.c | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'miscutils/fbsplash.c') diff --git a/miscutils/fbsplash.c b/miscutils/fbsplash.c index 2fc3fae13..f254f5630 100644 --- a/miscutils/fbsplash.c +++ b/miscutils/fbsplash.c @@ -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 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; } -- cgit v1.2.3