static ni_bool_t ni_set_global_config_dir(const char *pathname) { if (pathname == NULL) { ni_string_free(&ni_global.config_dir); ni_string_free(&ni_global.config_path); return TRUE; } if (ni_isdir(pathname)) { char *real = NULL; if (*pathname != '/') { /* resolve to absolute path */ if (ni_realpath(pathname, &real) == NULL) return FALSE; pathname = real; } if (ni_string_eq(WICKED_CONFIGDIR, pathname)) pathname = NULL; ni_string_dup(&ni_global.config_dir, pathname); ni_string_free(&real); return TRUE; } errno = ENOTDIR; return FALSE; }
ni_bool_t ni_set_global_config_path(const char *pathname) { char *real = NULL; if (pathname == NULL) { ni_string_free(&ni_global.config_dir); ni_string_free(&ni_global.config_path); return TRUE; } if (*pathname != '/') { /* resolve to absolute path */ if (ni_realpath(pathname, &real) == NULL) return FALSE; pathname = real; } if (ni_isreg(pathname)) { const char *dir; if (!(dir = ni_dirname(pathname))) { errno = ENAMETOOLONG; return FALSE; } if (!ni_set_global_config_dir(dir)) return FALSE; ni_string_dup(&ni_global.config_path, pathname); } else { if (!ni_set_global_config_dir(pathname)) return FALSE; ni_string_free(&ni_global.config_path); } ni_string_free(&real); return TRUE; }
int main(int argc, char **argv) { char *cmd; int c, status = NI_WICKED_RC_USAGE; mtrace(); ni_log_init(); program_name = ni_basename(argv[0]); while ((c = getopt_long(argc, argv, "+", options, NULL)) != EOF) { switch (c) { case OPT_HELP: status = NI_WICKED_ST_OK; default: usage: fprintf(stderr, "wicked [options] cmd path\n" "This command understands the following options\n" " --help\n" " --version\n" " --config filename\n" " Use alternative configuration file.\n" " --log-target target\n" " Set log destination to <stderr|syslog>.\n" " --log-level level\n" " Set log level to <error|warning|notice|info|debug>.\n" " --debug facility\n" " Enable debugging for debug <facility>.\n" " Use '--debug help' for a list of facilities.\n" " --dry-run\n" " Do not change the system in any way.\n" " --root-directory\n" " Search all config files below this directory.\n" " --systemd\n" " Enables behavior required by systemd service\n" "\n" "Supported commands:\n" " ifup [options] <ifname ...>|all\n" " ifdown [options] <ifname ...>|all\n" " ifcheck [options] <ifname ...>|all\n" " ifreload [options] <ifname ...>|all\n" " ifstatus [options] <ifname ...>|all\n" " show [options] <ifname ...>|all\n" #ifdef MODEM " show-xml [--raw] [--modem] <ifname|all>\n" #endif " show-xml [--raw] <ifname|all>\n" " show-config [--raw] [source]\n" " nanny [subcommand]\n" " lease [subcommand]\n" " check [subcommand]\n" " getnames [subcommand]\n" " convert [subcommand]\n" " xpath [options] expr ...\n" " arp [options] <ifname> <IP>\n" ); goto done; case OPT_VERSION: printf("%s %s\n", program_name, PACKAGE_VERSION); status = NI_WICKED_RC_SUCCESS; goto done; case OPT_CONFIGFILE: if (!ni_set_global_config_path(optarg)) { fprintf(stderr, "Unable to set config file '%s': %m\n", optarg); status = NI_WICKED_RC_ERROR; goto done; } break; case OPT_DEBUG: if (!strcmp(optarg, "help")) { printf("Supported debug facilities:\n"); ni_debug_help(); status = NI_WICKED_RC_SUCCESS; goto done; } if (ni_enable_debug(optarg) < 0) { fprintf(stderr, "Bad debug facility \"%s\"\n", optarg); goto usage; } break; case OPT_LOG_TARGET: opt_log_target = optarg; break; case OPT_LOG_LEVEL: if (!ni_log_level_set(optarg)) { fprintf(stderr, "Bad log level \%s\"\n", optarg); goto usage; } break; case OPT_DRYRUN: opt_global_dryrun = 1; break; case OPT_ROOTDIR: if (!ni_realpath(optarg, &opt_global_rootdir)) { fprintf(stderr, "Invalid root-directory path '%s': %m\n", optarg); status = NI_WICKED_RC_ERROR; goto done; } if (ni_string_eq(opt_global_rootdir, "/")) ni_string_free(&opt_global_rootdir); break; case OPT_SYSTEMD: opt_systemd = TRUE; break; } }