/*
- * Copyright (C) 2010-2012 jeanfi@gmail.com
+ * Copyright (C) 2010-2013 jeanfi@gmail.com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
+#define _LARGEFILE_SOURCE 1
+#include "config.h"
+
#include <locale.h>
#include <libintl.h>
#define _(str) gettext(str)
-#include "config.h"
-
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
{"debug", required_argument, 0, 'd'},
{"log-file", required_argument, 0, 'l'},
{"sensor-log-file", required_argument, 0, 0},
+ {"sensor-log-interval", required_argument, 0, 0},
{0, 0, 0, 0}
};
static int server_stop_requested;
-void print_version()
+static void print_version()
{
printf("psensor-server %s\n", VERSION);
printf(_("Copyright (C) %s jeanfi@gmail.com\n"
"2010-2012");
}
-void print_help()
+static void print_help()
{
printf(_("Usage: %s [OPTION]...\n"), program_name);
"set the debug level, integer between 0 and 3"));
puts(_(" -l, --log-file=PATH set the log file to PATH"));
puts(_(" --sensor-log-file=PATH set the sensor log file to PATH"));
+ puts(_(" --sensor-log-interval=S "
+ "set the sensor log interval to S (seconds)"));
puts("");
printf(_("Report bugs to: %s\n"), PACKAGE_BUGREPORT);
}
/*
- Returns the file path corresponding to a given URL
-*/
-char *get_path(const char *url, const char *www_dir)
+ * Returns the file path corresponding to a given URL
+ */
+static char *get_path(const char *url, const char *www_dir)
{
const char *p;
char *res;
{
FILE *file = cls;
- fseek(file, pos, SEEK_SET);
+ fseeko(file, pos, SEEK_SET);
return fread(buf, 1, max, file);
}
-struct MHD_Response *
-create_response_api(const char *nurl,
- const char *method,
- unsigned int *rp_code)
+static struct MHD_Response *
+create_response_api(const char *nurl, const char *method, unsigned int *rp_code)
{
struct MHD_Response *resp;
struct psensor *s;
char *page = NULL;
- if (!strcmp(nurl, URL_BASE_API_1_0_SENSORS)) {
+ if (!strcmp(nurl, URL_BASE_API_1_1_SENSORS)) {
page = sensors_to_json_string(server_data.sensors);
#ifdef HAVE_GTOP
- } else if (!strcmp(nurl, URL_API_1_0_SYSINFO)) {
+ } else if (!strcmp(nurl, URL_API_1_1_SYSINFO)) {
page = sysinfo_to_json_string(&server_data.psysinfo);
- } else if (!strcmp(nurl, URL_API_1_0_CPU_USAGE)) {
+ } else if (!strcmp(nurl, URL_API_1_1_CPU_USAGE)) {
page = sensor_to_json_string(server_data.cpu_usage);
#endif
- } else if (!strncmp(nurl, URL_BASE_API_1_0_SENSORS,
- strlen(URL_BASE_API_1_0_SENSORS))
- && nurl[strlen(URL_BASE_API_1_0_SENSORS)] == '/') {
+ } else if (!strncmp(nurl, URL_BASE_API_1_1_SENSORS,
+ strlen(URL_BASE_API_1_1_SENSORS))
+ && nurl[strlen(URL_BASE_API_1_1_SENSORS)] == '/') {
- const char *sid = nurl + strlen(URL_BASE_API_1_0_SENSORS) + 1;
+ const char *sid = nurl + strlen(URL_BASE_API_1_1_SENSORS) + 1;
s = psensor_list_get_by_id(server_data.sensors, sid);
if (s)
page = sensor_to_json_string(s);
- } else if (!strcmp(nurl, URL_API_1_0_SERVER_STOP)) {
+ } else if (!strcmp(nurl, URL_API_1_1_SERVER_STOP)) {
server_stop_requested = 1;
page = strdup(HTML_STOP_REQUESTED);
return NULL;
}
-struct MHD_Response *
-create_response_file(const char *nurl,
- const char *method,
- unsigned int *rp_code,
- const char *fpath)
+static struct MHD_Response *create_response_file(const char *nurl,
+ const char *method,
+ unsigned int *rp_code,
+ const char *fpath)
{
struct stat st;
int ret;
return NULL;
}
-struct MHD_Response *
+static struct MHD_Response *
create_response(const char *nurl, const char *method, unsigned int *rp_code)
{
struct MHD_Response *resp = NULL;
- if (!strncmp(nurl, URL_BASE_API_1_0, strlen(URL_BASE_API_1_0))) {
+ if (!strncmp(nurl, URL_BASE_API_1_1, strlen(URL_BASE_API_1_1))) {
resp = create_response_api(nurl, method, rp_code);
} else {
char *fpath = get_path(nurl, server_data.www_dir);
}
}
-static int
-cbk_http_request(void *cls,
- struct MHD_Connection *connection,
- const char *url,
- const char *method,
- const char *version,
- const char *upload_data,
- size_t *upload_data_size, void **ptr)
+static int cbk_http_request(void *cls,
+ struct MHD_Connection *connection,
+ const char *url,
+ const char *method,
+ const char *version,
+ const char *upload_data,
+ size_t *upload_data_size, void **ptr)
{
static int dummy;
struct MHD_Response *response;
int main(int argc, char *argv[])
{
struct MHD_Daemon *d;
- int port, opti, optc, cmdok;
+ int port, opti, optc, cmdok, ret, slog_interval;
char *log_file, *slog_file;
program_name = argv[0];
#endif
server_data.www_dir = NULL;
+#ifdef HAVE_GTOP
server_data.psysinfo.interfaces = NULL;
+#endif
log_file = NULL;
slog_file = NULL;
+ slog_interval = 300;
port = DEFAULT_PORT;
cmdok = 1;
case 0:
if (!strcmp(long_options[opti].name, "sensor-log-file"))
slog_file = strdup(optarg);
+ else if (!strcmp(long_options[opti].name,
+ "sensor-log-interval"))
+ slog_interval = atoi(optarg);
break;
default:
cmdok = 0;
log_info(_("WWW directory: %s"), server_data.www_dir);
log_info(_("URL: http://localhost:%d"), port);
- if (slog_file)
- slog_init(slog_file, server_data.sensors);
+ if (slog_file) {
+ if (slog_interval <= 0)
+ slog_interval = 300;
+ ret = slog_activate(slog_file,
+ server_data.sensors,
+ &mutex,
+ slog_interval);
+ if (!ret)
+ log_err(_("Failed to activate logging of sensors."));
+ }
while (!server_stop_requested) {
pthread_mutex_lock(&mutex);
psensor_log_measures(server_data.sensors);
- slog_write_sensors(server_data.sensors);
-
pthread_mutex_unlock(&mutex);
sleep(5);
}