From: Mike Brady Date: Sat, 22 Apr 2017 14:00:22 +0000 (+0100) Subject: Add FreeBSD service and installation. Change default PID file directory. SystemV... X-Git-Tag: 3.1d16~59 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0df8bf31055bbdb6fbd1806ae0c41c696358bef7;p=thirdparty%2Fshairport-sync.git Add FreeBSD service and installation. Change default PID file directory. SystemV and SystemD scripts should be updated. --- diff --git a/Makefile.am b/Makefile.am index 3dfae1d3..91b64cd3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,11 @@ bin_PROGRAMS = shairport-sync shairport_sync_SOURCES = shairport.c rtsp.c mdns.c mdns_external.c common.c rtp.c player.c alac.c audio.c loudness.c AM_CFLAGS = -Wno-multichar -DSYSCONFDIR=\"$(sysconfdir)\" -O2 -AM_CPPFLAGS = -Wno-multichar -DSYSCONFDIR=\"$(sysconfdir)\" -O2 +if BUILD_FOR_FREEBSD + AM_CPPFLAGS = -I/usr/local/include -Wno-multichar -DSYSCONFDIR=\"$(sysconfdir)\" -O2 +else + AM_CPPFLAGS = -Wno-multichar -DSYSCONFDIR=\"$(sysconfdir)\" -O2 +endif if USE_APPLE_ALAC shairport_sync_SOURCES += apple_alac.cpp @@ -70,11 +74,19 @@ if INSTALL_CONFIG_FILES cp scripts/shairport-sync.conf $(DESTDIR)$(sysconfdir)/shairport-sync.conf.sample [ -f $(DESTDIR)$(sysconfdir)/shairport-sync.conf ] || cp scripts/shairport-sync.conf $(DESTDIR)$(sysconfdir)/shairport-sync.conf endif -if INSTALL_SYSTEMV +if BUILD_FOR_SYSTEMV [ -e $(DESTDIR)$(sysconfdir)/init.d ] || mkdir -p $(DESTDIR)$(sysconfdir)/init.d [ -f $(DESTDIR)$(sysconfdir)/init.d/shairport-sync ] || cp scripts/shairport-sync $(DESTDIR)$(sysconfdir)/init.d/ endif -if INSTALL_SYSTEMD +if BUILD_FOR_SYSTEMD [ -e $(DESTDIR)$(systemdsystemunitdir) ] || mkdir -p $(DESTDIR)$(systemdsystemunitdir) [ -f $(DESTDIR)$(systemdsystemunitdir)/shairport-sync.service ] || cp scripts/shairport-sync.service $(DESTDIR)$(systemdsystemunitdir) endif +if BUILD_FOR_FREEBSD + pw showgroup shairport-sync > /dev/null 2>&1 || pw addgroup shairport-sync > /dev/null 2>&1 + pw showuser shairport-sync > /dev/null 2>&1 || pw adduser shairport-sync > /dev/null 2>&1 + [ -e /var/run/shairport-sync ] || mkdir -p /var/run/shairport-sync + chown shairport-sync:shairport-sync /var/run/shairport-sync + [ -f /usr/local/etc/rc.d/shairport-sync ] || cp scripts/shairport-sync.freebsd /usr/local/etc/rc.d/shairport-sync + chmod 555 /usr/local/etc/rc.d/shairport-sync +endif diff --git a/configure.ac b/configure.ac index 465141ff..d35eb2fb 100644 --- a/configure.ac +++ b/configure.ac @@ -8,8 +8,6 @@ AC_CONFIG_SRCDIR([shairport.c]) AC_CONFIG_HEADERS([config.h]) # Derived from the Avahi configure.ac file -# -# # Specifying the OS type, defaulting to linux. # AC_ARG_WITH(os_type, AS_HELP_STRING([--with-os-type=OSType],[Specify the distribution to target: One of linux freebsd or darwin])) @@ -30,6 +28,8 @@ if test "x${with_os_type}" = xlinux -o "x${with_os_type}" = xfreebsd ; then AC_CHECK_LIB([rt],[clock_gettime], , AC_MSG_ERROR(librt needed)) fi +AM_CONDITIONAL([BUILD_FOR_FREEBSD], [test "x${with_os_type}" = xfreebsd ]) + ##### Some build systems are not fully using pkg-config, so we can use the flag ${with_pkg_config} on a case-by-case basis ##### to control how to deal with them @@ -73,13 +73,13 @@ AM_CONDITIONAL([USE_PIPE], [test "x$with_pipe" = "xyes" ]) AC_ARG_WITH([systemv], [ --with-systemv = install a System V startup script during a make install], , ) -AM_CONDITIONAL([INSTALL_SYSTEMV], [test "x$with_systemv" = "xyes"]) +AM_CONDITIONAL([BUILD_FOR_SYSTEMV], [test "x$with_systemv" = "xyes"]) # Check to see if we should include the systemd stuff to define it as a service AC_ARG_WITH([systemd], [ --with-systemd = install a systemd service description file during a make install], , ) -AM_CONDITIONAL([INSTALL_SYSTEMD], [test "x$with_systemd" = "xyes"]) +AM_CONDITIONAL([BUILD_FOR_SYSTEMD], [test "x$with_systemd" = "xyes"]) # Add the libconfig package if test "x${with_pkg_config}" = xyes ; then diff --git a/scripts/shairport-sync.freebsd b/scripts/shairport-sync.freebsd new file mode 100644 index 00000000..779a1eb2 --- /dev/null +++ b/scripts/shairport-sync.freebsd @@ -0,0 +1,26 @@ +#!/bin/sh +# +# $FreeBSD: releng/11.0/etc/rc.d/motd 298514 2016-04-23 16:10:54Z lme $ +# + +# PROVIDE: shairport-sync +# REQUIRE: FILESYSTEMS DAEMON hostname + +. /etc/rc.subr + +name="shairport-sync" +start_cmd="${name}_start" +stop_cmd="${name}_stop" + +shairport-sync_start() +{ + su -m shairport-sync -c "/usr/local/bin/shairport-sync -d" +} + +shairport-sync_stop() +{ + su -m shairport-sync -c "/usr/local/bin/shairport-sync -k" +} + +load_rc_config $name +run_rc_command "$1" diff --git a/shairport.c b/shairport.c index 3e34d60c..3dfdb7f1 100644 --- a/shairport.c +++ b/shairport.c @@ -873,9 +873,9 @@ void shairport_startup_complete(void) { } } -#ifdef USE_CUSTOM_PID_DIR const char *pid_file_proc(void) { +#ifdef USE_CUSTOM_PID_DIR #ifdef HAVE_ASPRINTF static char *fn = NULL; asprintf(&fn, "%s/%s.pid", PIDDIR, daemon_pid_file_ident ? daemon_pid_file_ident : "unknown"); @@ -884,10 +884,18 @@ const char *pid_file_proc(void) { snprintf(fn, sizeof(fn), "%s/%s.pid", PIDDIR, daemon_pid_file_ident ? daemon_pid_file_ident : "unknown"); #endif - +#else +#ifdef HAVE_ASPRINTF + static char *fn = NULL; + asprintf(&fn, "/var/run/shairport-sync/%s.pid", daemon_pid_file_ident ? daemon_pid_file_ident : "unknown"); +#else + static char fn[8192]; + snprintf(fn, sizeof(fn), "/var/run/shairport-sync/%s.pid", + daemon_pid_file_ident ? daemon_pid_file_ident : "unknown"); +#endif +#endif return fn; } -#endif void exit_function() { if (config.cfg) @@ -1005,11 +1013,10 @@ int main(int argc, char **argv) { return 1; } -#if USE_CUSTOM_PID_DIR - debug(1, "Locating custom pid dir at \"%s\"", PIDDIR); - /* Point to a function to help locate where the PID file will go */ + // Point to a function to help locate where the PID file will go + // We always use this function because the default location + // is unsatisfactory. By default we want to use /var/run/shairport-sync/. daemon_pid_file_proc = pid_file_proc; -#endif /* Set indentification string for the daemon for both syslog and PID file */ daemon_pid_file_ident = daemon_log_ident = daemon_ident_from_argv0(argv[0]);