summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2018-08-01 20:20:29 +0200
committerMax Kellermann <max@musicpd.org>2018-08-01 20:20:29 +0200
commitdfda0faac7a16365879d0076711ff1c3b286a16e (patch)
tree4fb61a4a4ce54d60d70dab8442b601278befabf2
parent95acc4be076f4147c42c4e0ab2968bbf6bb80fc7 (diff)
unix/{Daemon,PidFile}: throw exception on error
Don't use the bad `FatalError` library.
-rw-r--r--src/unix/Daemon.cxx41
-rw-r--r--src/unix/Daemon.hxx4
-rw-r--r--src/unix/PidFile.hxx6
3 files changed, 25 insertions, 26 deletions
diff --git a/src/unix/Daemon.cxx b/src/unix/Daemon.cxx
index 826836849..2c0969c96 100644
--- a/src/unix/Daemon.cxx
+++ b/src/unix/Daemon.cxx
@@ -19,9 +19,10 @@
#include "config.h"
#include "Daemon.hxx"
-#include "system/FatalError.hxx"
+#include "system/Error.hxx"
#include "fs/AllocatedPath.hxx"
#include "fs/FileSystem.hxx"
+#include "util/RuntimeError.hxx"
#ifndef _WIN32
#include "PidFile.hxx"
@@ -69,18 +70,17 @@ void
daemonize_kill(void)
{
if (pidfile.IsNull())
- FatalError("no pid_file specified in the config file");
+ throw std::runtime_error("no pid_file specified in the config file");
const pid_t pid = ReadPidFile(pidfile);
if (pid < 0) {
const std::string utf8 = pidfile.ToUTF8();
- FormatFatalError("unable to read the pid from file \"%s\"",
- utf8.c_str());
+ throw FormatErrno("unable to read the pid from file \"%s\"",
+ utf8.c_str());
}
if (kill(pid, SIGTERM) < 0)
- FormatFatalSystemError("unable to kill process %i",
- int(pid));
+ throw FormatErrno("unable to kill process %i", int(pid));
exit(EXIT_SUCCESS);
}
@@ -101,8 +101,7 @@ daemonize_set_user(void)
/* set gid */
if (user_gid != (gid_t)-1 && user_gid != getgid() &&
setgid(user_gid) == -1) {
- FormatFatalSystemError("Failed to set group %d",
- (int)user_gid);
+ throw FormatErrno("Failed to set group %d", (int)user_gid);
}
#ifdef HAVE_INITGROUPS
@@ -114,17 +113,16 @@ daemonize_set_user(void)
we are already this user */
user_uid != getuid() &&
initgroups(user_name, user_gid) == -1) {
- FormatFatalSystemError("Failed to set supplementary groups "
- "of user \"%s\"",
- user_name);
+ throw FormatErrno("Failed to set supplementary groups "
+ "of user \"%s\"",
+ user_name);
}
#endif
/* set uid */
if (user_uid != (uid_t)-1 && user_uid != getuid() &&
setuid(user_uid) == -1) {
- FormatFatalSystemError("Failed to set user \"%s\"",
- user_name);
+ throw FormatErrno("Failed to set user \"%s\"", user_name);
}
}
@@ -133,7 +131,7 @@ daemonize_begin(bool detach)
{
/* release the current working directory */
if (chdir("/") < 0)
- FatalError("problems changing to root directory");
+ throw MakeErrno("problems changing to root directory");
if (!detach)
/* the rest of this function deals with detaching the
@@ -152,13 +150,13 @@ daemonize_begin(bool detach)
int fds[2];
if (pipe(fds) < 0)
- FatalSystemError("pipe() failed");
+ throw MakeErrno("pipe() failed");
/* move to a child process */
pid_t pid = fork();
if (pid < 0)
- FatalSystemError("fork() failed");
+ throw MakeErrno("fork() failed");
if (pid == 0) {
/* in the child process */
@@ -193,11 +191,11 @@ daemonize_begin(bool detach)
int status;
pid_t pid2 = waitpid(pid, &status, 0);
if (pid2 < 0)
- FatalSystemError("waitpid() failed");
+ throw MakeErrno("waitpid() failed");
if (WIFSIGNALED(status))
- FormatFatalError("MPD died from signal %d%s", WTERMSIG(status),
- WCOREDUMP(status) ? " (core dumped)" : "");
+ throw FormatErrno("MPD died from signal %d%s", WTERMSIG(status),
+ WCOREDUMP(status) ? " (core dumped)" : "");
exit(WEXITSTATUS(status));
}
@@ -223,7 +221,7 @@ daemonize_init(const char *user, const char *group, AllocatedPath &&_pidfile)
if (user) {
struct passwd *pwd = getpwnam(user);
if (pwd == nullptr)
- FormatFatalError("no such user \"%s\"", user);
+ throw FormatRuntimeError("no such user \"%s\"", user);
user_uid = pwd->pw_uid;
user_gid = pwd->pw_gid;
@@ -237,7 +235,8 @@ daemonize_init(const char *user, const char *group, AllocatedPath &&_pidfile)
if (group) {
struct group *grp = getgrnam(group);
if (grp == nullptr)
- FormatFatalError("no such group \"%s\"", group);
+ throw FormatRuntimeError("no such group \"%s\"",
+ group);
user_gid = grp->gr_gid;
had_group = true;
}
diff --git a/src/unix/Daemon.hxx b/src/unix/Daemon.hxx
index 2b12b17f6..bfd68fb75 100644
--- a/src/unix/Daemon.hxx
+++ b/src/unix/Daemon.hxx
@@ -48,11 +48,11 @@ daemonize_finish()
void
daemonize_kill();
#else
-#include "system/FatalError.hxx"
+#include <stdexcept>
static inline void
daemonize_kill()
{
- FatalError("--kill is not available on WIN32");
+ throw std::runtime_error("--kill is not available on WIN32");
}
#endif
diff --git a/src/unix/PidFile.hxx b/src/unix/PidFile.hxx
index 80e073c22..d6d55eb7c 100644
--- a/src/unix/PidFile.hxx
+++ b/src/unix/PidFile.hxx
@@ -22,7 +22,7 @@
#include "fs/FileSystem.hxx"
#include "fs/AllocatedPath.hxx"
-#include "Log.hxx"
+#include "system/Error.hxx"
#include <assert.h>
#include <string.h>
@@ -41,8 +41,8 @@ public:
fd = OpenFile(path, O_WRONLY|O_CREAT|O_TRUNC, 0666).Steal();
if (fd < 0) {
const std::string utf8 = path.ToUTF8();
- FormatFatalSystemError("Failed to create pid file \"%s\"",
- utf8.c_str());
+ throw FormatErrno("Failed to create pid file \"%s\"",
+ utf8.c_str());
}
}