X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal%2Fsd-journal.c;h=ef4b9b2242a422c64867eb776feadc987eee566d;hp=19123544b34bd5dcd3f31f7b044bd1aea46667be;hb=8cb17a6dc88cecfcee3189765031e9e8a1f4106b;hpb=d95b1fb315f62313be5bee5bee3b2d1467868a7d diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index 19123544b..ef4b9b224 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1215,7 +1215,7 @@ static void check_network(sd_journal *j, int fd) { } static int add_file(sd_journal *j, const char *prefix, const char *filename) { - char *path; + char _cleanup_free_ *path = NULL; int r; JournalFile *f; @@ -1234,20 +1234,15 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) { if (!path) return -ENOMEM; - if (hashmap_get(j->files, path)) { - free(path); + if (hashmap_get(j->files, path)) return 0; - } if (hashmap_size(j->files) >= JOURNAL_FILES_MAX) { log_debug("Too many open journal files, not adding %s, ignoring.", path); - free(path); return 0; } r = journal_file_open(path, O_RDONLY, 0, false, false, NULL, j->mmap, NULL, &f); - free(path); - if (r < 0) { if (errno == ENOENT) return 0; @@ -1263,12 +1258,12 @@ static int add_file(sd_journal *j, const char *prefix, const char *filename) { return r; } + log_debug("File %s got added.", f->path); + check_network(j, f->fd); j->current_invalidate_counter ++; - log_debug("File %s got added.", f->path); - return 0; } @@ -1311,9 +1306,9 @@ static int remove_file(sd_journal *j, const char *prefix, const char *filename) } static int add_directory(sd_journal *j, const char *prefix, const char *dirname) { - char *path; + char _cleanup_free_ *path = NULL; int r; - DIR *d; + DIR _cleanup_closedir_ *d = NULL; sd_id128_t id, mid; Directory *m; @@ -1336,8 +1331,6 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) d = opendir(path); if (!d) { log_debug("Failed to open %s: %m", path); - free(path); - if (errno == ENOENT) return 0; return -errno; @@ -1346,32 +1339,24 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) m = hashmap_get(j->directories_by_path, path); if (!m) { m = new0(Directory, 1); - if (!m) { - closedir(d); - free(path); + if (!m) return -ENOMEM; - } m->is_root = false; m->path = path; if (hashmap_put(j->directories_by_path, m->path, m) < 0) { - closedir(d); - free(m->path); free(m); return -ENOMEM; } + path = NULL; /* avoid freeing in cleanup */ j->current_invalidate_counter ++; log_debug("Directory %s got added.", m->path); - } else if (m->is_root) { - free (path); - closedir(d); + } else if (m->is_root) return 0; - } else - free(path); if (m->wd <= 0 && j->inotify_fd >= 0) { @@ -1402,13 +1387,11 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) check_network(j, dirfd(d)); - closedir(d); - return 0; } static int add_root_directory(sd_journal *j, const char *p) { - DIR *d; + DIR _cleanup_closedir_ *d = NULL; Directory *m; int r; @@ -1426,21 +1409,17 @@ static int add_root_directory(sd_journal *j, const char *p) { m = hashmap_get(j->directories_by_path, p); if (!m) { m = new0(Directory, 1); - if (!m) { - closedir(d); + if (!m) return -ENOMEM; - } m->is_root = true; m->path = strdup(p); if (!m->path) { - closedir(d); free(m); return -ENOMEM; } if (hashmap_put(j->directories_by_path, m->path, m) < 0) { - closedir(d); free(m->path); free(m); return -ENOMEM; @@ -1450,10 +1429,8 @@ static int add_root_directory(sd_journal *j, const char *p) { log_debug("Root directory %s got added.", m->path); - } else if (!m->is_root) { - closedir(d); + } else if (!m->is_root) return 0; - } if (m->wd <= 0 && j->inotify_fd >= 0) { @@ -1491,8 +1468,6 @@ static int add_root_directory(sd_journal *j, const char *p) { check_network(j, dirfd(d)); - closedir(d); - return 0; } @@ -1568,37 +1543,21 @@ static sd_journal *journal_new(int flags, const char *path) { if (path) { j->path = strdup(path); - if (!j->path) { - free(j); - return NULL; - } + if (!j->path) + goto fail; } j->files = hashmap_new(string_hash_func, string_compare_func); - if (!j->files) { - free(j->path); - free(j); - return NULL; - } - j->directories_by_path = hashmap_new(string_hash_func, string_compare_func); - if (!j->directories_by_path) { - hashmap_free(j->files); - free(j->path); - free(j); - return NULL; - } - j->mmap = mmap_cache_new(); - if (!j->mmap) { - hashmap_free(j->files); - hashmap_free(j->directories_by_path); - free(j->path); - free(j); - return NULL; - } + if (!j->files || !j->directories_by_path || !j->mmap) + goto fail; return j; + +fail: + sd_journal_close(j); + return NULL; } _public_ int sd_journal_open(sd_journal **ret, int flags) { @@ -1637,7 +1596,7 @@ _public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int f if (!ret) return -EINVAL; - if (!path || !path_is_absolute(path)) + if (!path) return -EINVAL; if (flags != 0) @@ -1868,7 +1827,7 @@ _public_ int sd_journal_get_data(sd_journal *j, const char *field, const void ** *data = o->data.payload; *size = t; - return 1; + return 0; } r = journal_file_move_to_object(f, OBJECT_ENTRY, f->current_offset, &o);