diff options
author | Jinkun Jang <jinkun.jang@samsung.com> | 2013-03-16 21:00:43 +0900 |
---|---|---|
committer | Jinkun Jang <jinkun.jang@samsung.com> | 2013-03-16 21:00:43 +0900 |
commit | 88c80d0a587b534ebea25022f0df578123d53a3b (patch) | |
tree | 06d5dde002e68d348c0eedf398fc1f88715ed18a /src/critical_log.c | |
parent | e5e3eb94d3bd0736a12b96b0f55f654a4c1502b2 (diff) | |
download | data-provider-master-88c80d0a587b534ebea25022f0df578123d53a3b.tar.gz data-provider-master-88c80d0a587b534ebea25022f0df578123d53a3b.tar.bz2 data-provider-master-88c80d0a587b534ebea25022f0df578123d53a3b.zip |
sync with master
Diffstat (limited to 'src/critical_log.c')
-rw-r--r-- | src/critical_log.c | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/critical_log.c b/src/critical_log.c new file mode 100644 index 0000000..36e7ccf --- /dev/null +++ b/src/critical_log.c @@ -0,0 +1,164 @@ +/* + * Copyright 2012 Samsung Electronics Co., Ltd + * + * Licensed under the Flora License, Version 1.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.tizenopensource.org/license + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdio.h> +#include <stdarg.h> +#include <stdlib.h> +#include <sys/time.h> +#include <errno.h> +#include <string.h> +#include <libgen.h> +#include <sys/types.h> +#include <unistd.h> + +#include <dlog.h> +#include <Eina.h> + +#include "conf.h" +#include "debug.h" +#include "util.h" +#include "critical_log.h" + +static struct { + FILE *fp; + int file_id; + int nr_of_lines; + char *filename; +} s_info = { + .fp = NULL, + .file_id = 0, + .nr_of_lines = 0, + .filename = NULL, +}; + + + +static inline void rotate_log(void) +{ + char *filename; + int namelen; + + if (s_info.nr_of_lines < MAX_LOG_LINE) + return; + + s_info.file_id = (s_info.file_id + 1) % MAX_LOG_FILE; + + namelen = strlen(s_info.filename) + strlen(SLAVE_LOG_PATH) + 20; + filename = malloc(namelen); + if (filename) { + snprintf(filename, namelen, "%s/%d_%s", SLAVE_LOG_PATH, s_info.file_id, s_info.filename); + + if (s_info.fp) + fclose(s_info.fp); + + s_info.fp = fopen(filename, "w+"); + if (!s_info.fp) + ErrPrint("Failed to open a file: %s\n", filename); + + DbgFree(filename); + } + + s_info.nr_of_lines = 0; +} + + + +HAPI int critical_log(const char *func, int line, const char *fmt, ...) +{ + va_list ap; + int ret; + struct timeval tv; + + if (!s_info.fp) + return -EIO; + + if (gettimeofday(&tv, NULL) < 0) { + tv.tv_sec = 0; + tv.tv_usec = 0; + } + + fprintf(s_info.fp, "%d %lu.%lu [%s:%d] ", getpid(), tv.tv_sec, tv.tv_usec, util_basename((char *)func), line); + + va_start(ap, fmt); + ret = vfprintf(s_info.fp, fmt, ap); + va_end(ap); + + s_info.nr_of_lines++; + rotate_log(); + return ret; +} + + + +HAPI int critical_log_init(const char *name) +{ + int namelen; + char *filename; + + if (s_info.fp) + return 0; + + s_info.filename = strdup(name); + if (!s_info.filename) { + ErrPrint("Failed to create a log file\n"); + return -ENOMEM; + } + + namelen = strlen(name) + strlen(SLAVE_LOG_PATH) + 20; + + filename = malloc(namelen); + if (!filename) { + ErrPrint("Failed to create a log file\n"); + DbgFree(s_info.filename); + s_info.filename = NULL; + return -ENOMEM; + } + + snprintf(filename, namelen, "%s/%d_%s", SLAVE_LOG_PATH, s_info.file_id, name); + + s_info.fp = fopen(filename, "w+"); + if (!s_info.fp) { + ErrPrint("Failed to open log: %s\n", strerror(errno)); + DbgFree(s_info.filename); + s_info.filename = NULL; + DbgFree(filename); + return -EIO; + } + + DbgFree(filename); + return 0; +} + + + +HAPI int critical_log_fini(void) +{ + if (s_info.filename) { + DbgFree(s_info.filename); + s_info.filename = NULL; + } + + if (s_info.fp) { + fclose(s_info.fp); + s_info.fp = NULL; + } + + return 0; +} + + + +/* End of a file */ |