#include "missing.h"
#include "catalog.h"
#include "replace-var.h"
+#include "fileio.h"
#define JOURNAL_FILES_MAX 1024
return 0;
}
-static int add_root_directory(sd_journal *j, const char *p) {
+static int add_root_directory(sd_journal *j, const char *p, const char *prefix) {
_cleanup_closedir_ DIR *d = NULL;
Directory *m;
int r;
!path_startswith(p, "/run"))
return -EINVAL;
+ if (prefix)
+ p = strappenda(prefix, p);
+
d = opendir(p);
if (!d)
return -errno;
return 0;
}
-static int add_search_paths(sd_journal *j) {
+static int add_search_paths(sd_journal *j, const char *prefix) {
int r;
const char search_paths[] =
"/run/log/journal\0"
* what's actually accessible, and ignore the rest. */
NULSTR_FOREACH(p, search_paths) {
- r = add_root_directory(j, p);
+ r = add_root_directory(j, p, prefix);
if (r < 0 && r != -ENOENT) {
r = set_put_error(j, r);
if (r < 0)
if (!dir)
return -ENOMEM;
- r = add_root_directory(j, dir);
+ r = add_root_directory(j, dir, NULL);
if (r < 0) {
set_put_error(j, r);
return r;
int r;
assert_return(ret, -EINVAL);
-
- if (flags & ~(SD_JOURNAL_LOCAL_ONLY|
- SD_JOURNAL_RUNTIME_ONLY|
- SD_JOURNAL_SYSTEM|
- SD_JOURNAL_CURRENT_USER))
- return -EINVAL;
+ assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_RUNTIME_ONLY|SD_JOURNAL_SYSTEM|SD_JOURNAL_CURRENT_USER)) == 0, -EINVAL);
j = journal_new(flags, NULL);
if (!j)
return -ENOMEM;
- r = add_search_paths(j);
+ r = add_search_paths(j, NULL);
if (r < 0)
goto fail;
return r;
}
+_public_ int sd_journal_open_container(sd_journal **ret, const char *machine, int flags) {
+ _cleanup_free_ char *root = NULL, *class = NULL;
+ sd_journal *j;
+ char *p;
+ int r;
+
+ assert_return(machine, -EINVAL);
+ assert_return(ret, -EINVAL);
+ assert_return((flags & ~(SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM)) == 0, -EINVAL);
+ assert_return(filename_is_safe(machine), -EINVAL);
+
+ p = strappenda("/run/systemd/machines/", machine);
+ r = parse_env_file(p, NEWLINE, "ROOT", &root, "CLASS", &class, NULL);
+ if (r == -ENOENT)
+ return -EHOSTDOWN;
+ if (r < 0)
+ return r;
+ if (!root)
+ return -ENODATA;
+
+ if (!streq_ptr(class, "container"))
+ return -EIO;
+
+ j = journal_new(flags, NULL);
+ if (!j)
+ return -ENOMEM;
+
+ r = add_search_paths(j, root);
+ if (r < 0)
+ goto fail;
+
+ *ret = j;
+ return 0;
+
+fail:
+ sd_journal_close(j);
+ return r;
+}
+
_public_ int sd_journal_open_directory(sd_journal **ret, const char *path, int flags) {
sd_journal *j;
int r;
if (!j)
return -ENOMEM;
- r = add_root_directory(j, path);
+ r = add_root_directory(j, path, NULL);
if (r < 0) {
set_put_error(j, r);
goto fail;
if (j->no_new_files)
r = add_current_paths(j);
else if (j->path)
- r = add_root_directory(j, j->path);
+ r = add_root_directory(j, j->path, NULL);
else
- r = add_search_paths(j);
+ r = add_search_paths(j, NULL);
if (r < 0)
return r;