X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Funixsock.c;h=45ed9c699b783fa9e9e10a4dfd482a594e59d1a4;hb=4fb5d4b471e3f6a24d7cd36272e48e57bcb2c68f;hp=ddb3a52fb344d0a80829d84b6647a16592defb96;hpb=6e779261c08a8996ed476d23638fc62ad867fa5f;p=collectd.git diff --git a/src/unixsock.c b/src/unixsock.c index ddb3a52f..45ed9c69 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 @@ -23,12 +23,15 @@ #include "common.h" #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 @@ -80,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 @@ -187,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); @@ -274,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); @@ -352,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) { @@ -541,7 +547,7 @@ static int us_handle_listval (FILE *fh, char **fields, int fields_num) static void *us_handle_client (void *arg) { int fd; - FILE *fh; + FILE *fhin, *fhout; char buffer[1024]; char *fields[128]; int fields_num; @@ -552,8 +558,8 @@ static void *us_handle_client (void *arg) DEBUG ("Reading from fd #%i", fd); - fh = fdopen (fd, "r+"); - if (fh == NULL) + fhin = fdopen (fd, "r"); + if (fhin == NULL) { char errbuf[1024]; ERROR ("unixsock plugin: fdopen failed: %s", @@ -562,7 +568,17 @@ static void *us_handle_client (void *arg) pthread_exit ((void *) 1); } - while (fgets (buffer, sizeof (buffer), fh) != NULL) + fhout = fdopen (fd, "w"); + if (fhout == NULL) + { + char errbuf[1024]; + ERROR ("unixsock plugin: fdopen failed: %s", + sstrerror (errno, errbuf, sizeof (errbuf))); + fclose (fhin); /* this closes fd as well */ + pthread_exit ((void *) 1); + } + + while (fgets (buffer, sizeof (buffer), fhin) != NULL) { int len; @@ -587,27 +603,33 @@ static void *us_handle_client (void *arg) if (strcasecmp (fields[0], "getval") == 0) { - us_handle_getval (fh, fields, fields_num); + us_handle_getval (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "putval") == 0) { - handle_putval (fh, fields, fields_num); + handle_putval (fhout, fields, fields_num); } else if (strcasecmp (fields[0], "listval") == 0) { - us_handle_listval (fh, fields, fields_num); + us_handle_listval (fhout, fields, fields_num); + } + else if (strcasecmp (fields[0], "putnotif") == 0) + { + handle_putnotif (fhout, fields, fields_num); } else { - fprintf (fh, "-1 Unknown command: %s\n", fields[0]); - fflush (fh); + fprintf (fhout, "-1 Unknown command: %s\n", fields[0]); + fflush (fhout); } } /* while (fgets) */ DEBUG ("Exiting.."); - close (fd); + fclose (fhin); + fclose (fhout); pthread_exit ((void *) 0); + return ((void *) 0); } /* void *us_handle_client */ static void *us_server_thread (void *arg) @@ -622,7 +644,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) { @@ -737,7 +759,6 @@ static int us_shutdown (void) } plugin_unregister_init ("unixsock"); - plugin_unregister_write ("unixsock"); plugin_unregister_shutdown ("unixsock"); return (0);