+ int do_debug = 0, do_nofork = 0, do_nolog = 0;
+ int do_nopid = 0, do_runasroot = 0, do_version = 0;
+ struct option longopts[] =
+ {
+ { "config", required_argument, NULL, 'c' },
+ { "debug", no_argument, &do_debug, 1 },
+ { "nofork", no_argument, &do_nofork, 1 },
+ { "nolog", no_argument, &do_nolog, 1 },
+ { "nopid", no_argument, &do_nopid, 1 },
+ { "runasroot", no_argument, &do_runasroot, 1 },
+ { "version", no_argument, &do_version, 1 },
+ { 0, 0, 0, 0 }
+ };
+
+ char** argv = ServerInstance->Config->cmdline.argv;
+ int ret;
+ while ((ret = getopt_long(ServerInstance->Config->cmdline.argc, argv, ":c:", longopts, NULL)) != -1)
+ {
+ switch (ret)
+ {
+ case 0:
+ // A long option was specified.
+ break;
+
+ case 'c':
+ // The -c option was specified.
+ ServerInstance->ConfigFileName = ExpandPath(optarg);
+ break;
+
+ default:
+ // An unknown option was specified.
+ std::cout << con_red << "Error:" << con_reset << " unknown option '" << argv[optind] << "'." << std::endl
+ << con_bright << "Usage: " << con_reset << argv[0] << " [--config <file>] [--debug] [--nofork] [--nolog]" << std::endl
+ << std::string(strlen(argv[0]) + 8, ' ') << "[--nopid] [--runasroot] [--version]" << std::endl;
+ ServerInstance->Exit(EXIT_STATUS_ARGV);
+ break;
+ }
+ }
+
+ if (do_version)
+ {
+ std::cout << INSPIRCD_VERSION << std::endl;
+ ServerInstance->Exit(EXIT_STATUS_NOERROR);
+ }
+
+ // Store the relevant parsed arguments
+ ServerInstance->Config->cmdline.forcedebug = !!do_debug;
+ ServerInstance->Config->cmdline.nofork = !!do_nofork;
+ ServerInstance->Config->cmdline.runasroot = !!do_runasroot;
+ ServerInstance->Config->cmdline.writelog = !do_nolog;
+ ServerInstance->Config->cmdline.writepid = !do_nopid;