From e1682f4dd693c6d8a5699a8a0291c5a9108fd5a8 Mon Sep 17 00:00:00 2001 From: Mark Hills Date: Wed, 22 Oct 2014 21:21:14 +0100 Subject: [PATCH] Add an optional daemon mode --- rx.c | 12 ++++++++++-- sched.c | 29 +++++++++++++++++++++++++++++ sched.h | 1 + tx.c | 14 +++++++++++--- 4 files changed, 51 insertions(+), 5 deletions(-) diff --git a/rx.c b/rx.c index cde9967..c5c3c10 100644 --- a/rx.c +++ b/rx.c @@ -162,9 +162,10 @@ static void usage(FILE *fd) fprintf(fd, " -c Number of channels (default %d)\n", DEFAULT_CHANNELS); - fprintf(fd, "\nDisplay parameters:\n"); + fprintf(fd, "\nProgram parameters:\n"); fprintf(fd, " -v Verbosity level (default %d)\n", DEFAULT_VERBOSE); + fprintf(fd, " -D Run as a daemon, writing process ID to the given file\n"); } int main(int argc, char *argv[]) @@ -176,7 +177,8 @@ int main(int argc, char *argv[]) /* command-line options */ const char *device = DEFAULT_DEVICE, - *addr = DEFAULT_ADDR; + *addr = DEFAULT_ADDR, + *pid = NULL; unsigned int buffer = DEFAULT_BUFFER, rate = DEFAULT_RATE, jitter = DEFAULT_JITTER, @@ -216,6 +218,9 @@ int main(int argc, char *argv[]) case 'v': verbose = atoi(optarg); break; + case 'D': + pid = optarg; + break; default: usage(stderr); return -1; @@ -244,6 +249,9 @@ int main(int argc, char *argv[]) if (set_alsa_sw(snd) == -1) return -1; + if (pid) + go_daemon(pid); + go_realtime(); r = run_rx(session, decoder, snd, channels, rate); diff --git a/sched.c b/sched.c index 9d4210b..a8338d1 100644 --- a/sched.c +++ b/sched.c @@ -19,6 +19,7 @@ #include #include +#include #include "sched.h" @@ -49,3 +50,31 @@ int go_realtime(void) return 0; } + +int go_daemon(const char *pid_file) +{ + FILE *f; + + if (daemon(0, 0) == -1) { + perror("daemon"); + return -1; + } + + if (!pid_file) + return 0; + + f = fopen(pid_file, "w"); + if (!f) { + perror("fopen"); + return -1; + } + + fprintf(f, "%d", getpid()); + + if (fclose(f) != 0) { + perror("fclose"); + return -1; + } + + return 0; +} diff --git a/sched.h b/sched.h index ee55232..bbaa02f 100644 --- a/sched.h +++ b/sched.h @@ -21,5 +21,6 @@ #define MISC_H int go_realtime(void); +int go_daemon(const char *pid_file); #endif diff --git a/tx.c b/tx.c index a6d027c..79151fa 100644 --- a/tx.c +++ b/tx.c @@ -149,9 +149,10 @@ static void usage(FILE *fd) fprintf(fd, " -b Bitrate (approx., default %d)\n", DEFAULT_BITRATE); - fprintf(fd, "\nDisplay parameters:\n"); + fprintf(fd, "\nProgram parameters:\n"); fprintf(fd, " -v Verbosity level (default %d)\n", DEFAULT_VERBOSE); + fprintf(fd, " -D Run as a daemon, writing process ID to the given file\n"); fprintf(fd, "\nAllowed frame sizes (-f) are defined by the Opus codec. For example,\n" "at 48000Hz the permitted values are 120, 240, 480 or 960.\n"); @@ -168,7 +169,8 @@ int main(int argc, char *argv[]) /* command-line options */ const char *device = DEFAULT_DEVICE, - *addr = DEFAULT_ADDR; + *addr = DEFAULT_ADDR, + *pid = NULL; unsigned int buffer = DEFAULT_BUFFER, rate = DEFAULT_RATE, channels = DEFAULT_CHANNELS, @@ -181,7 +183,7 @@ int main(int argc, char *argv[]) for (;;) { int c; - c = getopt(argc, argv, "b:c:d:f:h:m:p:r:v:"); + c = getopt(argc, argv, "b:c:d:f:h:m:p:r:v:D:"); if (c == -1) break; @@ -213,6 +215,9 @@ int main(int argc, char *argv[]) case 'v': verbose = atoi(optarg); break; + case 'D': + pid = optarg; + break; default: usage(stderr); return -1; @@ -249,6 +254,9 @@ int main(int argc, char *argv[]) if (set_alsa_sw(snd) == -1) return -1; + if (pid) + go_daemon(pid); + go_realtime(); r = run_tx(snd, channels, frame, encoder, bytes_per_frame, ts_per_frame, session);