From ce2262ee2812600714b670d0373c61176f934049 Mon Sep 17 00:00:00 2001 From: Sichen Zhao <1473996754@qq.com> Date: Thu, 12 Oct 2017 20:16:09 +0800 Subject: Add wpa_supplicant_fork command. Add fork command for wpa supplicant to start a new task. --- freebsd/contrib/wpa/wpa_supplicant/main.c | 65 ++++++++++++++++++++++ libbsd.py | 1 + libbsd_waf.py | 1 + rtemsbsd/include/machine/rtems-bsd-commands.h | 2 + rtemsbsd/include/rtems/netcmds-config.h | 2 + .../rtems/rtems-bsd-shell-wpa_supplicant_fork.c | 36 ++++++++++++ testsuite/media01/test_main.c | 3 +- 7 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant_fork.c diff --git a/freebsd/contrib/wpa/wpa_supplicant/main.c b/freebsd/contrib/wpa/wpa_supplicant/main.c index 40950d2c..23092a63 100644 --- a/freebsd/contrib/wpa/wpa_supplicant/main.c +++ b/freebsd/contrib/wpa/wpa_supplicant/main.c @@ -22,6 +22,8 @@ #ifdef __rtems__ #include #include +#define RTEMS_BSD_PROGRAM_NO_MALLOC_WRAP +#define RTEMS_BSD_PROGRAM_NO_STRDUP_WRAP #include #endif /* __rtems__ */ @@ -174,6 +176,69 @@ int rtems_bsd_command_wpa_supplicant(int argc, char **argv) return exit_code; } + +struct myparams { + int argc; + char ** argv; +}; + +static void +new_wpa_supplicant_task(rtems_task_argument arg) +{ + int argc; + char ** argv; + int i; + + struct myparams *params = (struct myparams *)arg; + argc = params->argc; + argv = params->argv; + + rtems_bsd_command_wpa_supplicant(argc, argv); + + for (i = 0; i < params->argc; i++) { + free(params->argv[i]); + } + free(params->argv); + free(params); + + rtems_task_delete( RTEMS_SELF ); +} + +int rtems_bsd_command_wpa_supplicant_fork(int argc, char **argv) +{ + rtems_status_code sc; + rtems_id id; + int i; + + struct myparams *params = malloc(sizeof(struct myparams)); + if (params == NULL) + return NULL; + + params->argc = argc; + params->argv = malloc((argc + 1) * sizeof(argv[0])); + if (params->argv == NULL) + return NULL; + + for (i = 0; i < argc; i++) { + params->argv[i] = strdup(argv[i]); + if (params->argv[i] == NULL) + return NULL; + } + params->argv[argc] = NULL; + + sc = rtems_task_create( + rtems_build_name('W', 'P', 'A', 'S'), + RTEMS_MAXIMUM_PRIORITY - 1, + 8 * RTEMS_MINIMUM_STACK_SIZE, + RTEMS_DEFAULT_MODES, + RTEMS_FLOATING_POINT, + &id + ); + assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_task_start(id, new_wpa_supplicant_task, params); + assert(sc == RTEMS_SUCCESSFUL); +} #endif /* __rtems__ */ int main(int argc, char *argv[]) diff --git a/libbsd.py b/libbsd.py index 73155fbc..3e3219e8 100644 --- a/libbsd.py +++ b/libbsd.py @@ -4278,6 +4278,7 @@ def usr_sbin_wpa_supplicant(mm): [ 'rtems/rtems-bsd-shell-wpa_supplicant.c', 'rtems/rtems-wpa_supplicant_mutex.c', + 'rtems/rtems-bsd-shell-wpa_supplicant_fork.c', ], mm.generator['source']() ) diff --git a/libbsd_waf.py b/libbsd_waf.py index 42b8fb2c..95b37d63 100644 --- a/libbsd_waf.py +++ b/libbsd_waf.py @@ -2325,6 +2325,7 @@ def build(bld): 'rtemsbsd/rtems/rtems-bsd-shell-vmstat.c', 'rtemsbsd/rtems/rtems-bsd-shell-wlanstats.c', 'rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant.c', + 'rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant_fork.c', 'rtemsbsd/rtems/rtems-bsd-syscall-api.c', 'rtemsbsd/rtems/rtems-kernel-assert.c', 'rtemsbsd/rtems/rtems-kernel-autoconf.c', diff --git a/rtemsbsd/include/machine/rtems-bsd-commands.h b/rtemsbsd/include/machine/rtems-bsd-commands.h index 03a09bc4..32aba44c 100644 --- a/rtemsbsd/include/machine/rtems-bsd-commands.h +++ b/rtemsbsd/include/machine/rtems-bsd-commands.h @@ -64,6 +64,8 @@ int rtems_bsd_command_dhcpcd(int argc, char **argv); int rtems_bsd_command_wpa_supplicant(int argc, char **argv); +int rtems_bsd_command_wpa_supplicant_fork(int argc, char **argv); + int rtems_bsd_command_tcpdump(int argc, char **argv); int rtems_bsd_command_sysctl(int argc, char **argv); diff --git a/rtemsbsd/include/rtems/netcmds-config.h b/rtemsbsd/include/rtems/netcmds-config.h index 046c8597..4af43231 100644 --- a/rtemsbsd/include/rtems/netcmds-config.h +++ b/rtemsbsd/include/rtems/netcmds-config.h @@ -41,6 +41,8 @@ extern rtems_shell_cmd_t rtems_shell_TCPDUMP_Command; extern rtems_shell_cmd_t rtems_shell_WPA_SUPPLICANT_Command; +extern rtems_shell_cmd_t rtems_shell_WPA_SUPPLICANT_FORK_Command; + extern rtems_shell_cmd_t rtems_shell_SYSCTL_Command; extern rtems_shell_cmd_t rtems_shell_VMSTAT_Command; diff --git a/rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant_fork.c b/rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant_fork.c new file mode 100644 index 00000000..046b6112 --- /dev/null +++ b/rtemsbsd/rtems/rtems-bsd-shell-wpa_supplicant_fork.c @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2017 Sichen Zhao. All rights reserved. + * + * + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +rtems_shell_cmd_t rtems_shell_WPA_SUPPLICANT_FORK_Command = { + .name = "wpa_supplicant_fork", + .usage = "wpa_supplicant_fork [args]", + .topic = "net", + .command = rtems_bsd_command_wpa_supplicant_fork +}; diff --git a/testsuite/media01/test_main.c b/testsuite/media01/test_main.c index c687e7fe..f929cba1 100644 --- a/testsuite/media01/test_main.c +++ b/testsuite/media01/test_main.c @@ -210,7 +210,8 @@ early_initialization(void) &rtems_shell_SYSCTL_Command, \ &rtems_shell_IFCONFIG_Command, \ &rtems_shell_VMSTAT_Command, \ - &rtems_shell_WPA_SUPPLICANT_Command + &rtems_shell_WPA_SUPPLICANT_Command, \ + &rtems_shell_WPA_SUPPLICANT_FORK_Command #define CONFIGURE_SHELL_COMMAND_CPUINFO #define CONFIGURE_SHELL_COMMAND_CPUUSE -- cgit v1.2.3