Skip to content

Commit 573c2ce

Browse files
Create configuration/state directories properly and recursively. Fixes bug on linux that secrets file can't be written to
1 parent 722fc23 commit 573c2ce

File tree

1 file changed

+41
-15
lines changed

1 file changed

+41
-15
lines changed

src/main.c

+41-15
Original file line numberDiff line numberDiff line change
@@ -1144,6 +1144,41 @@ mainloop_thread (void *ctx) {
11441144
return;
11451145
}
11461146

1147+
static int
1148+
mkdir_recursive(const char *path) {
1149+
char *tmp = strdup(path);
1150+
if (tmp == NULL) {
1151+
return -1;
1152+
}
1153+
1154+
char *p = tmp;
1155+
1156+
do {
1157+
while (*p == '/') {
1158+
p++;
1159+
}
1160+
1161+
p = strchr(p, '/');
1162+
1163+
if (p != NULL) {
1164+
*p = '\0';
1165+
}
1166+
1167+
if (mkdir(tmp, 0755) != 0 && errno != EEXIST) {
1168+
free(tmp);
1169+
return -1;
1170+
}
1171+
1172+
if (p != NULL) {
1173+
*p = '/';
1174+
}
1175+
1176+
} while (p != NULL);
1177+
1178+
free(tmp);
1179+
return 0;
1180+
}
1181+
11471182
int
11481183
main (int argc, char *argv[]) {
11491184
#if __MINGW32__
@@ -1289,7 +1324,7 @@ main (int argc, char *argv[]) {
12891324
return -1;
12901325
}
12911326
}
1292-
mkdir (confdir, 0755);
1327+
(void)mkdir_recursive (confdir);
12931328

12941329
#if __APPLE__
12951330
char appcachepath[PATH_MAX];
@@ -1330,7 +1365,7 @@ main (int argc, char *argv[]) {
13301365
trace_err ("fatal: cache path is too long: %s\n", dbruntimedir);
13311366
return -1;
13321367
}
1333-
mkdir (dbruntimedir, 0755);
1368+
(void)mkdir_recursive (dbruntimedir);
13341369
}
13351370
else {
13361371
strcpy (dbruntimedir, dbconfdir);
@@ -1354,7 +1389,7 @@ main (int argc, char *argv[]) {
13541389
return -1;
13551390
}
13561391
#endif
1357-
mkdir (dbplugindir, 0755);
1392+
(void)mkdir_recursive (dbplugindir);
13581393
}
13591394
else {
13601395
if (snprintf (dbplugindir, sizeof (dbplugindir), "%s/deadbeef", LIBDIR) > (int)sizeof (dbplugindir)) {
@@ -1372,7 +1407,7 @@ main (int argc, char *argv[]) {
13721407
return -1;
13731408
}
13741409
#endif
1375-
mkdir (dbresourcedir, 0755);
1410+
(void)mkdir_recursive (dbresourcedir);
13761411
}
13771412
else {
13781413
strcpy (dbresourcedir, dbplugindir);
@@ -1416,35 +1451,26 @@ main (int argc, char *argv[]) {
14161451
#if __APPLE__
14171452
char statedir[PATH_MAX];
14181453
cocoautil_get_application_support_path (statedir, sizeof (statedir));
1419-
mkdir(statedir, 0755);
1420-
char temp[PATH_MAX];
1421-
snprintf(temp, sizeof(temp), "%s/Deadbeef", statedir);
1422-
mkdir(temp, 0755);
14231454
if (snprintf (dbstatedir, sizeof (dbstatedir), "%s/Deadbeef/State", statedir) > (int)sizeof (dbstatedir)) {
14241455
trace_err ("fatal: state path is too long: %s\n", dbstatedir);
14251456
return -1;
14261457
}
14271458
#else
14281459
const char *xdg_state = getenv (STATEDIR);
14291460
if (xdg_state != NULL) {
1430-
mkdir (xdg_state, 0755);
14311461
if (snprintf (dbstatedir, sizeof (dbstatedir), "%s/deadbeef", xdg_state) > (int)sizeof (dbstatedir)) {
14321462
trace_err ("fatal: state path is too long: %s\n", dbstatedir);
14331463
return -1;
14341464
}
14351465
}
14361466
else {
1437-
char temp[PATH_MAX];
1438-
snprintf(temp, sizeof(temp), "%s/.local/state", homedir);
1439-
mkdir (temp, 0755);
14401467
if (snprintf (dbstatedir, sizeof (dbstatedir), "%s/.local/state/deadbeef", homedir) > (int)sizeof (dbstatedir)) {
14411468
trace_err ("fatal: state path is too long: %s\n", dbstatedir);
14421469
return -1;
14431470
}
14441471
}
14451472
#endif
1446-
mkdir (dbstatedir, 0755);
1447-
1473+
(void)mkdir_recursive (dbstatedir);
14481474

14491475
const char *plugname = "main";
14501476
for (int i = 1; i < argc; i++) {
@@ -1494,7 +1520,7 @@ main (int argc, char *argv[]) {
14941520
}
14951521
#endif
14961522

1497-
mkdir (dbconfdir, 0755);
1523+
(void)mkdir_recursive (dbconfdir);
14981524

14991525
int size = 0;
15001526
char *cmdline = prepare_command_line (argc, argv, &size);

0 commit comments

Comments
 (0)