- return 1;
- }
-
- if ((f = fopen("/proc/self/cgroup", "re"))) {
-
- for (;;) {
- char line[LINE_MAX], *p;
-
- if (!fgets(line, sizeof(line), f))
- break;
-
- if (!(p = strchr(strstrip(line), ':')))
- continue;
-
- if (strncmp(p, ":ns:", 4))
- continue;
-
- if (!streq(p, ":ns:/")) {
- fclose(f);
-
- if (id)
- *id = "pidns";
-
- return 1;
- }
- }
-
- fclose(f);
- }
-
- return 0;
-}
-
-/* Returns a short identifier for the various VM/container implementations */
-int detect_virtualization(const char **id) {
- static __thread const char *cached_id = NULL;
- const char *_id;
- int r;
-
- if (cached_id) {
-
- if (cached_id == (const char*) -1)
- return 0;
-
- if (id)
- *id = cached_id;
-
- return 1;
- }
-
- if ((r = detect_container(&_id)) != 0)
- goto finish;
-
- r = detect_vm(&_id);
-
-finish:
- if (r > 0) {
- cached_id = _id;
-
- if (id)
- *id = _id;
- } else if (r == 0)
- cached_id = (const char*) -1;
-
- return r;
-}
-
-bool dirent_is_file(struct dirent *de) {
- assert(de);
-
- if (ignore_file(de->d_name))
- return false;
-
- if (de->d_type != DT_REG &&
- de->d_type != DT_LNK &&
- de->d_type != DT_UNKNOWN)
- return false;
-
- return true;
-}
-
-void execute_directory(const char *directory, DIR *d, char *argv[]) {
- DIR *_d = NULL;
- struct dirent *de;
- Hashmap *pids = NULL;
-
- assert(directory);
-
- /* Executes all binaries in a directory in parallel and waits
- * until all they all finished. */
-
- if (!d) {
- if (!(_d = opendir(directory))) {
-
- if (errno == ENOENT)
- return;
-
- log_error("Failed to enumerate directory %s: %m", directory);
- return;
- }
-
- d = _d;
- }
-
- if (!(pids = hashmap_new(trivial_hash_func, trivial_compare_func))) {
- log_error("Failed to allocate set.");
- goto finish;
- }
-
- while ((de = readdir(d))) {
- char *path;
- pid_t pid;
- int k;
-
- if (!dirent_is_file(de))
- continue;
-
- if (asprintf(&path, "%s/%s", directory, de->d_name) < 0) {
- log_error("Out of memory");
- continue;
- }
-
- if ((pid = fork()) < 0) {
- log_error("Failed to fork: %m");
- free(path);
- continue;
- }
-
- if (pid == 0) {
- char *_argv[2];
- /* Child */
-
- if (!argv) {
- _argv[0] = path;
- _argv[1] = NULL;
- argv = _argv;
- } else
- if (!argv[0])
- argv[0] = path;
-
- execv(path, argv);
-
- log_error("Failed to execute %s: %m", path);
- _exit(EXIT_FAILURE);
- }
-
- log_debug("Spawned %s as %lu", path, (unsigned long) pid);
-
- if ((k = hashmap_put(pids, UINT_TO_PTR(pid), path)) < 0) {
- log_error("Failed to add PID to set: %s", strerror(-k));
- free(path);
- }
- }
-
- while (!hashmap_isempty(pids)) {
- siginfo_t si;
- char *path;
-
- zero(si);
- if (waitid(P_ALL, 0, &si, WEXITED) < 0) {