Check dump file size during initialization 54/107954/3
authorKichan Kwon <k_c.kwon@samsung.com>
Mon, 2 Jan 2017 04:51:28 +0000 (13:51 +0900)
committerKichan Kwon <k_c.kwon@samsung.com>
Mon, 2 Jan 2017 06:20:25 +0000 (15:20 +0900)
- Until now, dump file is rotated after writing rotate_size_kbytes
- If writing less than rotate_size_kbytes and rebooting are repeated,
 dump file size can be infinitely increased
- To prevent this, large dump file should be rotated before logging

- Meanwhile, size conversion macro is defined

Change-Id: Id506421799076075e7307c262242835e4bd6d6ea
Signed-off-by: Kichan Kwon <k_c.kwon@samsung.com>
include/log_file.h
src/logger/logger.c
src/logutil/logutil.c

index dbeec04..366e1a3 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <logprint.h>
 
+#define BtoKiB(x)      ((x) >> 10)
+
 struct log_file {
        char *path;
        int fd;
index 747a7e5..d862706 100644 (file)
@@ -676,7 +676,8 @@ static int print_out_logs(struct reader* reader, struct log_buffer* buffer)
                        reader->partial_log_size = ple->len - r;
                        memcpy(reader->partial_log, ple + r, reader->partial_log_size);
                        goto cleanup;
-               } else if ((reader->file.rotate_size_kbytes > 0) && ((reader->file.size / 1024) >= reader->file.rotate_size_kbytes)) {
+               } else if ((reader->file.rotate_size_kbytes > 0) &&
+                               (BtoKiB(reader->file.size) >= reader->file.rotate_size_kbytes)) {
                        if (!plaintext && write_blob_to_file(reader, &g_file_buffer) < 0)
                                goto cleanup;
 
@@ -828,7 +829,8 @@ static int service_reader_file(struct logger * server, struct reader* reader)
                                        int written_bytes = log_print_log_line(reader->file.format, reader->file.fd, &le);
                                        if (written_bytes > 0) {
                                                reader->file.size += written_bytes;
-                                               if ((reader->file.rotate_size_kbytes > 0) && ((reader->file.size / 1024) >= reader->file.rotate_size_kbytes))
+                                               if ((reader->file.rotate_size_kbytes > 0) &&
+                                                               (BtoKiB(reader->file.size) >= reader->file.rotate_size_kbytes))
                                                        rotate_logs(&reader->file);
                                        }
                                }
@@ -882,6 +884,7 @@ static int parse_command_line(const char* cmdl, struct logger* server, struct wr
        int retval = 0;
        int wr_socket_fd = wr ? wr->socket_fd : -1;
        struct reader * reader;
+       struct stat stat_buf;
 
        char const * conf_val;
        struct log_config conf = {NULL, NULL};
@@ -1019,6 +1022,13 @@ static int parse_command_line(const char* cmdl, struct logger* server, struct wr
                        if (retval < 0)
                                goto cleanup;
                }
+
+               if (!fstat(reader->file.fd, &stat_buf)) {
+                       reader->file.size = stat_buf.st_size;
+                       if ((reader->file.rotate_size_kbytes > 0) &&
+                                       (BtoKiB(reader->file.size) > reader->file.rotate_size_kbytes))
+                               rotate_logs(&(reader->file));
+               }
        } else {
                reader->file.rotate_size_kbytes = 0;
                reader->file.max_rotated = 0;
index a515229..3d64449 100644 (file)
@@ -224,7 +224,8 @@ static int do_getsize(struct log_config * conf, char ** names, int cnt)
                        return 1;
                }
 
-               printf("Buffer #%d (%s) has size %d KB\n", log_id_by_name(names[cnt]), names[cnt], atoi(conf_value) / 1024);
+               printf("Buffer #%d (%s) has size %d KB\n", log_id_by_name(names[cnt]),
+                               names[cnt], BtoKiB(atoi(conf_value)));
        }
        return 0;
 }
@@ -287,7 +288,7 @@ static int process_log(struct logger_entry *e, struct logger_entry *last)
                int written_bytes = log_print_log_line(l_file.format, l_file.fd, & entry);
                if (written_bytes > 0)
                        l_file.size += written_bytes;
-               if ((l_file.rotate_size_kbytes > 0) && ((l_file.size / 1024) >= l_file.rotate_size_kbytes))
+               if ((l_file.rotate_size_kbytes > 0) && (BtoKiB(l_file.size) >= l_file.rotate_size_kbytes))
                        rotate_logs(&l_file);
                return 1;
        } else
@@ -451,7 +452,8 @@ static void handle_pipe(struct fd_info **data_fds, int fd_count, int dump)
                                        r = log_print_log_line(l_file.format, l_file.fd, &entry);
                                        if (r > 0)
                                                l_file.size += r;
-                                       if ((l_file.rotate_size_kbytes > 0) && ((l_file.size / 1024) >= l_file.rotate_size_kbytes))
+                                       if ((l_file.rotate_size_kbytes > 0) &&
+                                                       (BtoKiB(l_file.size) >= l_file.rotate_size_kbytes))
                                                rotate_logs(&l_file);
                                        if (dump && !--dump) {
                                                looping = 0;
@@ -688,6 +690,7 @@ int main(int argc, char ** argv)
        int i;
        int option;
        int tag_cnt = 0;
+       struct stat stat_buf;
 
        l_file.fd = 1;
        l_file.format = log_format_new();
@@ -853,8 +856,20 @@ int main(int argc, char ** argv)
                return 1;
        }
 
-       if (l_file.path)
+       if (l_file.path) {
                l_file.fd = open(l_file.path, O_CREAT | O_WRONLY | O_APPEND, S_IRUSR | S_IWUSR);
+               if (l_file.fd < 0) {
+                       printf("Failed to open %s", l_file.path);
+                       return 1;
+               }
+
+               if (!fstat(l_file.fd, &stat_buf)) {
+                       l_file.size = stat_buf.st_size;
+                       if ((l_file.rotate_size_kbytes > 0) &&
+                                       (BtoKiB(l_file.size) > l_file.rotate_size_kbytes))
+                               rotate_logs(&l_file);
+               }
+       }
 
        for (i = 0; i < buffer_cnt; ++i) {
                struct fd_info * fdi;