diff options
| author | 2025-09-15 09:58:01 +0200 | |
|---|---|---|
| committer | 2025-09-15 09:58:01 +0200 | |
| commit | 2efa75a0a9ca73f2a5b6ec71e5ae6cb43cdab580 (patch) | |
| tree | 9948c2e3d6fcf58433dbab033b0b0406b972b75c | |
| parent | 08f4cd9ef0e664128bf221cc17d400cbc2650c7f (diff) | |
| download | usbmuxd-2efa75a0a9ca73f2a5b6ec71e5ae6cb43cdab580.tar.gz usbmuxd-2efa75a0a9ca73f2a5b6ec71e5ae6cb43cdab580.tar.bz2 | |
Allow specifying configuration directory to use
| -rw-r--r-- | src/conf.c | 45 | ||||
| -rw-r--r-- | src/conf.h | 1 | ||||
| -rw-r--r-- | src/main.c | 19 |
3 files changed, 50 insertions, 15 deletions
| @@ -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 | */ |
| 183 | static void config_create_config_dir(void) | 181 | static 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 | |||
| 192 | int 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 | ||
| 192 | static int get_rand(int min, int max) | 203 | static 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(); |
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <plist/plist.h> | 27 | #include <plist/plist.h> |
| 28 | 28 | ||
| 29 | const char *config_get_config_dir(); | 29 | const char *config_get_config_dir(); |
| 30 | int config_set_config_dir(const char* path); | ||
| 30 | 31 | ||
| 31 | void config_get_system_buid(char **system_buid); | 32 | void config_get_system_buid(char **system_buid); |
| 32 | 33 | ||
| @@ -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 | } |
