main.c
Go to the documentation of this file.
00001 /*
00002  * WPA Supplicant / main() function for UNIX like OSes and MinGW
00003  * Copyright (c) 2003-2007, Jouni Malinen <j@w1.fi>
00004  *
00005  * This program is free software; you can redistribute it and/or modify
00006  * it under the terms of the GNU General Public License version 2 as
00007  * published by the Free Software Foundation.
00008  *
00009  * Alternatively, this software may be distributed under the terms of BSD
00010  * license.
00011  *
00012  * See README and COPYING for more details.
00013  */
00014 
00015 #include "includes.h"
00016 #ifdef __linux__
00017 #include <fcntl.h>
00018 #endif /* __linux__ */
00019 
00020 #include "common.h"
00021 #include "wpa_supplicant_i.h"
00022 #include "driver_i.h"
00023 
00024 extern struct wpa_driver_ops *wpa_drivers[];
00025 
00026 
00027 static void usage(void)
00028 {
00029         int i;
00030         printf("%s\n\n%s\n"
00031                "usage:\n"
00032                "  wpa_supplicant [-BddhKLqqstuvW] [-P<pid file>] "
00033                "[-g<global ctrl>] \\\n"
00034                "        -i<ifname> -c<config file> [-C<ctrl>] [-D<driver>] "
00035                "[-p<driver_param>] \\\n"
00036                "        [-b<br_ifname>] [-f<debug file>] \\\n"
00037                "        [-o<override driver>] [-O<override ctrl>] \\\n"
00038                "        [-N -i<ifname> -c<conf> [-C<ctrl>] "
00039                "[-D<driver>] \\\n"
00040                "        [-p<driver_param>] [-b<br_ifname>] ...]\n"
00041                "\n"
00042                "drivers:\n",
00043                wpa_supplicant_version, wpa_supplicant_license);
00044 
00045         for (i = 0; wpa_drivers[i]; i++) {
00046                 printf("  %s = %s\n",
00047                        wpa_drivers[i]->name,
00048                        wpa_drivers[i]->desc);
00049         }
00050 
00051 #ifndef CONFIG_NO_STDOUT_DEBUG
00052         printf("options:\n"
00053                "  -b = optional bridge interface name\n"
00054                "  -B = run daemon in the background\n"
00055                "  -c = Configuration file\n"
00056                "  -C = ctrl_interface parameter (only used if -c is not)\n"
00057                "  -i = interface name\n"
00058                "  -d = increase debugging verbosity (-dd even more)\n"
00059                "  -D = driver name (can be multiple drivers: nl80211,wext)\n");
00060 #ifdef CONFIG_DEBUG_FILE
00061         printf("  -f = log output to debug file instead of stdout\n");
00062 #endif /* CONFIG_DEBUG_FILE */
00063         printf("  -g = global ctrl_interface\n"
00064                "  -K = include keys (passwords, etc.) in debug output\n");
00065 #ifdef CONFIG_DEBUG_SYSLOG
00066         printf("  -s = log output to syslog instead of stdout\n");
00067 #endif /* CONFIG_DEBUG_SYSLOG */
00068         printf("  -t = include timestamp in debug messages\n"
00069                "  -h = show this help text\n"
00070                "  -L = show license (GPL and BSD)\n"
00071                "  -o = override driver parameter for new interfaces\n"
00072                "  -O = override ctrl_interface parameter for new interfaces\n"
00073                "  -p = driver parameters\n"
00074                "  -P = PID file\n"
00075                "  -q = decrease debugging verbosity (-qq even less)\n");
00076 #ifdef CONFIG_DBUS
00077         printf("  -u = enable DBus control interface\n");
00078 #endif /* CONFIG_DBUS */
00079         printf("  -v = show version\n"
00080                "  -W = wait for a control interface monitor before starting\n"
00081                "  -N = start describing new interface\n");
00082 
00083         printf("example:\n"
00084                "  wpa_supplicant -D%s -iwlan0 -c/etc/wpa_supplicant.conf\n",
00085                wpa_drivers[i] ? wpa_drivers[i]->name : "wext");
00086 #endif /* CONFIG_NO_STDOUT_DEBUG */
00087 }
00088 
00089 
00090 static void license(void)
00091 {
00092 #ifndef CONFIG_NO_STDOUT_DEBUG
00093         printf("%s\n\n%s%s%s%s%s\n",
00094                wpa_supplicant_version,
00095                wpa_supplicant_full_license1,
00096                wpa_supplicant_full_license2,
00097                wpa_supplicant_full_license3,
00098                wpa_supplicant_full_license4,
00099                wpa_supplicant_full_license5);
00100 #endif /* CONFIG_NO_STDOUT_DEBUG */
00101 }
00102 
00103 
00104 static void wpa_supplicant_fd_workaround(void)
00105 {
00106 #ifdef __linux__
00107         int s, i;
00108         /* When started from pcmcia-cs scripts, wpa_supplicant might start with
00109          * fd 0, 1, and 2 closed. This will cause some issues because many
00110          * places in wpa_supplicant are still printing out to stdout. As a
00111          * workaround, make sure that fd's 0, 1, and 2 are not used for other
00112          * sockets. */
00113         for (i = 0; i < 3; i++) {
00114                 s = open("/dev/null", O_RDWR);
00115                 if (s > 2) {
00116                         close(s);
00117                         break;
00118                 }
00119         }
00120 #endif /* __linux__ */
00121 }
00122 
00123 
00124 int main(int argc, char *argv[])
00125 {
00126         int c, i;
00127         struct wpa_interface *ifaces, *iface;
00128         int iface_count, exitcode = -1;
00129         struct wpa_params params;
00130         struct wpa_global *global;
00131 
00132         setlinebuf(stdout);
00133 
00134         if (os_program_init())
00135                 return -1;
00136 
00137         os_memset(&params, 0, sizeof(params));
00138         params.wpa_debug_level = MSG_INFO;
00139 
00140         iface = ifaces = os_zalloc(sizeof(struct wpa_interface));
00141         if (ifaces == NULL)
00142                 return -1;
00143         iface_count = 1;
00144 
00145         wpa_supplicant_fd_workaround();
00146 
00147         for (;;) {
00148                 c = getopt(argc, argv, "b:Bc:C:D:df:g:hi:KLNo:O:p:P:qstuvW");
00149                 if (c < 0)
00150                         break;
00151                 switch (c) {
00152                 case 'b':
00153                         iface->bridge_ifname = optarg;
00154                         break;
00155                 case 'B':
00156                         params.daemonize++;
00157                         break;
00158                 case 'c':
00159                         iface->confname = optarg;
00160                         break;
00161                 case 'C':
00162                         iface->ctrl_interface = optarg;
00163                         break;
00164                 case 'D':
00165                         iface->driver = optarg;
00166                         break;
00167                 case 'd':
00168 #ifdef CONFIG_NO_STDOUT_DEBUG
00169                         printf("Debugging disabled with "
00170                                "CONFIG_NO_STDOUT_DEBUG=y build time "
00171                                "option.\n");
00172                         goto out;
00173 #else /* CONFIG_NO_STDOUT_DEBUG */
00174                         params.wpa_debug_level--;
00175                         break;
00176 #endif /* CONFIG_NO_STDOUT_DEBUG */
00177 #ifdef CONFIG_DEBUG_FILE
00178                 case 'f':
00179                         params.wpa_debug_file_path = optarg;
00180                         break;
00181 #endif /* CONFIG_DEBUG_FILE */
00182                 case 'g':
00183                         params.ctrl_interface = optarg;
00184                         break;
00185                 case 'h':
00186                         usage();
00187                         exitcode = 0;
00188                         goto out;
00189                 case 'i':
00190                         iface->ifname = optarg;
00191                         break;
00192                 case 'K':
00193                         params.wpa_debug_show_keys++;
00194                         break;
00195                 case 'L':
00196                         license();
00197                         exitcode = 0;
00198                         goto out;
00199                 case 'o':
00200                         params.override_driver = optarg;
00201                         break;
00202                 case 'O':
00203                         params.override_ctrl_interface = optarg;
00204                         break;
00205                 case 'p':
00206                         iface->driver_param = optarg;
00207                         break;
00208                 case 'P':
00209                         os_free(params.pid_file);
00210                         params.pid_file = os_rel2abs_path(optarg);
00211                         break;
00212                 case 'q':
00213                         params.wpa_debug_level++;
00214                         break;
00215 #ifdef CONFIG_DEBUG_SYSLOG
00216                 case 's':
00217                         params.wpa_debug_syslog++;
00218                         break;
00219 #endif /* CONFIG_DEBUG_SYSLOG */
00220                 case 't':
00221                         params.wpa_debug_timestamp++;
00222                         break;
00223 #ifdef CONFIG_DBUS
00224                 case 'u':
00225                         params.dbus_ctrl_interface = 1;
00226                         break;
00227 #endif /* CONFIG_DBUS */
00228                 case 'v':
00229                         printf("%s\n", wpa_supplicant_version);
00230                         exitcode = 0;
00231                         goto out;
00232                 case 'W':
00233                         params.wait_for_monitor++;
00234                         break;
00235                 case 'N':
00236                         iface_count++;
00237                         iface = os_realloc(ifaces, iface_count *
00238                                            sizeof(struct wpa_interface));
00239                         if (iface == NULL)
00240                                 goto out;
00241                         ifaces = iface;
00242                         iface = &ifaces[iface_count - 1]; 
00243                         os_memset(iface, 0, sizeof(*iface));
00244                         break;
00245                 default:
00246                         usage();
00247                         exitcode = 0;
00248                         goto out;
00249                 }
00250         }
00251 
00252         exitcode = 0;
00253         global = wpa_supplicant_init(&params);
00254         if (global == NULL) {
00255                 wpa_printf(MSG_ERROR, "Failed to initialize wpa_supplicant");
00256                 exitcode = -1;
00257                 goto out;
00258         }
00259 
00260         for (i = 0; exitcode == 0 && i < iface_count; i++) {
00261                 if ((ifaces[i].confname == NULL &&
00262                      ifaces[i].ctrl_interface == NULL) ||
00263                     ifaces[i].ifname == NULL) {
00264                         if (iface_count == 1 && (params.ctrl_interface ||
00265                                                  params.dbus_ctrl_interface))
00266                                 break;
00267                         usage();
00268                         exitcode = -1;
00269                         break;
00270                 }
00271                 if (wpa_supplicant_add_iface(global, &ifaces[i]) == NULL)
00272                         exitcode = -1;
00273         }
00274 
00275         if (exitcode == 0)
00276                 exitcode = wpa_supplicant_run(global);
00277 
00278         wpa_supplicant_deinit(global);
00279 
00280 out:
00281         os_free(ifaces);
00282         os_free(params.pid_file);
00283 
00284         os_program_deinit();
00285 
00286         return exitcode;
00287 }


wpa_supplicant
Author(s): Package maintained by Blaise Gassend
autogenerated on Thu Apr 24 2014 15:34:35