diff --git a/client/snapClient.cpp b/client/snapClient.cpp index 3d2f4c4b..6b30c17a 100644 --- a/client/snapClient.cpp +++ b/client/snapClient.cpp @@ -88,6 +88,7 @@ int main (int argc, char **argv) Implicit daemonOption("d", "daemon", "daemonize, optional process priority [-20..19]", -3, &processPriority); Value latencyValue("", "latency", "latency of the soundcard", 0, &latency); Value instanceValue("i", "instance", "instance id", 1, &instance); + Value userValue("", "user", "the user[:group] to run snapclient as when daemonized", "snapclient:audio"); OptionParser op("Allowed options"); op.add(helpSwitch) @@ -100,6 +101,7 @@ int main (int argc, char **argv) #endif #ifdef HAS_DAEMON .add(daemonOption) + .add(userValue) #endif .add(latencyValue) .add(instanceValue); @@ -163,7 +165,14 @@ int main (int argc, char **argv) string pidFile = "/var/run/snapclient/pid"; if (instance != 1) pidFile += "." + cpt::to_string(instance); - daemonize("snapclient", "audio", pidFile); + + if (userValue.getValue().empty()) + std::invalid_argument("user must not be empty"); + + vector user_group = split(userValue.getValue(), ':'); + string user = user_group[0]; + string group = (user_group.size() == 1)?user_group[0]:user_group[1]; + daemonize(user, group, pidFile); if (processPriority < -20) processPriority = -20; else if (processPriority > 19) diff --git a/openWrt/snapclient.init b/openWrt/snapclient.init index 9cbcf9ca..b063a0a7 100755 --- a/openWrt/snapclient.init +++ b/openWrt/snapclient.init @@ -9,7 +9,7 @@ SERVICE_PID_FILE=/var/run/$SERVICE_NAME/pid DESC="Snapcast client" DAEMON=/usr/bin/$SERVICE_NAME -SNAPCLIENT_OPTS="-d" +SNAPCLIENT_OPTS="-d --user root" # Exit if the package is not installed diff --git a/openWrt/snapserver.init b/openWrt/snapserver.init index 2baf9a3f..07d9e6af 100755 --- a/openWrt/snapserver.init +++ b/openWrt/snapserver.init @@ -9,7 +9,7 @@ SERVICE_PID_FILE=/var/run/$SERVICE_NAME/pid DESC="Snapcast server" DAEMON=/usr/bin/$SERVICE_NAME -SNAPSERVER_OPTS="-d" +SNAPSERVER_OPTS="-d --user root" # Exit if the package is not installed diff --git a/server/snapServer.cpp b/server/snapServer.cpp index 94c3ad66..e510f31f 100644 --- a/server/snapServer.cpp +++ b/server/snapServer.cpp @@ -68,6 +68,7 @@ int main(int argc, char* argv[]) Value bufferValue("b", "buffer", "Buffer [ms]", settings.bufferMs, &settings.bufferMs); Implicit daemonOption("d", "daemon", "Daemonize\noptional process priority [-20..19]", 0, &processPriority); + Value userValue("", "user", "the user[:group] to run snapserver as when daemonized", "snapserver:snapserver"); OptionParser op("Allowed options"); op.add(helpSwitch) @@ -81,6 +82,7 @@ int main(int argc, char* argv[]) .add(bufferValue) #ifdef HAS_DAEMON .add(daemonOption) + .add(userValue) #endif ; @@ -144,7 +146,13 @@ int main(int argc, char* argv[]) if (daemonOption.isSet()) { #ifdef HAS_DAEMON - daemonize("snapserver", "snapserver", "/var/run/snapserver/pid"); + if (userValue.getValue().empty()) + std::invalid_argument("user must not be empty"); + + vector user_group = split(userValue.getValue(), ':'); + string user = user_group[0]; + string group = (user_group.size() == 1)?user_group[0]:user_group[1]; + daemonize(user, group, "/var/run/snapserver/pid"); if (processPriority < -20) processPriority = -20; else if (processPriority > 19)