X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fstats.c;h=6f7ce2088600feab4973bcb69b200805c19457b7;hb=4e1d941e94590b2a41996b477f2563a9c860e1e5;hp=743b795ae27916137de4b3e2a6ad79136e78c798;hpb=f1b58c3faed91ddae6755b5cc0d211cc8aa32574;p=platform%2Fupstream%2Fconnman.git diff --git a/src/stats.c b/src/stats.c old mode 100644 new mode 100755 index 743b795..6f7ce20 --- a/src/stats.c +++ b/src/stats.c @@ -2,7 +2,7 @@ * * Connection Manager * - * Copyright (C) 2010 BMW Car IT GmbH. All rights reserved. + * Copyright (C) 2010-2014 BMW Car IT GmbH. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as @@ -23,7 +23,6 @@ #include #endif -#define _GNU_SOURCE #include #include #include @@ -33,9 +32,13 @@ #include #include #include +#include #include "connman.h" +#define MODE (S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | \ + S_IXGRP | S_IROTH | S_IXOTH) + #ifdef TEMP_FAILURE_RETRY #define TFR TEMP_FAILURE_RETRY #else @@ -121,7 +124,7 @@ struct stats_iter { struct stats_record *it; }; -GHashTable *stats_hash = NULL; +static GHashTable *stats_hash = NULL; static struct stats_file_header *get_hdr(struct stats_file *file) { @@ -215,7 +218,7 @@ static void stats_free(gpointer user_data) { struct stats_file *file = user_data; - if (file == NULL) + if (!file) return; msync(file->addr, file->len, MS_SYNC); @@ -223,18 +226,14 @@ static void stats_free(gpointer user_data) munmap(file->addr, file->len); file->addr = NULL; - TFR(close(file->fd)); + close(file->fd); file->fd = -1; - if (file->history_name != NULL) { - g_free(file->history_name); - file->history_name = NULL; - } + g_free(file->history_name); + file->history_name = NULL; - if (file->name != NULL) { - g_free(file->name); - file->name = NULL; - } + g_free(file->name); + file->name = NULL; g_free(file); } @@ -291,7 +290,7 @@ static int stats_file_remap(struct stats_file *file, size_t size) return -errno; } - if (file->addr == NULL) { + if (!file->addr) { /* * Though the buffer is not shared between processes, we still * have to take MAP_SHARED because MAP_PRIVATE does not @@ -331,7 +330,7 @@ static int stats_open(struct stats_file *file, file->name = g_strdup(name); - file->fd = TFR(open(file->name, O_RDWR | O_CREAT, 0644)); + file->fd = TFR(open(file->name, O_RDWR | O_CREAT | O_CLOEXEC, 0644)); if (file->fd < 0) { connman_error("open error %s for %s", strerror(errno), file->name); @@ -345,7 +344,7 @@ static int stats_open(struct stats_file *file, static int stats_open_temp(struct stats_file *file) { - file->name = g_strdup_printf("%s/stats/stats.XXXXXX.tmp", + file->name = g_strdup_printf("%s/stats.XXXXXX.tmp", STORAGEDIR); file->fd = g_mkstemp_full(file->name, O_RDWR | O_CREAT, 0644); if (file->fd < 0) { @@ -373,7 +372,8 @@ static int stats_file_setup(struct stats_file *file) connman_error("fstat error %s for %s\n", strerror(errno), file->name); - TFR(close(file->fd)); + close(file->fd); + file->fd = -1; g_free(file->name); file->name = NULL; @@ -388,7 +388,8 @@ static int stats_file_setup(struct stats_file *file) err = stats_file_remap(file, size); if (err < 0) { - TFR(close(file->fd)); + close(file->fd); + file->fd = -1; g_free(file->name); file->name = NULL; @@ -468,18 +469,18 @@ static struct stats_record *process_file(struct stats_iter *iter, home = NULL; roaming = NULL; - if (cur == NULL) + if (!cur) cur = get_next_record(iter); next = get_next_record(iter); - while (next != NULL) { + while (next) { GDate date_cur; GDate date_next; - int append; + bool append; - append = FALSE; + append = false; - if (cur->roaming == TRUE) + if (cur->roaming) roaming = cur; else home = cur; @@ -499,24 +500,24 @@ static struct stats_record *process_file(struct stats_iter *iter, day_next = g_date_get_day(&date_next); if (day_cur == day_next && month_cur != month_next) { - append = TRUE; + append = true; } else if (day_cur < account_period_offset && day_next >= account_period_offset) { - append = TRUE; + append = true; } } else { /* day period size */ if (g_date_days_between(&date_cur, &date_next) > 0) - append = TRUE; + append = true; } - if (append == TRUE) { - if (home != NULL) { + if (append) { + if (home) { append_record(temp_file, home); home = NULL; } - if (roaming != NULL) { + if (roaming) { append_record(temp_file, roaming); roaming = NULL; } @@ -558,7 +559,7 @@ static int summarize(struct stats_file *data_file, /* Now process history file */ cur = NULL; - if (history_file != NULL) { + if (history_file) { history_iter.file = history_file; history_iter.begin = get_iterator_begin(history_iter.file); history_iter.end = get_iterator_end(history_iter.file); @@ -578,9 +579,9 @@ static int summarize(struct stats_file *data_file, * Ensure date_file records are newer than the history_file * record */ - if (cur != NULL) { + if (cur) { next = get_next_record(&data_iter); - while (next != NULL && cur->ts > next->ts) + while (next && cur->ts > next->ts) next = get_next_record(&data_iter); } @@ -589,7 +590,7 @@ static int summarize(struct stats_file *data_file, &date_change_step_size, data_file->account_period_offset); - if (cur != NULL) + if (cur) append_record(temp_file, cur); return 0; @@ -617,7 +618,7 @@ static int stats_file_close_swap(struct stats_file *history_file, stats_file_unmap(history_file); stats_file_unmap(temp_file); - TFR(close(temp_file->fd)); + close(temp_file->fd); unlink(history_file->name); @@ -625,7 +626,7 @@ static int stats_file_close_swap(struct stats_file *history_file, unlink(temp_file->name); - TFR(close(history_file->fd)); + close(history_file->fd); stats_file_cleanup(history_file); stats_file_cleanup(temp_file); @@ -645,6 +646,9 @@ static int stats_file_history_update(struct stats_file *data_file) bzero(history_file, sizeof(struct stats_file)); bzero(temp_file, sizeof(struct stats_file)); + history_file->fd = -1; + temp_file->fd = -1; + err = stats_open(history_file, data_file->history_name); if (err < 0) return err; @@ -667,26 +671,44 @@ static int stats_file_history_update(struct stats_file *data_file) int __connman_stats_service_register(struct connman_service *service) { struct stats_file *file; - char *name; + char *name, *dir; int err; DBG("service %p", service); + dir = g_strdup_printf("%s/%s", STORAGEDIR, + connman_service_get_identifier(service)); + + /* If the dir doesn't exist, create it */ + if (!g_file_test(dir, G_FILE_TEST_IS_DIR)) { + if (mkdir(dir, MODE) < 0) { + if (errno != EEXIST) { + g_free(dir); + + err = -errno; + goto err; + } + } + } + + g_free(dir); file = g_hash_table_lookup(stats_hash, service); - if (file == NULL) { + if (!file) { file = g_try_new0(struct stats_file, 1); - if (file == NULL) + if (!file) return -ENOMEM; + file->fd = -1; + g_hash_table_insert(stats_hash, service, file); } else { return -EALREADY; } - name = g_strdup_printf("%s/stats/%s.data", STORAGEDIR, - __connman_service_get_ident(service)); - file->history_name = g_strdup_printf("%s/stats/%s.history", STORAGEDIR, - __connman_service_get_ident(service)); + name = g_strdup_printf("%s/%s/data", STORAGEDIR, + connman_service_get_identifier(service)); + file->history_name = g_strdup_printf("%s/%s/history", STORAGEDIR, + connman_service_get_identifier(service)); /* TODO: Use a global config file instead of hard coded value. */ file->account_period_offset = 1; @@ -716,7 +738,7 @@ void __connman_stats_service_unregister(struct connman_service *service) } int __connman_stats_update(struct connman_service *service, - connman_bool_t roaming, + bool roaming, struct connman_stats_data *data) { struct stats_file *file; @@ -724,7 +746,7 @@ int __connman_stats_update(struct connman_service *service, int err; file = g_hash_table_lookup(stats_hash, service); - if (file == NULL) + if (!file) return -EEXIST; if (file->len < file->max_len && @@ -751,7 +773,7 @@ int __connman_stats_update(struct connman_service *service, next->roaming = roaming; memcpy(&next->data, data, sizeof(struct connman_stats_data)); - if (roaming != TRUE) + if (!roaming) set_home(file, next); else set_roaming(file, next); @@ -762,22 +784,22 @@ int __connman_stats_update(struct connman_service *service, } int __connman_stats_get(struct connman_service *service, - connman_bool_t roaming, + bool roaming, struct connman_stats_data *data) { struct stats_file *file; struct stats_record *rec; file = g_hash_table_lookup(stats_hash, service); - if (file == NULL) + if (!file) return -EEXIST; - if (roaming != TRUE) + if (!roaming) rec = file->home; else rec = file->roaming; - if (rec != NULL) { + if (rec) { memcpy(data, &rec->data, sizeof(struct connman_stats_data)); }