X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=sysklogd%2Flogread.c;h=932bbecbba830200fe2e138d09db97519aa8442b;hb=11a802a0fa04627110809d908c588aa2c471d5aa;hp=597e285a52c132e3528eea43bfbb0de9865f32db;hpb=5f1b149d541ebba7cab841cb647f113248f9fb8f;p=oweals%2Fbusybox.git diff --git a/sysklogd/logread.c b/sysklogd/logread.c index 597e285a5..932bbecbb 100644 --- a/sysklogd/logread.c +++ b/sysklogd/logread.c @@ -16,20 +16,34 @@ #define DEBUG 0 +/* our shared key (syslogd.c and logread.c must be in sync) */ enum { KEY_ID = 0x414e4547 }; /* "GENA" */ -static struct shbuf_ds { +struct shbuf_ds { int32_t size; // size of data - 1 int32_t tail; // end of message list char data[1]; // messages -} *shbuf; - -// Semaphore operation structures -static struct sembuf SMrup[1] = {{0, -1, IPC_NOWAIT | SEM_UNDO}}; // set SMrup -static struct sembuf SMrdn[2] = {{1, 0}, {0, +1, SEM_UNDO}}; // set SMrdn - - -static void error_exit(const char *str) ATTRIBUTE_NORETURN; +}; + +static const struct sembuf init_sem[3] = { + {0, -1, IPC_NOWAIT | SEM_UNDO}, + {1, 0}, {0, +1, SEM_UNDO} +}; + +struct globals { + struct sembuf SMrup[1]; // {0, -1, IPC_NOWAIT | SEM_UNDO}, + struct sembuf SMrdn[2]; // {1, 0}, {0, +1, SEM_UNDO} + struct shbuf_ds *shbuf; +}; +#define G (*(struct globals*)&bb_common_bufsiz1) +#define SMrup (G.SMrup) +#define SMrdn (G.SMrdn) +#define shbuf (G.shbuf) +#define INIT_G() do { \ + memcpy(SMrup, init_sem, sizeof(init_sem)); \ +} while (0) + +static void error_exit(const char *str) NORETURN; static void error_exit(const char *str) { //release all acquired resources @@ -46,20 +60,22 @@ static void sem_up(int semid) error_exit("semop[SMrup]"); } -static void interrupted(int sig ATTRIBUTE_UNUSED) +static void interrupted(int sig UNUSED_PARAM) { signal(SIGINT, SIG_IGN); shmdt(shbuf); - exit(0); + exit(EXIT_SUCCESS); } -int logread_main(int argc, char **argv); -int logread_main(int argc, char **argv) +int logread_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int logread_main(int argc UNUSED_PARAM, char **argv) { - int cur; + unsigned cur; int log_semid; /* ipc semaphore id */ int log_shmid; /* ipc shared memory id */ - smallint follow = getopt32(argc, argv, "f"); + smallint follow = getopt32(argv, "f"); + + INIT_G(); log_shmid = shmget(KEY_ID, 0, 0); if (log_shmid == -1) @@ -119,7 +135,7 @@ int logread_main(int argc, char **argv) } else { /* logread -f */ if (cur == shbuf_tail) { sem_up(log_semid); - fflush(stdout); + fflush_all(); sleep(1); /* TODO: replace me with a sleep_on */ continue; }