@@ -1144,6 +1144,41 @@ mainloop_thread (void *ctx) {
1144
1144
return ;
1145
1145
}
1146
1146
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
+
1147
1182
int
1148
1183
main (int argc , char * argv []) {
1149
1184
#if __MINGW32__
@@ -1289,7 +1324,7 @@ main (int argc, char *argv[]) {
1289
1324
return -1 ;
1290
1325
}
1291
1326
}
1292
- mkdir (confdir , 0755 );
1327
+ ( void ) mkdir_recursive (confdir );
1293
1328
1294
1329
#if __APPLE__
1295
1330
char appcachepath [PATH_MAX ];
@@ -1330,7 +1365,7 @@ main (int argc, char *argv[]) {
1330
1365
trace_err ("fatal: cache path is too long: %s\n" , dbruntimedir );
1331
1366
return -1 ;
1332
1367
}
1333
- mkdir (dbruntimedir , 0755 );
1368
+ ( void ) mkdir_recursive (dbruntimedir );
1334
1369
}
1335
1370
else {
1336
1371
strcpy (dbruntimedir , dbconfdir );
@@ -1354,7 +1389,7 @@ main (int argc, char *argv[]) {
1354
1389
return -1 ;
1355
1390
}
1356
1391
#endif
1357
- mkdir (dbplugindir , 0755 );
1392
+ ( void ) mkdir_recursive (dbplugindir );
1358
1393
}
1359
1394
else {
1360
1395
if (snprintf (dbplugindir , sizeof (dbplugindir ), "%s/deadbeef" , LIBDIR ) > (int )sizeof (dbplugindir )) {
@@ -1372,7 +1407,7 @@ main (int argc, char *argv[]) {
1372
1407
return -1 ;
1373
1408
}
1374
1409
#endif
1375
- mkdir (dbresourcedir , 0755 );
1410
+ ( void ) mkdir_recursive (dbresourcedir );
1376
1411
}
1377
1412
else {
1378
1413
strcpy (dbresourcedir , dbplugindir );
@@ -1416,35 +1451,26 @@ main (int argc, char *argv[]) {
1416
1451
#if __APPLE__
1417
1452
char statedir [PATH_MAX ];
1418
1453
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 );
1423
1454
if (snprintf (dbstatedir , sizeof (dbstatedir ), "%s/Deadbeef/State" , statedir ) > (int )sizeof (dbstatedir )) {
1424
1455
trace_err ("fatal: state path is too long: %s\n" , dbstatedir );
1425
1456
return -1 ;
1426
1457
}
1427
1458
#else
1428
1459
const char * xdg_state = getenv (STATEDIR );
1429
1460
if (xdg_state != NULL ) {
1430
- mkdir (xdg_state , 0755 );
1431
1461
if (snprintf (dbstatedir , sizeof (dbstatedir ), "%s/deadbeef" , xdg_state ) > (int )sizeof (dbstatedir )) {
1432
1462
trace_err ("fatal: state path is too long: %s\n" , dbstatedir );
1433
1463
return -1 ;
1434
1464
}
1435
1465
}
1436
1466
else {
1437
- char temp [PATH_MAX ];
1438
- snprintf (temp , sizeof (temp ), "%s/.local/state" , homedir );
1439
- mkdir (temp , 0755 );
1440
1467
if (snprintf (dbstatedir , sizeof (dbstatedir ), "%s/.local/state/deadbeef" , homedir ) > (int )sizeof (dbstatedir )) {
1441
1468
trace_err ("fatal: state path is too long: %s\n" , dbstatedir );
1442
1469
return -1 ;
1443
1470
}
1444
1471
}
1445
1472
#endif
1446
- mkdir (dbstatedir , 0755 );
1447
-
1473
+ (void )mkdir_recursive (dbstatedir );
1448
1474
1449
1475
const char * plugname = "main" ;
1450
1476
for (int i = 1 ; i < argc ; i ++ ) {
@@ -1494,7 +1520,7 @@ main (int argc, char *argv[]) {
1494
1520
}
1495
1521
#endif
1496
1522
1497
- mkdir (dbconfdir , 0755 );
1523
+ ( void ) mkdir_recursive (dbconfdir );
1498
1524
1499
1525
int size = 0 ;
1500
1526
char * cmdline = prepare_command_line (argc , argv , & size );
0 commit comments