2 #if defined(HAVE_CONFIG_H)
12 #include <sys/types.h>
16 #include <talloc/talloc.h>
19 const struct pb_system_apps pb_system_apps = {
22 .kexec = HOST_PROG_KEXEC,
23 .mount = HOST_PROG_MOUNT,
24 .shutdown = HOST_PROG_SHUTDOWN,
25 .sftp = HOST_PROG_SFTP,
26 .tftp = HOST_PROG_TFTP,
27 .umount = HOST_PROG_UMOUNT,
28 .wget = HOST_PROG_WGET,
30 .udhcpc = HOST_PROG_UDHCPC,
31 .udhcpc6 = HOST_PROG_UDHCPC6,
32 .vgscan = HOST_PROG_VGSCAN,
33 .vgchange = HOST_PROG_VGCHANGE,
34 .pb_plugin = HOST_PROG_PB_PLUGIN,
35 .pb_exec = HOST_PROG_PB_EXEC,
37 .scsi_rescan = HOST_PROG_SCSI_RESCAN,
38 .dmidecode = HOST_PROG_DMIDECODE,
39 .cryptsetup = HOST_PROG_CRYPTSETUP,
43 #define TFTP_TYPE TFTP_TYPE_UNKNOWN
46 enum tftp_type tftp_type = TFTP_TYPE;
48 int pb_mkdir_recursive(const char *dir)
57 if (!stat(dir, &statbuf)) {
58 if (!S_ISDIR(statbuf.st_mode)) {
59 pb_log("%s: %s exists, but isn't a directory\n",
66 str = talloc_strdup(NULL, dir);
67 sep = strchr(*str == '/' ? str + 1 : str, '/');
73 /* terminate the path at sep */
77 if (mkdir(str, mode) && errno != EEXIST) {
78 pb_log("mkdir(%s): %s\n", str, strerror(errno));
86 /* reset dir to the full path */
88 sep = strchr(sep + 1, '/');
96 int pb_rmdir_recursive(const char *base, const char *dir)
100 /* sanity check: make sure that dir is within base */
101 if (strncmp(base, dir, strlen(base)))
104 cur = talloc_strdup(NULL, dir);
106 while (strcmp(base, cur)) {
110 /* null-terminate at the last slash */
111 pos = strrchr(cur, '/');