int main(int argc, char *argv[])
{
        int exit_status;
        struct l_dbus *dbus;
        const char *config_dir;
        char **config_dirs;
        int i;

        for (;;) {
                int opt;

                opt = getopt_long(argc, argv, "Ei:I:p:P:d::vhl:",
                                                        main_options, NULL);
                if (opt < 0)
                        break;

                switch (opt) {
                case 'E':
                        developeropt = true;
                        break;
                case 'i':
                        interfaces = optarg;
                        break;
                case 'I':
                        nointerfaces = optarg;
                        break;
                case 'p':
                        phys = optarg;
                        break;
                case 'P':
                        nophys = optarg;
                        break;
                case 'd':
                        if (optarg)
                                debugopt = optarg;
                        else if (argv[optind] && argv[optind][0] != '-')
                                debugopt = argv[optind++];
                        else
                                debugopt = "*";
                        break;
                case 'l':
                        logger = optarg;
                        break;
                case 'v':
                        printf("%s\n", VERSION);
                        return EXIT_SUCCESS;
                case 'h':
                        usage();
                        return EXIT_SUCCESS;
                default:
                        return EXIT_FAILURE;
                }
        }

        if (argc - optind > 0) {
                fprintf(stderr, "Invalid command line parameters\n");
                return EXIT_FAILURE;
        }

        if (logger && !strcmp(logger, "syslog"))
                l_log_set_syslog();
        else if (logger && !strcmp(logger, "journal"))
                l_log_set_journal();
        else
                l_log_set_stderr();

        l_log_set_ident("iwd");

        if (check_crypto() < 0)
                return EXIT_FAILURE;

        if (!l_main_init())
                return EXIT_FAILURE;

        if (debugopt)
                l_debug_enable(debugopt);

#ifdef HAVE_BACKTRACE
        __iwd_backtrace_init();
#endif

        l_info("Wireless daemon version %s", VERSION);

        config_dir = getenv("CONFIGURATION_DIRECTORY");
        if (!config_dir)
                config_dir = DAEMON_CONFIGDIR;

        l_debug("Using configuration directory %s", config_dir);

        iwd_config = l_settings_new();

        config_dirs = l_strsplit(config_dir, ':');

        for (i = 0; config_dirs[i]; i++) {
                L_AUTO_FREE_VAR(char *, path) =
                        l_strdup_printf("%s/%s", config_dirs[i], "main.conf");

                if (!l_settings_load_from_file(iwd_config, path))
                        continue;

                l_info("Loaded configuration from %s", path);
                break;
        }

        l_strv_free(config_dirs);

        __eapol_set_config(iwd_config);
        __eap_set_config(iwd_config);

        exit_status = EXIT_FAILURE;

        if (!storage_create_dirs())
                goto failed_dirs;

        genl = l_genl_new();
        if (!genl) {
                l_error("Failed to open generic netlink socket");
                goto failed_genl;
        }

        if (getenv("IWD_GENL_DEBUG"))
                l_genl_set_debug(genl, do_debug, "[GENL] ", NULL);

        rtnl = l_netlink_new(NETLINK_ROUTE);
        if (!rtnl) {
                l_error("Failed to open route netlink socket");
                goto failed_rtnl;
        }

        if (getenv("IWD_RTNL_DEBUG"))
                l_netlink_set_debug(rtnl, do_debug, "[RTNL] ", NULL);

        dbus = l_dbus_new_default(L_DBUS_SYSTEM_BUS);
        if (!dbus) {
                l_error("Failed to initialize D-Bus");
                goto failed_dbus;
        }

        l_dbus_set_ready_handler(dbus, dbus_ready, dbus, NULL);
        l_dbus_set_disconnect_handler(dbus, dbus_disconnected, NULL, NULL);
        dbus_init(dbus);

        if (!setup_system_key())
                goto failed_storage;

        exit_status = l_main_run_with_signal(signal_handler, NULL);

        iwd_modules_exit();
        storage_exit();

failed_storage:
        dbus_exit();
        l_dbus_destroy(dbus);

failed_dbus:
        l_netlink_destroy(rtnl);

failed_rtnl:
        l_genl_unref(genl);

failed_genl:
        storage_cleanup_dirs();

failed_dirs:
        l_settings_free(iwd_config);
        l_timeout_remove(timeout);
        l_main_exit();

        return exit_status;
}

Generated by Getz using scpaste at Sat Jan 25 13:01:02 2025. CET. (original)