diff options
author | Christian Mauderer <Christian.Mauderer@embedded-brains.de> | 2016-07-15 11:39:48 +0200 |
---|---|---|
committer | Christian Mauderer <Christian.Mauderer@embedded-brains.de> | 2016-08-02 10:21:38 +0200 |
commit | 3d9134086847bc755fd9dcc7f6149f8871d6a6ed (patch) | |
tree | e7b1f68cfd9f6448511aedf3eac31b45b24f82ed /rtemsbsd | |
parent | testsuite/syscalls01: Split out program01 part. (diff) | |
download | rtems-libbsd-3d9134086847bc755fd9dcc7f6149f8871d6a6ed.tar.bz2 |
rtemsbsd: Add call to program with a data restore
This adds the rtems_bsd_program_call_main_width_data_restore function.
Diffstat (limited to 'rtemsbsd')
-rw-r--r-- | rtemsbsd/include/machine/rtems-bsd-program.h | 5 | ||||
-rw-r--r-- | rtemsbsd/rtems/rtems-kernel-program.c | 23 |
2 files changed, 28 insertions, 0 deletions
diff --git a/rtemsbsd/include/machine/rtems-bsd-program.h b/rtemsbsd/include/machine/rtems-bsd-program.h index 82830f51..4605017f 100644 --- a/rtemsbsd/include/machine/rtems-bsd-program.h +++ b/rtemsbsd/include/machine/rtems-bsd-program.h @@ -53,6 +53,11 @@ int rtems_bsd_program_call_main(const char *name, int (*main)(int, char **), int argc, char **argv); +int +rtems_bsd_program_call_main_with_data_restore(const char *name, + int (*main)(int, char **), int argc, char **argv, + const void *data_buf, const size_t data_size); + void rtems_bsd_program_exit(int exit_code) __dead2; diff --git a/rtemsbsd/rtems/rtems-kernel-program.c b/rtemsbsd/rtems/rtems-kernel-program.c index a71d5496..0355c585 100644 --- a/rtemsbsd/rtems/rtems-kernel-program.c +++ b/rtemsbsd/rtems/rtems-kernel-program.c @@ -200,6 +200,29 @@ rtems_bsd_program_call_main(const char *name, int (*main)(int, char **), return exit_code; } +int +rtems_bsd_program_call_main_with_data_restore(const char *name, + int (*main)(int, char **), int argc, char **argv, + const void *data_buf, const size_t data_size) +{ + int exit_code = EXIT_FAILURE; + void *savebuf; + + savebuf = malloc(data_size, M_TEMP, 0); + if(savebuf == NULL) { + errno = ENOMEM; + exit_code = EXIT_FAILURE; + } else { + memcpy(savebuf, data_buf, data_size); + exit_code = rtems_bsd_program_call_main(name, main, argc, + argv); + memcpy(data_buf, savebuf, data_size); + free(savebuf, M_TEMP); + } + + return exit_code; +} + static struct mtx program_mtx; MTX_SYSINIT(rtems_bsd_program, &program_mtx, "BSD program", MTX_DEF); |