diff options
author | Sichen Zhao <1473996754@qq.com> | 2017-10-12 20:16:09 +0800 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2017-11-10 13:33:03 +0100 |
commit | ce2262ee2812600714b670d0373c61176f934049 (patch) | |
tree | 7dc6c4e4212f794b4619267773caefd83551979b /freebsd | |
parent | Add wpa_supplicant command in test suite. (diff) | |
download | rtems-libbsd-ce2262ee2812600714b670d0373c61176f934049.tar.bz2 |
Add wpa_supplicant_fork command.
Add fork command for wpa supplicant to start a new task.
Diffstat (limited to 'freebsd')
-rw-r--r-- | freebsd/contrib/wpa/wpa_supplicant/main.c | 65 |
1 files changed, 65 insertions, 0 deletions
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 <assert.h> #include <sys/mutex.h> +#define RTEMS_BSD_PROGRAM_NO_MALLOC_WRAP +#define RTEMS_BSD_PROGRAM_NO_STRDUP_WRAP #include <machine/rtems-bsd-program.h> #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[]) |