static int log_level_parser(const char *s) { int level = loglevel_str2num(s); if (level < 0) { sd_err("Invalid log level '%s'", s); sdlog_help(); return -1; } log_level = level; return 0; }
int main(int argc, char **argv) { int ch, longindex, ret, port = SD_LISTEN_PORT, io_port = SD_LISTEN_PORT; int log_level = SDOG_INFO, nr_vnodes = SD_DEFAULT_VNODES; const char *dirp = DEFAULT_OBJECT_DIR, *short_options; char *dir, *p, *pid_file = NULL, *bindaddr = NULL, path[PATH_MAX], *argp = NULL, *logdir = NULL; bool is_daemon = true, to_stdout = false, explicit_addr = false; int64_t zone = -1; struct cluster_driver *cdrv; struct option *long_options; const char *log_format = "server", *http_address = NULL; static struct logger_user_info sheep_info; install_crash_handler(crash_handler); signal(SIGPIPE, SIG_IGN); install_sighandler(SIGHUP, sighup_handler, false); long_options = build_long_options(sheep_options); short_options = build_short_options(sheep_options); while ((ch = getopt_long(argc, argv, short_options, long_options, &longindex)) >= 0) { switch (ch) { case 'p': port = strtol(optarg, &p, 10); if (optarg == p || port < 1 || UINT16_MAX < port || *p != '\0') { sd_err("Invalid port number '%s'", optarg); exit(1); } break; case 'P': pid_file = optarg; break; case 'r': http_address = optarg; break; case 'f': is_daemon = false; break; case 'l': log_level = strtol(optarg, &p, 10); if (optarg == p || log_level < SDOG_EMERG || SDOG_DEBUG < log_level || *p != '\0') { sd_err("Invalid log level '%s'", optarg); sdlog_help(); exit(1); } break; case 'L': logdir = realpath(optarg, NULL); if (!logdir) { sd_err("%m"); exit(1); } break; case 'n': sys->nosync = true; break; case 'y': if (!str_to_addr(optarg, sys->this_node.nid.addr)) { sd_err("Invalid address: '%s'", optarg); exit(1); } explicit_addr = true; break; case 'd': /* removed soon. use loglevel instead */ log_level = SDOG_DEBUG; break; case 'D': sys->backend_dio = true; break; case 'g': /* same as '-v 0' */ //printf("wyh\n"); nr_vnodes = 0; //nr_vnodes = 5; break; case 'o': to_stdout = true; break; case 'z': zone = strtol(optarg, &p, 10); if (optarg == p || zone < 0 || UINT32_MAX < zone || *p != '\0') { sd_err("Invalid zone id '%s': must be " "an integer between 0 and %u", optarg, UINT32_MAX); exit(1); } sys->this_node.zone = zone; break; case 'u': sys->upgrade = true; break; case 'c': sys->cdrv = find_cdrv(optarg); if (!sys->cdrv) { sd_err("Invalid cluster driver '%s'", optarg); fprintf(stderr, "Supported drivers:"); FOR_EACH_CLUSTER_DRIVER(cdrv) { fprintf(stderr, " %s", cdrv->name); } fprintf(stderr, "\n"); exit(1); } sys->cdrv_option = get_cdrv_option(sys->cdrv, optarg); break; case 'w': object_cache_set(optarg); break; case 'i': parse_arg(optarg, ",", init_io_arg); if (!str_to_addr(io_addr, sys->this_node.nid.io_addr)) { sd_err("Bad addr: '%s'", io_addr); exit(1); } if (io_pt) if (sscanf(io_pt, "%u", &io_port) != 1) { sd_err("Bad port '%s'", io_pt); exit(1); } sys->this_node.nid.io_port = io_port; break; case 'j': uatomic_set_true(&sys->use_journal); parse_arg(optarg, ",", init_journal_arg); if (!jsize) { sd_err("you must specify size for journal"); exit(1); } break; case 'b': if (!inetaddr_is_valid(optarg)) exit(1); bindaddr = optarg; break; case 'h': usage(0); break; case 'v': fprintf(stdout, "Sheepdog daemon version %s\n", PACKAGE_VERSION); exit(0); break; case 'F': log_format = optarg; break; default: usage(1); break; } }