-
-#ifdef SERVER
-#ifdef _WIN32
-void daemonize()
-{
- errorstream << "daemonize not implemented on windows" << std::endl;
-}
-#else // assume posix like os
-
-static std::string get_pidfile_path()
-{
- // make it static to make sure it won't change after first call to this fct
- static std::string path_pidfile = "";
- static bool initialized = false;
-
- if (initialized)
- {
- return path_pidfile;
- }
-
- g_settings->getNoEx("pidfile", path_pidfile);
-
- if (path_pidfile == "") {
-#ifdef RUN_IN_PLACE
- path_pidfile = "pidfile.pid";
-#else
- path_pidfile = "/var/run/minetest.pid";
-#endif
- }
- initialized = true;
- return path_pidfile;
-}
-
-
-void daemonize()
-{
- std::string path_pidfile = get_pidfile_path();
-
- FILE* pidfile = fopen(path_pidfile.c_str(),"r");
-
- if (pidfile) {
- int pid = 0;
- if (fscanf(pidfile, "%i", &pid) == 1) {
- if (kill(pid, 0) == 0) {
- errorstream <<
- "Minetestserver is already running with pid: "
- << pid << std::endl;
- exit(-1);
- }
- } else {
- errorstream << "Pidfile \"" << path_pidfile << "\" "
- "already exists but content is invalid" << std::endl <<
- "Delete it manually if you're sure minetest isn't running!"
- << std::endl;
- exit(-1);
- }
- fclose(pidfile);
- pidfile = 0;
- }
-
- pid_t pid = fork();
-
- if (pid > 0) {
- pidfile = fopen(path_pidfile.c_str(),"w+");
- if (pidfile) {
- fprintf(pidfile,"%i",pid);
- fclose(pidfile);
- } else {
- errorstream << "Failed to create pidfile: \"" << path_pidfile
- << "\""<< std::endl;
- }
- exit (0);
- } else if (pid == 0) {
- fclose(stdout);
- fclose(stderr);
- return;
- }
-
- errorstream << "Failed to daemonize minetest, exiting" << std::endl;
- exit(-1);
-}
-
-void cleanup_pid()
-{
- unlink(get_pidfile_path().c_str());
-}
-#endif