diff --git a/Makefile b/Makefile index e99c4f79..b33d46be 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ endif PREFIX ?= /usr/local -SRCS := shairport.c rtsp.c mdns.c common.c rtp.c player.c alac.c audio.c audio_dummy.c audio_pipe.c +SRCS := shairport.c daemon.c rtsp.c mdns.c common.c rtp.c player.c alac.c audio.c audio_dummy.c audio_pipe.c ifdef CONFIG_AO SRCS += audio_ao.c diff --git a/daemon.c b/daemon.c new file mode 100644 index 00000000..76ce81c9 --- /dev/null +++ b/daemon.c @@ -0,0 +1,79 @@ +/* + * This file is part of Shairport. + * Copyright (c) Paul Lietar 2013 + * All rights reserved. + * + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include +#include +#include +#include + +#include "common.h" + +static int lock_fd = -1; +static int daemon_pipe[2] = {-1, -1}; + +void daemon_init() { + int ret; + ret = pipe(daemon_pipe); + if (ret < 0) + die("couldn't create a pipe?!"); + + pid_t pid = fork(); + if (pid < 0) + die("failed to fork!"); + + if (pid) { + char buf[8]; + ret = read(daemon_pipe[0], buf, sizeof(buf)); + if (ret < 0) { + printf("Spawning the daemon failed.\n"); + exit(1); + } + + printf("%d\n", pid); + exit(0); + } + else { + if (config.pidfile) { + lock_fd = open(config.pidfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); + if (lock_fd < 0) { + die("Could not open pidfile"); + } + + ret = lockf(lock_fd,F_TLOCK,0); + if (ret < 0) { + die("Could not lock pidfile. Is an other instance running ?"); + } + + dprintf(lock_fd, "%d\n", getpid()); + } + } +} + +void daemon_ready() { + write(daemon_pipe[1], "ok", 2); + close(daemon_pipe[1]); +} + diff --git a/daemon.h b/daemon.h new file mode 100644 index 00000000..a1bb97ed --- /dev/null +++ b/daemon.h @@ -0,0 +1,7 @@ +#ifndef _DAEMON_H +#define _DAEMON_H + +void daemon_init(); +void daemon_ready(); + +#endif // _DAEMON_H diff --git a/shairport.c b/shairport.c index db67ddab..8afd12bf 100644 --- a/shairport.c +++ b/shairport.c @@ -174,13 +174,11 @@ void signal_setup(void) { sigaction(SIGCHLD, &sa, NULL); } -static int daemon_pipe[2] = {-1, -1}; // forked daemon lets the spawner know it's up and running OK // should be called only once! void shairport_startup_complete(void) { if (config.daemonise) { - write(daemon_pipe[1], "ok", 2); - close(daemon_pipe[1]); + daemon_ready(); } } @@ -199,49 +197,8 @@ int main(int argc, char **argv) { // parse arguments into config int audio_arg = parse_options(argc, argv); - int ret; if (config.daemonise) { - ret = pipe(daemon_pipe); - if (ret < 0) - die("couldn't create a pipe?!"); - - pid_t pid = fork(); - if (pid < 0) - die("failed to fork!"); - - if (pid) { - char buf[8]; - ret = read(daemon_pipe[0], buf, sizeof(buf)); - if (ret < 0) { - printf("Spawning the daemon failed.\n"); - exit(1); - } - - printf("%d\n", pid); - exit(0); - } - else { - int lock_fd = -1; - if (config.pidfile) - { - struct flock lock; - lock.l_type = F_WRLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - - lock_fd = open(config.pidfile, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR); - if (lock_fd < 0) - { - die("Could not open pidfile"); - } - if (lockf(lock_fd,F_TLOCK,0) < 0) - { - die("Could not lock pidfile. Is an other instance running ?"); - } - dprintf(lock_fd, "%d\n", getpid()); - } - } + daemon_init(); } config.output = audio_get_output(config.output_name);