summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/conf.c45
-rw-r--r--src/conf.h1
-rw-r--r--src/main.c19
3 files changed, 50 insertions, 15 deletions
diff --git a/src/conf.c b/src/conf.c
index 532dedc..5d2411d 100644
--- a/src/conf.c
+++ b/src/conf.c
@@ -35,10 +35,6 @@
35#include <sys/stat.h> 35#include <sys/stat.h>
36#include <errno.h> 36#include <errno.h>
37 37
38#ifdef WIN32
39#include <shlobj.h>
40#endif
41
42#include <libimobiledevice-glue/utils.h> 38#include <libimobiledevice-glue/utils.h>
43#include <plist/plist.h> 39#include <plist/plist.h>
44 40
@@ -47,6 +43,8 @@
47#include "log.h" 43#include "log.h"
48 44
49#ifdef WIN32 45#ifdef WIN32
46#include <shlobj.h>
47
50#define DIR_SEP '\\' 48#define DIR_SEP '\\'
51#define DIR_SEP_S "\\" 49#define DIR_SEP_S "\\"
52#else 50#else
@@ -180,13 +178,26 @@ static int mkdir_with_parents(const char *dir, int mode)
180/** 178/**
181 * Creates a freedesktop compatible configuration directory. 179 * Creates a freedesktop compatible configuration directory.
182 */ 180 */
183static void config_create_config_dir(void) 181static int config_create_config_dir(void)
184{ 182{
185 const char *config_path = config_get_config_dir(); 183 const char *config_path = config_get_config_dir();
186 struct stat st; 184 struct stat st;
187 if (stat(config_path, &st) != 0) { 185 int res = stat(config_path, &st);
188 mkdir_with_parents(config_path, 0755); 186 if (res != 0) {
187 res = mkdir_with_parents(config_path, 0755);
189 } 188 }
189 return res;
190}
191
192int config_set_config_dir(const char* path)
193{
194 if (!path) {
195 return -1;
196 }
197 free(__config_dir);
198 __config_dir = strdup(path);
199 usbmuxd_log(LL_DEBUG, "Setting config_dir to %s", __config_dir);
200 return config_create_config_dir();
190} 201}
191 202
192static int get_rand(int min, int max) 203static int get_rand(int min, int max)
@@ -270,7 +281,10 @@ static int config_set_value(const char *key, plist_t value)
270 char *config_file = NULL; 281 char *config_file = NULL;
271 282
272 /* Make sure config directory exists */ 283 /* Make sure config directory exists */
273 config_create_config_dir(); 284 if (config_create_config_dir() < 0) {
285 usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
286 return -1;
287 }
274 288
275 config_path = config_get_config_dir(); 289 config_path = config_get_config_dir();
276 config_file = string_concat(config_path, DIR_SEP_S, CONFIG_FILE, NULL); 290 config_file = string_concat(config_path, DIR_SEP_S, CONFIG_FILE, NULL);
@@ -342,7 +356,10 @@ int config_has_device_record(const char *udid)
342 if (!udid) return 0; 356 if (!udid) return 0;
343 357
344 /* ensure config directory exists */ 358 /* ensure config directory exists */
345 config_create_config_dir(); 359 if (config_create_config_dir() < 0) {
360 usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
361 return -1;
362 }
346 363
347 /* build file path */ 364 /* build file path */
348 const char *config_path = config_get_config_dir(); 365 const char *config_path = config_get_config_dir();
@@ -422,7 +439,10 @@ int config_set_device_record(const char *udid, char* record_data, uint64_t recor
422 } 439 }
423 440
424 /* ensure config directory exists */ 441 /* ensure config directory exists */
425 config_create_config_dir(); 442 if (config_create_config_dir() < 0) {
443 usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
444 return -1;
445 }
426 446
427 /* build file path */ 447 /* build file path */
428 const char *config_path = config_get_config_dir(); 448 const char *config_path = config_get_config_dir();
@@ -458,7 +478,10 @@ int config_get_device_record(const char *udid, char **record_data, uint64_t *rec
458 int res = 0; 478 int res = 0;
459 479
460 /* ensure config directory exists */ 480 /* ensure config directory exists */
461 config_create_config_dir(); 481 if (config_create_config_dir() < 0) {
482 usbmuxd_log(LL_ERROR, "ERROR: Failed to create config directory\n");
483 return -1;
484 }
462 485
463 /* build file path */ 486 /* build file path */
464 const char *config_path = config_get_config_dir(); 487 const char *config_path = config_get_config_dir();
diff --git a/src/conf.h b/src/conf.h
index bbfa965..294ca18 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -27,6 +27,7 @@
27#include <plist/plist.h> 27#include <plist/plist.h>
28 28
29const char *config_get_config_dir(); 29const char *config_get_config_dir();
30int config_set_config_dir(const char* path);
30 31
31void config_get_system_buid(char **system_buid); 32void config_get_system_buid(char **system_buid);
32 33
diff --git a/src/main.c b/src/main.c
index 836ac97..b09a187 100644
--- a/src/main.c
+++ b/src/main.c
@@ -517,6 +517,7 @@ static void usage()
517#ifdef HAVE_SYSTEMD 517#ifdef HAVE_SYSTEMD
518 printf(" -s, --systemd\t\tRun in systemd operation mode (implies -z and -f).\n"); 518 printf(" -s, --systemd\t\tRun in systemd operation mode (implies -z and -f).\n");
519#endif 519#endif
520 printf(" -C, --config-dir PATH\tSpecify different configuration directory.\n");
520 printf(" -S, --socket ADDR:PORT | PATH Specify source ADDR and PORT or a UNIX\n"); 521 printf(" -S, --socket ADDR:PORT | PATH Specify source ADDR and PORT or a UNIX\n");
521 printf(" \t\tsocket PATH to use for the listening socket.\n"); 522 printf(" \t\tsocket PATH to use for the listening socket.\n");
522 printf(" \t\tDefault: %s\n", socket_path); 523 printf(" \t\tDefault: %s\n", socket_path);
@@ -549,6 +550,7 @@ static void parse_opts(int argc, char **argv)
549#ifdef HAVE_SYSTEMD 550#ifdef HAVE_SYSTEMD
550 {"systemd", no_argument, NULL, 's'}, 551 {"systemd", no_argument, NULL, 's'},
551#endif 552#endif
553 {"config-dir", required_argument, NULL, 'C'},
552 {"socket", required_argument, NULL, 'S'}, 554 {"socket", required_argument, NULL, 'S'},
553 {"pidfile", required_argument, NULL, 'P'}, 555 {"pidfile", required_argument, NULL, 'P'},
554 {"exit", no_argument, NULL, 'x'}, 556 {"exit", no_argument, NULL, 'x'},
@@ -560,11 +562,11 @@ static void parse_opts(int argc, char **argv)
560 int c; 562 int c;
561 563
562#ifdef HAVE_SYSTEMD 564#ifdef HAVE_SYSTEMD
563 const char* opts_spec = "hfvVuU:xXsnzl:pS:P:"; 565 const char* opts_spec = "hfvVuU:xXsnzl:pC:S:P:";
564#elif HAVE_UDEV 566#elif HAVE_UDEV
565 const char* opts_spec = "hfvVuU:xXnzl:pS:P:"; 567 const char* opts_spec = "hfvVuU:xXnzl:pC:S:P:";
566#else 568#else
567 const char* opts_spec = "hfvVU:xXnzl:pS:P:"; 569 const char* opts_spec = "hfvVU:xXnzl:pC:S:P:";
568#endif 570#endif
569 571
570 while (1) { 572 while (1) {
@@ -611,6 +613,14 @@ static void parse_opts(int argc, char **argv)
611 case 'z': 613 case 'z':
612 opt_enable_exit = 1; 614 opt_enable_exit = 1;
613 break; 615 break;
616 case 'C':
617 if (!*optarg) {
618 usbmuxd_log(LL_FATAL, "ERROR: --config-dir requires an argument");
619 usage();
620 exit(2);
621 }
622 config_set_config_dir(optarg);
623 break;
614 case 'S': 624 case 'S':
615 if (!*optarg || *optarg == '-') { 625 if (!*optarg || *optarg == '-') {
616 usbmuxd_log(LL_FATAL, "ERROR: --socket requires an argument"); 626 usbmuxd_log(LL_FATAL, "ERROR: --socket requires an argument");
@@ -796,11 +806,12 @@ int main(int argc, char *argv[])
796 806
797#ifdef HAVE_LIBIMOBILEDEVICE 807#ifdef HAVE_LIBIMOBILEDEVICE
798 const char* userprefdir = config_get_config_dir(); 808 const char* userprefdir = config_get_config_dir();
809 usbmuxd_log(LL_NOTICE, "Configuration directory: %s", userprefdir);
799 struct stat fst; 810 struct stat fst;
800 memset(&fst, '\0', sizeof(struct stat)); 811 memset(&fst, '\0', sizeof(struct stat));
801 if (stat(userprefdir, &fst) < 0) { 812 if (stat(userprefdir, &fst) < 0) {
802 if (mkdir(userprefdir, 0775) < 0) { 813 if (mkdir(userprefdir, 0775) < 0) {
803 usbmuxd_log(LL_FATAL, "Failed to create required directory '%s': %s", userprefdir, strerror(errno)); 814 usbmuxd_log(LL_FATAL, "Failed to create configuration directory '%s': %s", userprefdir, strerror(errno));
804 res = -1; 815 res = -1;
805 goto terminate; 816 goto terminate;
806 } 817 }