X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fdaemon%2Fcollectd.c;h=af8fb568bb21db3254c38bb76d1911a1cafc8a30;hb=4eca75de34e9c3d7f2391b9c7a5951a27a713804;hp=b947349ef7e639de508d9c6f1ba19286508807e1;hpb=a2ddc387687433291c36e7bc8a2f3a5ea88fd0a9;p=collectd.git diff --git a/src/daemon/collectd.c b/src/daemon/collectd.c index b947349e..af8fb568 100644 --- a/src/daemon/collectd.c +++ b/src/daemon/collectd.c @@ -92,20 +92,20 @@ static int init_hostname(void) { int status; str = global_option_get("Hostname"); - if (str != NULL) { + if ((str != NULL) && (str[0] != 0)) { sstrncpy(hostname_g, str, sizeof(hostname_g)); - return (0); + return 0; } if (gethostname(hostname_g, sizeof(hostname_g)) != 0) { fprintf(stderr, "`gethostname' failed and no " "hostname was configured.\n"); - return (-1); + return -1; } str = global_option_get("FQDNLookup"); if (IS_FALSE(str)) - return (0); + return 0; struct addrinfo ai_hints = {.ai_flags = AI_CANONNAME}; @@ -117,7 +117,7 @@ static int init_hostname(void) { "name. Please fix the network " "configuration.", hostname_g); - return (-1); + return -1; } for (struct addrinfo *ai_ptr = ai_list; ai_ptr != NULL; @@ -130,7 +130,7 @@ static int init_hostname(void) { } freeaddrinfo(ai_list); - return (0); + return 0; } /* int init_hostname */ static int init_global_variables(void) { @@ -147,18 +147,18 @@ static int init_global_variables(void) { if (timeout_g <= 1) { fprintf(stderr, "Cannot set the timeout to a correct value.\n" "Please check your settings.\n"); - return (-1); + return -1; } DEBUG("timeout_g = %i;", timeout_g); if (init_hostname() != 0) - return (-1); + return -1; DEBUG("hostname_g = %s;", hostname_g); - return (0); + return 0; } /* int init_global_variables */ -static int change_basedir(const char *orig_dir) { +static int change_basedir(const char *orig_dir, _Bool create) { char *dir; size_t dirlen; int status; @@ -167,7 +167,7 @@ static int change_basedir(const char *orig_dir) { if (dir == NULL) { char errbuf[1024]; ERROR("strdup failed: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } dirlen = strlen(dir); @@ -176,19 +176,19 @@ static int change_basedir(const char *orig_dir) { if (dirlen == 0) { free(dir); - return (-1); + return -1; } status = chdir(dir); if (status == 0) { free(dir); - return (0); - } else if (errno != ENOENT) { + return 0; + } else if (!create || (errno != ENOENT)) { char errbuf[1024]; ERROR("change_basedir: chdir (%s): %s", dir, sstrerror(errno, errbuf, sizeof(errbuf))); free(dir); - return (-1); + return -1; } status = mkdir(dir, S_IRWXU | S_IRWXG | S_IRWXO); @@ -197,7 +197,7 @@ static int change_basedir(const char *orig_dir) { ERROR("change_basedir: mkdir (%s): %s", dir, sstrerror(errno, errbuf, sizeof(errbuf))); free(dir); - return (-1); + return -1; } status = chdir(dir); @@ -206,11 +206,11 @@ static int change_basedir(const char *orig_dir) { ERROR("change_basedir: chdir (%s): %s", dir, sstrerror(errno, errbuf, sizeof(errbuf))); free(dir); - return (-1); + return -1; } free(dir); - return (0); + return 0; } /* static int change_basedir (char *dir) */ #if HAVE_LIBKSTAT @@ -250,6 +250,7 @@ __attribute__((noreturn)) static void exit_usage(int status) { #if COLLECT_DAEMON " -f Don't fork to the background.\n" #endif + " -B Don't create the BaseDir\n" " -h Display help (this message)\n" "\nBuiltin defaults:\n" " Config file " CONFIGFILE "\n" @@ -285,12 +286,12 @@ static int do_init(void) { #endif )) { ERROR("sg_init: %s", sg_str_error(sg_get_error())); - return (-1); + return -1; } if (sg_drop_privileges()) { ERROR("sg_drop_privileges: %s", sg_str_error(sg_get_error())); - return (-1); + return -1; } #endif @@ -304,7 +305,6 @@ static int do_loop(void) { wait_until = cdtime() + interval; while (loop == 0) { - struct timespec ts_wait = {0, 0}; cdtime_t now; #if HAVE_LIBKSTAT @@ -323,19 +323,19 @@ static int do_loop(void) { continue; } - CDTIME_T_TO_TIMESPEC(wait_until - now, &ts_wait); + struct timespec ts_wait = CDTIME_T_TO_TIMESPEC(wait_until - now); wait_until = wait_until + interval; while ((loop == 0) && (nanosleep(&ts_wait, &ts_wait) != 0)) { if (errno != EINTR) { char errbuf[1024]; ERROR("nanosleep failed: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (-1); + return -1; } } } /* while (loop == 0) */ - return (0); + return 0; } /* int do_loop */ static int do_shutdown(void) { @@ -350,13 +350,13 @@ static int pidfile_create(void) { if ((fh = fopen(file, "w")) == NULL) { char errbuf[1024]; ERROR("fopen (%s): %s", file, sstrerror(errno, errbuf, sizeof(errbuf))); - return (1); + return 1; } fprintf(fh, "%i\n", (int)getpid()); fclose(fh); - return (0); + return 0; } /* static int pidfile_create (const char *file) */ static int pidfile_remove(void) { @@ -364,7 +364,7 @@ static int pidfile_remove(void) { if (file == NULL) return 0; - return (unlink(file)); + return unlink(file); } /* static int pidfile_remove (const char *file) */ #endif /* COLLECT_DAEMON */ @@ -460,6 +460,7 @@ int main(int argc, char **argv) { int test_config = 0; int test_readall = 0; const char *basedir; + _Bool opt_create_basedir = 1; #if COLLECT_DAEMON pid_t pid; int daemonize = 1; @@ -470,7 +471,7 @@ int main(int argc, char **argv) { while (1) { int c; - c = getopt(argc, argv, "htTC:" + c = getopt(argc, argv, "BhtTC:" #if COLLECT_DAEMON "fP:" #endif @@ -480,6 +481,9 @@ int main(int argc, char **argv) { break; switch (c) { + case 'B': + opt_create_basedir = 0; + break; case 'C': configfile = optarg; break; @@ -523,7 +527,7 @@ int main(int argc, char **argv) { if (cf_read(configfile)) { fprintf(stderr, "Error: Reading the config file failed!\n" "Read the logs for details.\n"); - return (1); + return 1; } /* @@ -533,10 +537,10 @@ int main(int argc, char **argv) { if ((basedir = global_option_get("BaseDir")) == NULL) { fprintf(stderr, "Don't have a basedir to use. This should not happen. Ever."); - return (1); - } else if (change_basedir(basedir)) { + return 1; + } else if (change_basedir(basedir, opt_create_basedir)) { fprintf(stderr, "Error: Unable to change to directory `%s'.\n", basedir); - return (1); + return 1; } /* @@ -546,10 +550,10 @@ int main(int argc, char **argv) { * something wrong. */ if (init_global_variables() != 0) - return (1); + exit(EXIT_FAILURE); if (test_config) - return (0); + return 0; #if COLLECT_DAEMON /* @@ -574,11 +578,11 @@ int main(int argc, char **argv) { /* error */ char errbuf[1024]; fprintf(stderr, "fork: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (1); + return 1; } else if (pid != 0) { /* parent */ /* printf ("Running (PID %i)\n", pid); */ - return (0); + return 0; } /* Detach from session */ @@ -597,21 +601,21 @@ int main(int argc, char **argv) { if (status != 0) { ERROR("Error: Could not connect `STDIN' to `/dev/null' (status %d)", status); - return (1); + return 1; } status = dup(0); if (status != 1) { ERROR("Error: Could not connect `STDOUT' to `/dev/null' (status %d)", status); - return (1); + return 1; } status = dup(0); if (status != 2) { ERROR("Error: Could not connect `STDERR' to `/dev/null', (status %d)", status); - return (1); + return 1; } } /* if (daemonize) */ #endif /* COLLECT_DAEMON */ @@ -629,7 +633,7 @@ int main(int argc, char **argv) { char errbuf[1024]; ERROR("Error: Failed to install a signal handler for signal INT: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (1); + return 1; } struct sigaction sig_term_action = {.sa_handler = sig_term_handler}; @@ -638,7 +642,7 @@ int main(int argc, char **argv) { char errbuf[1024]; ERROR("Error: Failed to install a signal handler for signal TERM: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (1); + return 1; } struct sigaction sig_usr1_action = {.sa_handler = sig_usr1_handler}; @@ -647,7 +651,7 @@ int main(int argc, char **argv) { char errbuf[1024]; ERROR("Error: Failed to install a signal handler for signal USR1: %s", sstrerror(errno, errbuf, sizeof(errbuf))); - return (1); + return 1; } /* @@ -681,5 +685,5 @@ int main(int argc, char **argv) { pidfile_remove(); #endif /* COLLECT_DAEMON */ - return (exit_status); + return exit_status; } /* int main */