OSDN Git Service

am 8084af89: Merge "nl80211: Register read_sta_data() handler for station only builds...
[android-x86/external-wpa_supplicant_8.git] / wpa_supplicant / main.c
index c124ca2..19f7ce6 100644 (file)
@@ -61,6 +61,10 @@ static void usage(void)
 #ifdef CONFIG_DEBUG_SYSLOG
        printf("  -s = log output to syslog instead of stdout\n");
 #endif /* CONFIG_DEBUG_SYSLOG */
+#ifdef CONFIG_DEBUG_LINUX_TRACING
+       printf("  -T = record to Linux tracing in addition to logging\n");
+       printf("       (records all messages regardless of debug verbosity)\n");
+#endif /* CONFIG_DEBUG_LINUX_TRACING */
        printf("  -t = include timestamp in debug messages\n"
               "  -h = show this help text\n"
               "  -L = show license (BSD)\n"
@@ -97,20 +101,31 @@ static void license(void)
 }
 
 
-static void wpa_supplicant_fd_workaround(void)
+static void wpa_supplicant_fd_workaround(int start)
 {
 #ifdef __linux__
-       int s, i;
+       static int fd[3] = { -1, -1, -1 };
+       int i;
        /* When started from pcmcia-cs scripts, wpa_supplicant might start with
         * fd 0, 1, and 2 closed. This will cause some issues because many
         * places in wpa_supplicant are still printing out to stdout. As a
         * workaround, make sure that fd's 0, 1, and 2 are not used for other
         * sockets. */
-       for (i = 0; i < 3; i++) {
-               s = open("/dev/null", O_RDWR);
-               if (s > 2) {
-                       close(s);
-                       break;
+       if (start) {
+               for (i = 0; i < 3; i++) {
+                       fd[i] = open("/dev/null", O_RDWR);
+                       if (fd[i] > 2) {
+                               close(fd[i]);
+                               fd[i] = -1;
+                               break;
+                       }
+               }
+       } else {
+               for (i = 0; i < 3; i++) {
+                       if (fd[i] >= 0) {
+                               close(fd[i]);
+                               fd[i] = -1;
+                       }
                }
        }
 #endif /* __linux__ */
@@ -136,10 +151,11 @@ int main(int argc, char *argv[])
                return -1;
        iface_count = 1;
 
-       wpa_supplicant_fd_workaround();
+       wpa_supplicant_fd_workaround(1);
 
        for (;;) {
-               c = getopt(argc, argv, "b:Bc:C:D:de:f:g:hi:KLNo:O:p:P:qstuvW");
+               c = getopt(argc, argv,
+                          "b:Bc:C:D:de:f:g:hi:KLNo:O:p:P:qsTtuvW");
                if (c < 0)
                        break;
                switch (c) {
@@ -214,6 +230,11 @@ int main(int argc, char *argv[])
                        params.wpa_debug_syslog++;
                        break;
 #endif /* CONFIG_DEBUG_SYSLOG */
+#ifdef CONFIG_DEBUG_LINUX_TRACING
+               case 'T':
+                       params.wpa_debug_tracing++;
+                       break;
+#endif /* CONFIG_DEBUG_LINUX_TRACING */
                case 't':
                        params.wpa_debug_timestamp++;
                        break;
@@ -231,8 +252,8 @@ int main(int argc, char *argv[])
                        break;
                case 'N':
                        iface_count++;
-                       iface = os_realloc(ifaces, iface_count *
-                                          sizeof(struct wpa_interface));
+                       iface = os_realloc_array(ifaces, iface_count,
+                                                sizeof(struct wpa_interface));
                        if (iface == NULL)
                                goto out;
                        ifaces = iface;
@@ -252,6 +273,9 @@ int main(int argc, char *argv[])
                wpa_printf(MSG_ERROR, "Failed to initialize wpa_supplicant");
                exitcode = -1;
                goto out;
+       } else {
+               wpa_printf(MSG_INFO, "Successfully initialized "
+                          "wpa_supplicant");
        }
 
        for (i = 0; exitcode == 0 && i < iface_count; i++) {
@@ -275,6 +299,7 @@ int main(int argc, char *argv[])
        wpa_supplicant_deinit(global);
 
 out:
+       wpa_supplicant_fd_workaround(0);
        os_free(ifaces);
        os_free(params.pid_file);