X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Frrd_daemon.c;h=22093205ba099b49bb1d98172c2fb84baffc2355;hb=c6824ca3f64bd2945fa4b6a772ae5322949d399f;hp=248095899b4c4ea2f36b0af562eb1cee07e7b5d4;hpb=7953cece011b214be4a2663beaa46149c8c58eee;p=rrdtool.git diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c index 2480958..2209320 100644 --- a/src/rrd_daemon.c +++ b/src/rrd_daemon.c @@ -73,6 +73,7 @@ #include "rrd.h" #include "rrd_client.h" +#include "unused.h" #include @@ -113,15 +114,12 @@ #define RRDD_LOG(severity, ...) \ do { \ - if (stay_foreground) \ + if (stay_foreground) { \ fprintf(stderr, __VA_ARGS__); \ + fprintf(stderr, "\n"); } \ syslog ((severity), __VA_ARGS__); \ } while (0) -#ifndef __GNUC__ -# define __attribute__(x) /**/ -#endif - /* * Types */ @@ -155,12 +153,12 @@ typedef struct listen_socket_s listen_socket_t; struct command_s; typedef struct command_s command_t; /* note: guard against "unused" warnings in the handlers */ -#define DISPATCH_PROTO listen_socket_t *sock __attribute__((unused)),\ - time_t now __attribute__((unused)),\ - char *buffer __attribute__((unused)),\ - size_t buffer_size __attribute__((unused)) +#define DISPATCH_PROTO listen_socket_t UNUSED(*sock),\ + time_t UNUSED(now),\ + char UNUSED(*buffer),\ + size_t UNUSED(buffer_size) -#define HANDLER_PROTO command_t *cmd __attribute__((unused)),\ +#define HANDLER_PROTO command_t UNUSED(*cmd),\ DISPATCH_PROTO struct command_s { @@ -230,6 +228,8 @@ static uid_t daemon_uid; static listen_socket_t *listen_fds = NULL; static size_t listen_fds_num = 0; +static listen_socket_t default_socket; + enum { RUNNING, /* normal operation */ FLUSHING, /* flushing remaining values */ @@ -303,23 +303,23 @@ static void sig_common (const char *sig) /* {{{ */ pthread_cond_broadcast(&queue_cond); } /* }}} void sig_common */ -static void sig_int_handler (int s __attribute__((unused))) /* {{{ */ +static void sig_int_handler (int UNUSED(s)) /* {{{ */ { sig_common("INT"); } /* }}} void sig_int_handler */ -static void sig_term_handler (int s __attribute__((unused))) /* {{{ */ +static void sig_term_handler (int UNUSED(s)) /* {{{ */ { sig_common("TERM"); } /* }}} void sig_term_handler */ -static void sig_usr1_handler (int s __attribute__((unused))) /* {{{ */ +static void sig_usr1_handler (int UNUSED(s)) /* {{{ */ { config_flush_at_shutdown = 1; sig_common("USR1"); } /* }}} void sig_usr1_handler */ -static void sig_usr2_handler (int s __attribute__((unused))) /* {{{ */ +static void sig_usr2_handler (int UNUSED(s)) /* {{{ */ { config_flush_at_shutdown = 0; sig_common("USR2"); @@ -844,7 +844,7 @@ static int flush_old_values (int max_age) return (0); } /* int flush_old_values */ -static void *flush_thread_main (void *args __attribute__((unused))) /* {{{ */ +static void *flush_thread_main (void UNUSED(*args)) /* {{{ */ { struct timeval now; struct timespec next_flush; @@ -897,7 +897,7 @@ static void *flush_thread_main (void *args __attribute__((unused))) /* {{{ */ return NULL; } /* void *flush_thread_main */ -static void *queue_thread_main (void *args __attribute__((unused))) /* {{{ */ +static void *queue_thread_main (void UNUSED(*args)) /* {{{ */ { pthread_mutex_lock (&cache_lock); @@ -1479,13 +1479,11 @@ static int handle_request_update (HANDLER_PROTO) /* {{{ */ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */ { - char *file; + char *file, file_tmp[PATH_MAX]; char *cf; char *start_str; char *end_str; - rrd_time_value_t start_tv; - rrd_time_value_t end_tv; time_t start_tm; time_t end_tm; @@ -1535,43 +1533,63 @@ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */ if (status != 0) return (syntax_error(sock,cmd)); + get_abs_path(&file, file_tmp); + if (!check_file_access(file, sock)) return 0; + status = flush_file (file); if ((status != 0) && (status != ENOENT)) return (send_response (sock, RESP_ERR, "flush_file (%s) failed with status %i.\n", file, status)); + t = time (NULL); /* "now" */ + /* Parse start time */ if (start_str != NULL) { - const char *errmsg; + char *endptr; + long value; - errmsg = rrd_parsetime (start_str, &start_tv); - if (errmsg != NULL) + endptr = NULL; + errno = 0; + value = strtol (start_str, &endptr, /* base = */ 0); + if ((endptr == start_str) || (errno != 0)) return (send_response(sock, RESP_ERR, - "Cannot parse start time `%s': %s\n", start_str, errmsg)); + "Cannot parse start time `%s': Only simple integers are allowed.\n", + start_str)); + + if (value > 0) + start_tm = (time_t) value; + else + start_tm = (time_t) (t + value); } else - rrd_parsetime ("-86400", &start_tv); + { + start_tm = t - 86400; + } /* Parse end time */ if (end_str != NULL) { - const char *errmsg; + char *endptr; + long value; - errmsg = rrd_parsetime (end_str, &end_tv); - if (errmsg != NULL) + endptr = NULL; + errno = 0; + value = strtol (end_str, &endptr, /* base = */ 0); + if ((endptr == end_str) || (errno != 0)) return (send_response(sock, RESP_ERR, - "Cannot parse end time `%s': %s\n", end_str, errmsg)); + "Cannot parse end time `%s': Only simple integers are allowed.\n", + end_str)); + + if (value > 0) + end_tm = (time_t) value; + else + end_tm = (time_t) (t + value); } else - rrd_parsetime ("now", &end_tv); - - start_tm = 0; - end_tm = 0; - status = rrd_proc_start_end (&start_tv, &end_tv, &start_tm, &end_tm); - if (status != 0) - return (send_response(sock, RESP_ERR, - "rrd_proc_start_end failed: %s\n", rrd_get_error ())); + { + end_tm = t; + } step = -1; ds_cnt = 0; @@ -1616,7 +1634,9 @@ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */ if (i > 0) SSTRCAT (linebuf, " ", linebuf_fill); SSTRCAT (linebuf, ds_namv[i], linebuf_fill); + rrd_freemem(ds_namv[i]); } + rrd_freemem(ds_namv); add_response_info (sock, "DSName: %s\n", linebuf); } @@ -1642,6 +1662,7 @@ static int handle_request_fetch (HANDLER_PROTO) /* {{{ */ add_response_info (sock, "%10lu:%s\n", (unsigned long) t, linebuf); } /* for (t) */ + rrd_freemem(data); return (send_response (sock, RESP_OK, "Success\n")); #undef SSTRCAT @@ -1903,6 +1924,17 @@ static int socket_permission_add (listen_socket_t *sock, /* {{{ */ return (0); } /* }}} int socket_permission_add */ +static void socket_permission_clear (listen_socket_t *sock) /* {{{ */ +{ + sock->permissions = 0; +} /* }}} socket_permission_clear */ + +static void socket_permission_copy (listen_socket_t *dest, /* {{{ */ + listen_socket_t *src) +{ + dest->permissions = src->permissions; +} /* }}} socket_permission_copy */ + /* check whether commands are received in the expected context */ static int command_check_context(listen_socket_t *sock, command_t *cmd) { @@ -2296,6 +2328,10 @@ static void journal_init(void) /* {{{ */ } dir = opendir(journal_dir); + if (!dir) { + RRDD_LOG(LOG_CRIT, "journal_init: opendir(%s) failed\n", journal_dir); + return; + } while ((dent = readdir(dir)) != NULL) { /* looks like a journal file? */ @@ -2707,7 +2743,7 @@ static int close_listen_sockets (void) /* {{{ */ return (0); } /* }}} int close_listen_sockets */ -static void *listen_thread_main (void *args __attribute__((unused))) /* {{{ */ +static void *listen_thread_main (void UNUSED(*args)) /* {{{ */ { struct pollfd *pollfds; int pollfds_num; @@ -2844,10 +2880,10 @@ static int daemonize (void) /* {{{ */ } else { - listen_socket_t sock; - memset(&sock, 0, sizeof(sock)); - strncpy(sock.addr, RRDCACHED_DEFAULT_ADDRESS, sizeof(sock.addr)-1); - open_listen_socket (&sock); + strncpy(default_socket.addr, RRDCACHED_DEFAULT_ADDRESS, + sizeof(default_socket.addr) - 1); + default_socket.addr[sizeof(default_socket.addr) - 1] = '\0'; + open_listen_socket (&default_socket); } if (listen_fds_num < 1) @@ -2952,11 +2988,10 @@ static int read_options (int argc, char **argv) /* {{{ */ int option; int status = 0; - char **permissions = NULL; - size_t permissions_len = 0; + socket_permission_clear (&default_socket); - gid_t socket_group = (gid_t)-1; - mode_t socket_permissions = (mode_t)-1; + default_socket.socket_group = (gid_t)-1; + default_socket.socket_permissions = (mode_t)-1; while ((option = getopt(argc, argv, "gl:s:m:P:f:w:z:t:Bb:p:Fj:a:h?")) != -1) { @@ -2981,22 +3016,11 @@ static int read_options (int argc, char **argv) /* {{{ */ strncpy(new->addr, optarg, sizeof(new->addr)-1); /* Add permissions to the socket {{{ */ - if (permissions_len != 0) + if (default_socket.permissions != 0) { - size_t i; - for (i = 0; i < permissions_len; i++) - { - status = socket_permission_add (new, permissions[i]); - if (status != 0) - { - fprintf (stderr, "read_options: Adding permission \"%s\" to " - "socket failed. Most likely, this permission doesn't " - "exist. Check your command line.\n", permissions[i]); - status = 4; - } - } + socket_permission_copy (new, &default_socket); } - else /* if (permissions_len == 0) */ + else /* if (default_socket.permissions == 0) */ { /* Add permission for ALL commands to the socket. */ size_t i; @@ -3007,15 +3031,15 @@ static int read_options (int argc, char **argv) /* {{{ */ { fprintf (stderr, "read_options: Adding permission \"%s\" to " "socket failed. This should never happen, ever! Sorry.\n", - permissions[i]); + list_of_commands[i].cmd); status = 4; } } } /* }}} Done adding permissions. */ - new->socket_group = socket_group; - new->socket_permissions = socket_permissions; + new->socket_group = default_socket.socket_group; + new->socket_permissions = default_socket.socket_permissions; if (!rrd_add_ptr((void ***)&config_listen_address_list, &config_listen_address_list_len, new)) @@ -3045,7 +3069,7 @@ static int read_options (int argc, char **argv) /* {{{ */ if (grp) { - socket_group = grp->gr_gid; + default_socket.socket_group = grp->gr_gid; } else { @@ -3070,7 +3094,7 @@ static int read_options (int argc, char **argv) /* {{{ */ return (5); } - socket_permissions = (mode_t)tmp; + default_socket.socket_permissions = (mode_t)tmp; } break; @@ -3081,7 +3105,7 @@ static int read_options (int argc, char **argv) /* {{{ */ char *dummy; char *ptr; - rrd_free_ptrs ((void *) &permissions, &permissions_len); + socket_permission_clear (&default_socket); optcopy = strdup (optarg); dummy = optcopy; @@ -3089,7 +3113,14 @@ static int read_options (int argc, char **argv) /* {{{ */ while ((ptr = strtok_r (dummy, ", ", &saveptr)) != NULL) { dummy = NULL; - rrd_add_strdup ((void *) &permissions, &permissions_len, ptr); + status = socket_permission_add (&default_socket, ptr); + if (status != 0) + { + fprintf (stderr, "read_options: Adding permission \"%s\" to " + "socket failed. Most likely, this permission doesn't " + "exist. Check your command line.\n", ptr); + status = 4; + } } free (optcopy); @@ -3247,7 +3278,9 @@ static int read_options (int argc, char **argv) /* {{{ */ case 'j': { - const char *dir = journal_dir = strdup(optarg); + char journal_dir_actual[PATH_MAX]; + const char *dir; + dir = journal_dir = strdup(realpath((const char *)optarg, journal_dir_actual)); status = rrd_mkdir_p(dir, 0777); if (status != 0) @@ -3334,8 +3367,6 @@ static int read_options (int argc, char **argv) /* {{{ */ if (journal_dir == NULL) config_flush_at_shutdown = 1; - rrd_free_ptrs ((void *) &permissions, &permissions_len); - return (status); } /* }}} int read_options */