X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fsd-journal.c;h=283d5930630c34c4dbdfa17944a3b6c73cab41eb;hb=b3070dc0258831c7e2b13624f75fa3dbd80d9833;hp=b55cf37e50d93c609b0726e065d5bab4d7a990c2;hpb=b6741478e7661c7e580e5dcfd6a6fccd1899c1d0;p=elogind.git diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index b55cf37e5..283d59306 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -1442,10 +1442,16 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) for (;;) { struct dirent *de; - union dirent_storage buf; - r = readdir_r(d, &buf.de, &de); - if (r != 0 || !de) + errno = 0; + de = readdir(d); + if (!de && errno != 0) { + r = -errno; + log_debug("Failed to read directory %s: %s", + m->path, strerror(errno)); + return r; + } + if (!de) break; if (dirent_is_file_with_suffix(de, ".journal") || @@ -1466,7 +1472,7 @@ static int add_directory(sd_journal *j, const char *prefix, const char *dirname) return 0; } -static int add_root_directory(sd_journal *j, const char *p, const char *prefix) { +static int add_root_directory(sd_journal *j, const char *p) { _cleanup_closedir_ DIR *d = NULL; Directory *m; int r; @@ -1478,8 +1484,8 @@ static int add_root_directory(sd_journal *j, const char *p, const char *prefix) !path_startswith(p, "/run")) return -EINVAL; - if (prefix) - p = strappenda(prefix, p); + if (j->prefix) + p = strappenda(j->prefix, p); d = opendir(p); if (!d) @@ -1526,11 +1532,17 @@ static int add_root_directory(sd_journal *j, const char *p, const char *prefix) for (;;) { struct dirent *de; - union dirent_storage buf; sd_id128_t id; - r = readdir_r(d, &buf.de, &de); - if (r != 0 || !de) + errno = 0; + de = readdir(d); + if (!de && errno != 0) { + r = -errno; + log_debug("Failed to read directory %s: %s", + m->path, strerror(errno)); + return r; + } + if (!de) break; if (dirent_is_file_with_suffix(de, ".journal") || @@ -1580,7 +1592,7 @@ static int remove_directory(sd_journal *j, Directory *d) { return 0; } -static int add_search_paths(sd_journal *j, const char *prefix) { +static int add_search_paths(sd_journal *j) { int r; const char search_paths[] = "/run/log/journal\0" @@ -1593,7 +1605,7 @@ static int add_search_paths(sd_journal *j, const char *prefix) { * what's actually accessible, and ignore the rest. */ NULSTR_FOREACH(p, search_paths) { - r = add_root_directory(j, p, prefix); + r = add_root_directory(j, p); if (r < 0 && r != -ENOENT) { r = set_put_error(j, r); if (r < 0) @@ -1616,14 +1628,14 @@ static int add_current_paths(sd_journal *j) { * treat them as fatal. */ HASHMAP_FOREACH(f, j->files, i) { - int r; _cleanup_free_ char *dir; + int r; dir = dirname_malloc(f->path); if (!dir) return -ENOMEM; - r = add_root_directory(j, dir, NULL); + r = add_root_directory(j, dir); if (r < 0) { set_put_error(j, r); return r; @@ -1694,7 +1706,7 @@ _public_ int sd_journal_open(sd_journal **ret, int flags) { if (!j) return -ENOMEM; - r = add_search_paths(j, NULL); + r = add_search_paths(j); if (r < 0) goto fail; @@ -1734,7 +1746,10 @@ _public_ int sd_journal_open_container(sd_journal **ret, const char *machine, in if (!j) return -ENOMEM; - r = add_search_paths(j, root); + j->prefix = root; + root = NULL; + + r = add_search_paths(j); if (r < 0) goto fail; @@ -1758,7 +1773,7 @@ _public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int f if (!j) return -ENOMEM; - r = add_root_directory(j, path, NULL); + r = add_root_directory(j, path); if (r < 0) { set_put_error(j, r); goto fail; @@ -1836,6 +1851,7 @@ _public_ void sd_journal_close(sd_journal *j) { } free(j->path); + free(j->prefix); free(j->unique_field); set_free(j->errors); free(j); @@ -2121,9 +2137,9 @@ _public_ int sd_journal_get_fd(sd_journal *j) { if (j->no_new_files) r = add_current_paths(j); else if (j->path) - r = add_root_directory(j, j->path, NULL); + r = add_root_directory(j, j->path); else - r = add_search_paths(j, NULL); + r = add_search_paths(j); if (r < 0) return r;