X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=63c3ae958d2e5aece8e857f738ad474196961b00;hb=1297a3723f6c5a79e8148e56c249a1aa7d3c6f35;hp=82c15a82693056ebf32b503db8855eaaaa8c0dc6;hpb=785feb9d2544aff7f561fbda30aa762eec9e07bc;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index 82c15a82..63c3ae95 100644 --- a/src/unixsock.c +++ b/src/unixsock.c @@ -1,6 +1,6 @@ /** * collectd - src/unixsock.c - * Copyright (C) 2007 Florian octo Forster + * Copyright (C) 2007,2008 Florian octo Forster * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -24,10 +24,14 @@ #include "plugin.h" #include "configfile.h" +#include "utils_cmd_putval.h" +#include "utils_cmd_putnotif.h" + /* Folks without pthread will need to disable this plugin. */ #include #include +#include #include #include @@ -79,7 +83,7 @@ static pthread_t listen_thread = (pthread_t) 0; /* Linked list and auxilliary variables for saving values */ static value_cache_t *cache_head = NULL; static pthread_mutex_t cache_lock = PTHREAD_MUTEX_INITIALIZER; -static unsigned int cache_oldest = UINT_MAX; +static time_t cache_oldest = -1; /* * Functions @@ -186,7 +190,7 @@ static int cache_insert (const data_set_t *ds, const value_list_t *vl) cache_head = vc; vc->time = vl->time; - if (vc->time < cache_oldest) + if ((vc->time < cache_oldest) || (-1 == cache_oldest)) cache_oldest = vc->time; pthread_mutex_unlock (&cache_lock); @@ -273,7 +277,7 @@ static int cache_update (const data_set_t *ds, const value_list_t *vl) vc->ds = ds; vc->time = vl->time; - if (vc->time < cache_oldest) + if ((vc->time < cache_oldest) || (-1 == cache_oldest)) cache_oldest = vc->time; pthread_mutex_unlock (&cache_lock); @@ -351,18 +355,21 @@ static int us_open_socket (void) sizeof (sa.sun_path) - 1); /* unlink (sa.sun_path); */ + DEBUG ("unixsock plugin: socket path = %s", sa.sun_path); + status = bind (sock_fd, (struct sockaddr *) &sa, sizeof (sa)); if (status != 0) { char errbuf[1024]; sstrerror (errno, errbuf, sizeof (errbuf)); - DEBUG ("bind failed: %s; sa.sun_path = %s", errbuf, sa.sun_path); ERROR ("unixsock plugin: bind failed: %s", errbuf); close (sock_fd); sock_fd = -1; return (-1); } + chmod (sa.sun_path, sock_perms); + status = listen (sock_fd, 8); if (status != 0) { @@ -487,149 +494,6 @@ static int us_handle_getval (FILE *fh, char **fields, int fields_num) return (0); } /* int us_handle_getval */ -static int us_handle_putval (FILE *fh, char **fields, int fields_num) -{ - char *hostname; - char *plugin; - char *plugin_instance; - char *type; - char *type_instance; - int status; - int i; - - const data_set_t *ds; - value_list_t vl = VALUE_LIST_INIT; - - char **value_ptr; - - if (fields_num != 3) - { - DEBUG ("unixsock plugin: Wrong number of fields: %i", fields_num); - fprintf (fh, "-1 Wrong number of fields: Got %i, expected 3.\n", - fields_num); - fflush (fh); - return (-1); - } - - status = parse_identifier (fields[1], &hostname, - &plugin, &plugin_instance, - &type, &type_instance); - if (status != 0) - { - DEBUG ("unixsock plugin: Cannot parse `%s'", fields[1]); - fprintf (fh, "-1 Cannot parse identifier.\n"); - fflush (fh); - return (-1); - } - - if ((strlen (hostname) >= sizeof (vl.host)) - || (strlen (plugin) >= sizeof (vl.plugin)) - || ((plugin_instance != NULL) - && (strlen (plugin_instance) >= sizeof (vl.plugin_instance))) - || ((type_instance != NULL) - && (strlen (type_instance) >= sizeof (vl.type_instance)))) - { - fprintf (fh, "-1 Identifier too long."); - return (-1); - } - - strcpy (vl.host, hostname); - strcpy (vl.plugin, plugin); - if (plugin_instance != NULL) - strcpy (vl.plugin_instance, plugin_instance); - if (type_instance != NULL) - strcpy (vl.type_instance, type_instance); - - { /* parse the time */ - char *t = fields[2]; - char *v = strchr (t, ':'); - if (v == NULL) - { - fprintf (fh, "-1 No time found."); - return (-1); - } - *v = '\0'; v++; - - vl.time = (time_t) atoi (t); - if (vl.time == 0) - vl.time = time (NULL); - - fields[2] = v; - } - - ds = plugin_get_ds (type); - if (ds == NULL) - return (-1); - - value_ptr = (char **) calloc (ds->ds_num, sizeof (char *)); - if (value_ptr == NULL) - { - fprintf (fh, "-1 calloc failed."); - return (-1); - } - - { /* parse the value-list. It's colon-separated. */ - char *dummy; - char *ptr; - char *saveptr; - - i = 0; - dummy = fields[2]; - saveptr = NULL; - while ((ptr = strtok_r (dummy, ":", &saveptr)) != NULL) - { - dummy = NULL; - if (i >= ds->ds_num) - { - i = ds->ds_num + 1; - break; - } - value_ptr[i] = ptr; - i++; - } - - if (i != ds->ds_num) - { - sfree (value_ptr); - fprintf (fh, "-1 Number of values incorrect: Got %i, " - "expected %i.", i, ds->ds_num); - return (-1); - } - } /* done parsing the value-list */ - - vl.values_len = ds->ds_num; - vl.values = (value_t *) malloc (vl.values_len * sizeof (value_t)); - if (vl.values == NULL) - { - sfree (value_ptr); - fprintf (fh, "-1 malloc failed."); - return (-1); - } - DEBUG ("value_ptr = 0x%p; vl.values = 0x%p;", (void *) value_ptr, (void *) vl.values); - - for (i = 0; i < ds->ds_num; i++) - { - if (strcmp (value_ptr[i], "U") == 0) - vl.values[i].gauge = NAN; - else if (ds->ds[i].type == DS_TYPE_COUNTER) - vl.values[i].counter = atoll (value_ptr[i]); - else if (ds->ds[i].type == DS_TYPE_GAUGE) - vl.values[i].gauge = atof (value_ptr[i]); - } /* for (i = 2 .. fields_num) */ - - plugin_dispatch_values (type, &vl); - - DEBUG ("value_ptr = 0x%p; vl.values = 0x%p;", (void *) value_ptr, (void *) vl.values); - - sfree (value_ptr); - sfree (vl.values); - - fprintf (fh, "0 Success\n"); - fflush (fh); - - return (0); -} /* int us_handle_putval */ - static int us_handle_listval (FILE *fh, char **fields, int fields_num) { char buffer[1024]; @@ -733,12 +597,16 @@ static void *us_handle_client (void *arg) } else if (strcasecmp (fields[0], "putval") == 0) { - us_handle_putval (fh, fields, fields_num); + handle_putval (fh, fields, fields_num); } else if (strcasecmp (fields[0], "listval") == 0) { us_handle_listval (fh, fields, fields_num); } + else if (strcasecmp (fields[0], "putnotif") == 0) + { + handle_putnotif (fh, fields, fields_num); + } else { fprintf (fh, "-1 Unknown command: %s\n", fields[0]); @@ -764,7 +632,7 @@ static void *us_server_thread (void *arg) while (loop != 0) { - DEBUG ("Calling accept.."); + DEBUG ("unixsock plugin: Calling accept.."); status = accept (sock_fd, NULL, NULL); if (status < 0) {