summaryrefslogtreecommitdiffstats
path: root/lib/system/system.c
blob: 89790ba47932b3e94ee96a814eaf4adb2fa19212 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120

#if defined(HAVE_CONFIG_H)
#include "config.h"
#endif

#include <assert.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/wait.h>

#include "log/log.h"
#include <talloc/talloc.h>
#include "system.h"

const struct pb_system_apps pb_system_apps = {
	.prefix		= PREFIX,
	.cp		= HOST_PROG_CP,
	.kexec		= HOST_PROG_KEXEC,
	.mount		= HOST_PROG_MOUNT,
	.shutdown	= HOST_PROG_SHUTDOWN,
	.sftp		= HOST_PROG_SFTP,
	.tftp		= HOST_PROG_TFTP,
	.umount		= HOST_PROG_UMOUNT,
	.wget		= HOST_PROG_WGET,
	.ip		= HOST_PROG_IP,
	.udhcpc		= HOST_PROG_UDHCPC,
	.udhcpc6	= HOST_PROG_UDHCPC6,
	.vgscan		= HOST_PROG_VGSCAN,
	.vgchange	= HOST_PROG_VGCHANGE,
	.pb_plugin	= HOST_PROG_PB_PLUGIN,
	.pb_exec	= HOST_PROG_PB_EXEC,
	.sh		= HOST_PROG_SH,
	.scsi_rescan	= HOST_PROG_SCSI_RESCAN,
	.dmidecode	= HOST_PROG_DMIDECODE,
};

#ifndef TFTP_TYPE
#define TFTP_TYPE TFTP_TYPE_UNKNOWN
#endif

enum tftp_type tftp_type = TFTP_TYPE;

int pb_mkdir_recursive(const char *dir)
{
	struct stat statbuf;
	int rc, mode = 0755;
	char *str, *sep;

	if (!*dir)
		return 0;

	if (!stat(dir, &statbuf)) {
		if (!S_ISDIR(statbuf.st_mode)) {
			pb_log("%s: %s exists, but isn't a directory\n",
					__func__, dir);
			return -1;
		}
		return 0;
	}

	str = talloc_strdup(NULL, dir);
	sep = strchr(*str == '/' ? str + 1 : str, '/');

	rc = 0;

	while (1) {

		/* terminate the path at sep */
		if (sep)
			*sep = '\0';

		if (mkdir(str, mode) && errno != EEXIST) {
			pb_log("mkdir(%s): %s\n", str, strerror(errno));
			rc = -1;
			break;
		}

		if (!sep)
			break;

		/* reset dir to the full path */
		strcpy(str, dir);
		sep = strchr(sep + 1, '/');
	}

	talloc_free(str);

	return rc;
}

int pb_rmdir_recursive(const char *base, const char *dir)
{
	char *cur, *pos;

	/* sanity check: make sure that dir is within base */
	if (strncmp(base, dir, strlen(base)))
		return -1;

	cur = talloc_strdup(NULL, dir);

	while (strcmp(base, cur)) {

		rmdir(cur);

		/* null-terminate at the last slash */
		pos = strrchr(cur, '/');
		if (!pos)
			break;

		*pos = '\0';
	}

	talloc_free(cur);

	return 0;
}
OpenPOWER on IntegriCloud