***/
#include <errno.h>
-#include <sys/stat.h>
#include <stdlib.h>
-#include <string.h>
-#include <assert.h>
#include <unistd.h>
#include "dev-setup.h"
-#include "log.h"
-#include "macro.h"
#include "util.h"
#include "label.h"
-static int symlink_and_label(const char *old_path, const char *new_path) {
- int r;
-
- assert(old_path);
- assert(new_path);
-
- r = label_context_set(new_path, S_IFLNK);
- if (r < 0)
- return r;
-
- if (symlink(old_path, new_path) < 0)
- r = -errno;
-
- label_context_clear();
-
- return r;
-}
-
-void dev_setup(const char *pathprefix) {
+int dev_setup(const char *prefix) {
const char *j, *k;
static const char symlinks[] =
- "/proc/kcore\0" "/dev/core\0"
+ "-/proc/kcore\0" "/dev/core\0"
"/proc/self/fd\0" "/dev/fd\0"
"/proc/self/fd/0\0" "/dev/stdin\0"
"/proc/self/fd/1\0" "/dev/stdout\0"
"/proc/self/fd/2\0" "/dev/stderr\0";
NULSTR_FOREACH_PAIR(j, k, symlinks) {
- char *linkname;
+ if (j[0] == '-') {
+ j++;
- if (asprintf(&linkname, "%s/%s", pathprefix, k) < 0) {
- log_oom();
- break;
+ if (access(j, F_OK) < 0)
+ continue;
}
- symlink_and_label(j, linkname);
+ if (prefix) {
+ _cleanup_free_ char *link_name = NULL;
- free(linkname);
+ link_name = strjoin(prefix, "/", k, NULL);
+ if (!link_name)
+ return -ENOMEM;
+
+ symlink_label(j, link_name);
+ } else
+ symlink_label(j, k);
}
+
+ return 0;
}