From: Alexey K. <ale...@or...> - 2013-06-26 13:13:21
|
There are new functions: tst_module_exists(), tst_module_load() and tst_module_unload(). These functions help to load and unload kernel modules in the tests. Signed-off-by: Alexey Kodanev <ale...@or...> --- include/tst_module.h | 68 +++++++++++++++++++++++++++++++ lib/tst_module.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 0 deletions(-) create mode 100644 include/tst_module.h create mode 100644 lib/tst_module.c diff --git a/include/tst_module.h b/include/tst_module.h new file mode 100644 index 0000000..90d7cf1 --- /dev/null +++ b/include/tst_module.h @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Alexey Kodanev <ale...@or...> + * + * These functions help to load and unload kernel modules in the tests. + * + * tst_module_load and tst_module_unload functions already include + * tst_module_exists function, which is checking the following possible + * module's locations: + * + * 1. Current working directory + * + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) + * + * 3. If tmp directory created, it'll look at the test start working directory + * + */ + +#ifndef TST_MODULE +#define TST_MODULE + +/* + * Check module existence. + * + * @mod_path: if it is not NULL, then tst_module_exists places the found + * module's path into the location pointed to by *mod_path. It must be freed + * with free() when it is no longer needed. + * + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. + */ +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, + char **mod_path); + +/* + * Load a module using insmod program. + * + * @argv: an array of pointers to null-terminated strings that represent the + * additional parameters to the module. If it is NULL, it will be ignored. + * + * In case of insmod failure, test will call cleanup_fn and exit with TBROK + * return value. + */ +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]); + +/* + * Unload a module using rmmod program. In case of failure, test will call + * cleanup_fn and exit with TBROK return value. + */ +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); + +#endif /* TST_MODULE */ diff --git a/lib/tst_module.c b/lib/tst_module.c new file mode 100644 index 0000000..20a73bf --- /dev/null +++ b/lib/tst_module.c @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Alexey Kodanev <ale...@or...> + * + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <stdarg.h> + +#include "test.h" +#include "safe_macros.h" +#include "ltp_priv.h" +#include "tst_module.h" + +void tst_module_exists(void (cleanup_fn)(void), + const char *mod_name, char **mod_path) +{ + /* check current working directory */ + if (access(mod_name, F_OK) == 0) { + if (mod_path != NULL) + *mod_path = strdup(mod_name); + return; + } + char *buf = NULL; + int err = -1; + /* check LTP installation path */ + const char *ltproot = getenv("LTPROOT"); + if (ltproot != NULL) { + if (asprintf(&buf, "%s/testcases/bin/%s", + ltproot, mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + /* check start working directory */ + if (err == -1 && tst_tmpdir_created()) { + if (buf != NULL) + free(buf); + if (asprintf(&buf, "%s/%s", tst_get_startwd(), + mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + + if (err != 0) { + if (buf != NULL) + free(buf); + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", + mod_name); + } + + if (mod_path != NULL) + *mod_path = buf; + else + free(buf); +} + +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + + /* add command name, module name and NULL to array */ + static int offset = 2; + int size = offset; + if (argv != NULL) + size += ARRAY_SIZE(argv); + char *mod_argv[size + 1]; + mod_argv[size] = NULL; + mod_argv[0] = "insmod"; + mod_argv[1] = strdupa(mod_path); + free(mod_path); + int i; + for (i = offset; i < size; ++i) + mod_argv[i] = argv[i - offset]; + SAFE_EXECVP(cleanup_fn, mod_argv); +} + +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + char *const argv[] = { "rmmod", strdupa(mod_path), NULL }; + free(mod_path); + SAFE_EXECVP(cleanup_fn, argv); +} -- 1.7.1 |
From: Alexey K. <ale...@or...> - 2013-06-26 16:37:33
|
There are new functions: tst_module_exists(), tst_module_load() and tst_module_unload(). These functions help to load and unload kernel modules in the tests. Signed-off-by: Alexey Kodanev <ale...@or...> --- include/tst_module.h | 69 ++++++++++++++++++++++++++++++++ lib/tst_module.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 0 deletions(-) create mode 100644 include/tst_module.h create mode 100644 lib/tst_module.c diff --git a/include/tst_module.h b/include/tst_module.h new file mode 100644 index 0000000..57aa5ca --- /dev/null +++ b/include/tst_module.h @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Alexey Kodanev <ale...@or...> + * + * These functions help to load and unload kernel modules in the tests. + * + * tst_module_load and tst_module_unload functions already include + * tst_module_exists function, which is checking the following possible + * module's locations: + * + * 1. Current working directory + * + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) + * + * 3. If tmp directory created, it'll look at the test start working directory + * + */ + +#ifndef TST_MODULE +#define TST_MODULE + +/* + * Check module existence. + * + * @mod_path: if it is not NULL, then tst_module_exists places the found + * module's path into the location pointed to by *mod_path. It must be freed + * with free() when it is no longer needed. + * + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. + */ +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, + char **mod_path); + +/* + * Load a module using insmod program. + * + * @argv: an array of pointers to null-terminated strings that represent the + * additional parameters to the module. The array of pointers should be + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. + * + * In case of insmod failure, test will call cleanup_fn and exit with TBROK + * return value. + */ +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]); + +/* + * Unload a module using rmmod program. In case of failure, test will call + * cleanup_fn and exit with TBROK return value. + */ +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); + +#endif /* TST_MODULE */ diff --git a/lib/tst_module.c b/lib/tst_module.c new file mode 100644 index 0000000..2538777 --- /dev/null +++ b/lib/tst_module.c @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Alexey Kodanev <ale...@or...> + * + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "test.h" +#include "ltp_priv.h" +#include "tst_module.h" + +void tst_module_exists(void (cleanup_fn)(void), + const char *mod_name, char **mod_path) +{ + /* check current working directory */ + if (access(mod_name, F_OK) == 0) { + if (mod_path != NULL) + *mod_path = strdup(mod_name); + return; + } + char *buf = NULL; + int err = -1; + /* check LTP installation path */ + const char *ltproot = getenv("LTPROOT"); + if (ltproot != NULL) { + if (asprintf(&buf, "%s/testcases/bin/%s", + ltproot, mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + /* check start working directory */ + if (err == -1 && tst_tmpdir_created()) { + free(buf); + if (asprintf(&buf, "%s/%s", tst_get_startwd(), + mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + + if (err != 0) { + free(buf); + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", + mod_name); + } + + if (mod_path != NULL) + *mod_path = buf; + else + free(buf); +} + +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + + static int offset = 2; /* command name & module path */ + int size = 0; + while (argv && argv[size]) + ++size; + size += offset; + char *mod_argv[size + 1]; /* + NULL in the end */ + mod_argv[size] = NULL; + mod_argv[0] = "insmod"; + mod_argv[1] = mod_path; + + int i; + for (i = offset; i < size; ++i) + mod_argv[i] = argv[i - offset]; + + tst_run_cmd(cleanup_fn, mod_argv); + free(mod_path); +} + +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + char *const argv[] = { "rmmod", mod_path, NULL }; + tst_run_cmd(cleanup_fn, argv); + free(mod_path); +} -- 1.7.1 |
From: <ch...@su...> - 2013-06-27 14:20:59
|
Hi! > +/* > + * Load a module using insmod program. > + * > + * @argv: an array of pointers to null-terminated strings that represent the > + * additional parameters to the module. The array of pointers should be > + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. Again should vs must. > + * In case of insmod failure, test will call cleanup_fn and exit with TBROK > + * return value. > + */ > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]); > + > +/* > + * Unload a module using rmmod program. In case of failure, test will call > + * cleanup_fn and exit with TBROK return value. > + */ > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); > + > +#endif /* TST_MODULE */ > diff --git a/lib/tst_module.c b/lib/tst_module.c > new file mode 100644 > index 0000000..2538777 > --- /dev/null > +++ b/lib/tst_module.c > @@ -0,0 +1,108 @@ > +/* > + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: Alexey Kodanev <ale...@or...> > + * > + */ > + > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <stdlib.h> > +#include <unistd.h> > + > +#include "test.h" > +#include "ltp_priv.h" > +#include "tst_module.h" > + > +void tst_module_exists(void (cleanup_fn)(void), > + const char *mod_name, char **mod_path) > +{ > + /* check current working directory */ > + if (access(mod_name, F_OK) == 0) { > + if (mod_path != NULL) > + *mod_path = strdup(mod_name); > + return; > + } > + char *buf = NULL; > + int err = -1; > + /* check LTP installation path */ > + const char *ltproot = getenv("LTPROOT"); > + if (ltproot != NULL) { > + if (asprintf(&buf, "%s/testcases/bin/%s", > + ltproot, mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + /* check start working directory */ > + if (err == -1 && tst_tmpdir_created()) { > + free(buf); > + if (asprintf(&buf, "%s/%s", tst_get_startwd(), > + mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + > + if (err != 0) { > + free(buf); > + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", > + mod_name); > + } > + > + if (mod_path != NULL) > + *mod_path = buf; > + else > + free(buf); > +} So you expect that the '.ko' suffix is part of the module name. It should be written in the comment in the header. Because at least I expect the module name to be the name that is returned by lsmod. > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + > + static int offset = 2; /* command name & module path */ > + int size = 0; > + while (argv && argv[size]) > + ++size; > + size += offset; > + char *mod_argv[size + 1]; /* + NULL in the end */ > + mod_argv[size] = NULL; > + mod_argv[0] = "insmod"; > + mod_argv[1] = mod_path; > + > + int i; > + for (i = offset; i < size; ++i) > + mod_argv[i] = argv[i - offset]; > + > + tst_run_cmd(cleanup_fn, mod_argv); > + free(mod_path); > +} > + > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + char *const argv[] = { "rmmod", mod_path, NULL }; Hmm, man rmmod suggest that it takes module name (not module path) as parameter i.e. the string without the path and the '.ko' suffix. Does it work with module path too? > + tst_run_cmd(cleanup_fn, argv); > + free(mod_path); > +} The rest is fine. -- Cyril Hrubis ch...@su... |
From: <ale...@or...> - 2013-06-27 14:30:10
|
On 06/27/2013 06:22 PM, ch...@su... wrote: > Hi! >> +/* >> + * Load a module using insmod program. >> + * >> + * @argv: an array of pointers to null-terminated strings that represent the >> + * additional parameters to the module. The array of pointers should be >> + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. > Again should vs must. > OK >> + >> + if (err != 0) { >> + free(buf); >> + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", >> + mod_name); >> + } >> + >> + if (mod_path != NULL) >> + *mod_path = buf; >> + else >> + free(buf); >> +} > So you expect that the '.ko' suffix is part of the module name. It > should be written in the comment in the header. Because at least I > expect the module name to be the name that is returned by lsmod. > I will change module name to module's file name in the comments, is it OK? >> +void tst_module_load(void (cleanup_fn)(void), >> + const char *mod_name, char *const argv[]) >> +{ >> + char *mod_path = NULL; >> + tst_module_exists(cleanup_fn, mod_name,&mod_path); >> + >> + static int offset = 2; /* command name& module path */ >> + int size = 0; >> + while (argv&& argv[size]) >> + ++size; >> + size += offset; >> + char *mod_argv[size + 1]; /* + NULL in the end */ >> + mod_argv[size] = NULL; >> + mod_argv[0] = "insmod"; >> + mod_argv[1] = mod_path; >> + >> + int i; >> + for (i = offset; i< size; ++i) >> + mod_argv[i] = argv[i - offset]; >> + >> + tst_run_cmd(cleanup_fn, mod_argv); >> + free(mod_path); >> +} >> + >> +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) >> +{ >> + char *mod_path = NULL; >> + tst_module_exists(cleanup_fn, mod_name,&mod_path); >> + char *const argv[] = { "rmmod", mod_path, NULL }; > Hmm, man rmmod suggest that it takes module name (not module path) as > parameter i.e. the string without the path and the '.ko' suffix. Does it > work with module path too? > It works fine with path too, also without/with suffix .ko |
From: <ch...@su...> - 2013-06-27 14:33:43
|
Hi! > >> + > >> + if (err != 0) { > >> + free(buf); > >> + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", > >> + mod_name); > >> + } > >> + > >> + if (mod_path != NULL) > >> + *mod_path = buf; > >> + else > >> + free(buf); > >> +} > > So you expect that the '.ko' suffix is part of the module name. It > > should be written in the comment in the header. Because at least I > > expect the module name to be the name that is returned by lsmod. > I will change module name to module's file name in the comments, is it OK? Ok. > >> +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) > >> +{ > >> + char *mod_path = NULL; > >> + tst_module_exists(cleanup_fn, mod_name,&mod_path); > >> + char *const argv[] = { "rmmod", mod_path, NULL }; > > Hmm, man rmmod suggest that it takes module name (not module path) as > > parameter i.e. the string without the path and the '.ko' suffix. Does it > > work with module path too? > > > It works fine with path too, also without/with suffix .ko Ok, then we can avoid the tst_module_exists() call and call rmmod with just mod_name. -- Cyril Hrubis ch...@su... |
From: Alexey K. <ale...@or...> - 2013-06-27 15:10:00
|
There are new functions: tst_module_exists(), tst_module_load() and tst_module_unload(). These functions help to load and unload kernel modules in the tests. Signed-off-by: Alexey Kodanev <ale...@or...> --- include/tst_module.h | 70 +++++++++++++++++++++++++++++++++ lib/tst_module.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 175 insertions(+), 0 deletions(-) create mode 100644 include/tst_module.h create mode 100644 lib/tst_module.c diff --git a/include/tst_module.h b/include/tst_module.h new file mode 100644 index 0000000..7ff2c7e --- /dev/null +++ b/include/tst_module.h @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Alexey Kodanev <ale...@or...> + * + * These functions help to load and unload kernel modules in the tests. + * + * tst_module_load function already includes tst_module_exists function, + * which is checking the following possible module's locations: + * + * 1. Current working directory + * + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) + * + * 3. If tmp directory created, it'll look at the test start working directory + * + */ + +#ifndef TST_MODULE +#define TST_MODULE + +/* + * Check module existence. + * + * @mod_name: module's file name. + * @mod_path: if it is not NULL, then tst_module_exists places the found + * module's path into the location pointed to by *mod_path. It must be freed + * with free() when it is no longer needed. + * + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. + */ +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, + char **mod_path); + +/* + * Load a module using insmod program. + * @mod_name: module's file name. + * @argv: an array of pointers to null-terminated strings that represent the + * additional parameters to the module. The array of pointers must be + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. + * + * In case of insmod failure, test will call cleanup_fn and exit with TBROK + * return value. + */ +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]); + +/* + * @mod_name: can be module name or module's file name. + * Unload a module using rmmod program. In case of failure, test will call + * cleanup_fn and exit with TBROK return value. + */ +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); + +#endif /* TST_MODULE */ diff --git a/lib/tst_module.c b/lib/tst_module.c new file mode 100644 index 0000000..373edb6 --- /dev/null +++ b/lib/tst_module.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Alexey Kodanev <ale...@or...> + * + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "test.h" +#include "ltp_priv.h" +#include "tst_module.h" + +void tst_module_exists(void (cleanup_fn)(void), + const char *mod_name, char **mod_path) +{ + /* check current working directory */ + if (access(mod_name, F_OK) == 0) { + if (mod_path != NULL) + *mod_path = strdup(mod_name); + return; + } + char *buf = NULL; + int err = -1; + /* check LTP installation path */ + const char *ltproot = getenv("LTPROOT"); + if (ltproot != NULL) { + if (asprintf(&buf, "%s/testcases/bin/%s", + ltproot, mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + /* check start working directory */ + if (err == -1 && tst_tmpdir_created()) { + free(buf); + if (asprintf(&buf, "%s/%s", tst_get_startwd(), + mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + + if (err != 0) { + free(buf); + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", + mod_name); + } + + if (mod_path != NULL) + *mod_path = buf; + else + free(buf); +} + +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + + static int offset = 2; /* command name & module path */ + int size = 0; + while (argv && argv[size]) + ++size; + size += offset; + char *mod_argv[size + 1]; /* + NULL in the end */ + mod_argv[size] = NULL; + mod_argv[0] = "insmod"; + mod_argv[1] = mod_path; + + int i; + for (i = offset; i < size; ++i) + mod_argv[i] = argv[i - offset]; + + tst_run_cmd(cleanup_fn, mod_argv); + free(mod_path); +} + +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) +{ + char *const argv[] = { "rmmod", mod_name, NULL }; + tst_run_cmd(cleanup_fn, argv); +} -- 1.7.1 |
From: <ch...@su...> - 2013-06-27 15:25:37
|
Hi! > There are new functions: tst_module_exists(), tst_module_load() and > tst_module_unload(). These functions help to load and unload kernel > modules in the tests. > > Signed-off-by: Alexey Kodanev <ale...@or...> This one looks also fine. -- Cyril Hrubis ch...@su... |
From: Caspar Z. <ca...@ca...> - 2013-06-28 03:16:01
|
On 06/27/2013 11:09 PM, Alexey Kodanev wrote: > There are new functions: tst_module_exists(), tst_module_load() and > tst_module_unload(). These functions help to load and unload kernel > modules in the tests. > > Signed-off-by: Alexey Kodanev <ale...@or...> > --- > include/tst_module.h | 70 +++++++++++++++++++++++++++++++++ > lib/tst_module.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 175 insertions(+), 0 deletions(-) > create mode 100644 include/tst_module.h > create mode 100644 lib/tst_module.c > > diff --git a/include/tst_module.h b/include/tst_module.h > new file mode 100644 > index 0000000..7ff2c7e > --- /dev/null > +++ b/include/tst_module.h > @@ -0,0 +1,70 @@ > +/* > + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: > + * Alexey Kodanev <ale...@or...> > + * > + * These functions help to load and unload kernel modules in the tests. > + * > + * tst_module_load function already includes tst_module_exists function, > + * which is checking the following possible module's locations: > + * > + * 1. Current working directory > + * > + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) > + * > + * 3. If tmp directory created, it'll look at the test start working directory > + * > + */ > + > +#ifndef TST_MODULE > +#define TST_MODULE > + > +/* > + * Check module existence. > + * > + * @mod_name: module's file name. > + * @mod_path: if it is not NULL, then tst_module_exists places the found > + * module's path into the location pointed to by *mod_path. It must be freed > + * with free() when it is no longer needed. > + * > + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. > + */ > +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, > + char **mod_path); > + > +/* > + * Load a module using insmod program. > + * @mod_name: module's file name. > + * @argv: an array of pointers to null-terminated strings that represent the > + * additional parameters to the module. The array of pointers must be > + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. > + * > + * In case of insmod failure, test will call cleanup_fn and exit with TBROK > + * return value. > + */ > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]); > + > +/* > + * @mod_name: can be module name or module's file name. > + * Unload a module using rmmod program. In case of failure, test will call > + * cleanup_fn and exit with TBROK return value. > + */ > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); > + > +#endif /* TST_MODULE */ > diff --git a/lib/tst_module.c b/lib/tst_module.c > new file mode 100644 > index 0000000..373edb6 > --- /dev/null > +++ b/lib/tst_module.c > @@ -0,0 +1,105 @@ > +/* > + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: Alexey Kodanev <ale...@or...> > + * > + */ > + > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <stdlib.h> > +#include <unistd.h> > + > +#include "test.h" > +#include "ltp_priv.h" > +#include "tst_module.h" > + > +void tst_module_exists(void (cleanup_fn)(void), > + const char *mod_name, char **mod_path) > +{ > + /* check current working directory */ > + if (access(mod_name, F_OK) == 0) { > + if (mod_path != NULL) > + *mod_path = strdup(mod_name); > + return; > + } > + char *buf = NULL; > + int err = -1; > + /* check LTP installation path */ > + const char *ltproot = getenv("LTPROOT"); > + if (ltproot != NULL) { > + if (asprintf(&buf, "%s/testcases/bin/%s", > + ltproot, mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + /* check start working directory */ > + if (err == -1 && tst_tmpdir_created()) { > + free(buf); > + if (asprintf(&buf, "%s/%s", tst_get_startwd(), > + mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + > + if (err != 0) { > + free(buf); > + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", > + mod_name); > + } > + > + if (mod_path != NULL) > + *mod_path = buf; > + else > + free(buf); > +} > + > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + > + static int offset = 2; /* command name & module path */ > + int size = 0; > + while (argv && argv[size]) > + ++size; > + size += offset; > + char *mod_argv[size + 1]; /* + NULL in the end */ > + mod_argv[size] = NULL; > + mod_argv[0] = "insmod"; > + mod_argv[1] = mod_path; > + > + int i; > + for (i = offset; i < size; ++i) > + mod_argv[i] = argv[i - offset]; > + > + tst_run_cmd(cleanup_fn, mod_argv); > + free(mod_path); > +} > + > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) > +{ > + char *const argv[] = { "rmmod", mod_name, NULL }; > + tst_run_cmd(cleanup_fn, argv); > +} > Reviewed-by: Caspar Zhang <ca...@ca...> |
From: Wanlong G. <gao...@cn...> - 2013-06-28 03:19:27
|
On 06/27/2013 11:09 PM, Alexey Kodanev wrote: > There are new functions: tst_module_exists(), tst_module_load() and > tst_module_unload(). These functions help to load and unload kernel > modules in the tests. > > Signed-off-by: Alexey Kodanev <ale...@or...> LGTM. Reviewed-by: Wanlong Gao <gao...@cn...> |
From: Mike F. <va...@ge...> - 2013-06-28 05:35:51
Attachments:
signature.asc
|
On Thursday 27 June 2013 11:09:22 Alexey Kodanev wrote: \> +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + > + static int offset = 2; /* command name & module path */ why static ? i would use const instead. -mike |
From: <ale...@or...> - 2013-07-01 08:31:23
|
On 06/28/2013 09:35 AM, Mike Frysinger wrote: > On Thursday 27 June 2013 11:09:22 Alexey Kodanev wrote: > \> +void tst_module_load(void (cleanup_fn)(void), >> + const char *mod_name, char *const argv[]) >> +{ >> + char *mod_path = NULL; >> + tst_module_exists(cleanup_fn, mod_name,&mod_path); >> + >> + static int offset = 2; /* command name& module path */ > why static ? i would use const instead. > -mike Yes, const must be used here, and static is not needed for an int. I will fix it. Thanks, Alexey |
From: Alexey K. <ale...@or...> - 2013-07-01 08:44:02
|
There are new functions: tst_module_exists(), tst_module_load() and tst_module_unload(). These functions help to load and unload kernel modules in the tests. Signed-off-by: Alexey Kodanev <ale...@or...> --- include/tst_module.h | 72 ++++++++++++++++++++++++++++++++++ lib/tst_module.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 177 insertions(+), 0 deletions(-) create mode 100644 include/tst_module.h create mode 100644 lib/tst_module.c diff --git a/include/tst_module.h b/include/tst_module.h new file mode 100644 index 0000000..c50efec --- /dev/null +++ b/include/tst_module.h @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Alexey Kodanev <ale...@or...> + * + * These functions help to load and unload kernel modules in the tests. + * + * tst_module_load function already includes tst_module_exists function, + * which is checking the following possible module's locations: + * + * 1. Current working directory + * + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) + * + * 3. If tmp directory created, it'll look at the test start working directory + * + */ + +#ifndef TST_MODULE +#define TST_MODULE + +/* + * Check module existence. + * + * @mod_name: module's file name. + * @mod_path: if it is not NULL, then tst_module_exists places the found + * module's path into the location pointed to by *mod_path. It must be freed + * with free() when it is no longer needed. + * + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. + */ +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, + char **mod_path); + +/* + * Load a module using insmod program. + * + * @mod_name: module's file name. + * @argv: an array of pointers to null-terminated strings that represent the + * additional parameters to the module. The array of pointers must be + * terminated by a NULL pointer. If argv points to NULL, it will be ignored. + * + * In case of insmod failure, test will call cleanup_fn and exit with TBROK + * return value. + */ +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]); + +/* + * Unload a module using rmmod program. In case of failure, test will call + * cleanup_fn and exit with TBROK return value. + * + * @mod_name: can be module name or module's file name. + */ +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); + +#endif /* TST_MODULE */ diff --git a/lib/tst_module.c b/lib/tst_module.c new file mode 100644 index 0000000..832da27 --- /dev/null +++ b/lib/tst_module.c @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it would be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: Alexey Kodanev <ale...@or...> + * + */ + +#define _GNU_SOURCE +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> + +#include "test.h" +#include "ltp_priv.h" +#include "tst_module.h" + +void tst_module_exists(void (cleanup_fn)(void), + const char *mod_name, char **mod_path) +{ + /* check current working directory */ + if (access(mod_name, F_OK) == 0) { + if (mod_path != NULL) + *mod_path = strdup(mod_name); + return; + } + char *buf = NULL; + int err = -1; + /* check LTP installation path */ + const char *ltproot = getenv("LTPROOT"); + if (ltproot != NULL) { + if (asprintf(&buf, "%s/testcases/bin/%s", + ltproot, mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + /* check start working directory */ + if (err == -1 && tst_tmpdir_created()) { + free(buf); + if (asprintf(&buf, "%s/%s", tst_get_startwd(), + mod_name) == -1) { + tst_brkm(TBROK | TERRNO, cleanup_fn, + "asprintf failed at %s:%d", + __FILE__, __LINE__); + } + err = access(buf, F_OK); + } + + if (err != 0) { + free(buf); + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", + mod_name); + } + + if (mod_path != NULL) + *mod_path = buf; + else + free(buf); +} + +void tst_module_load(void (cleanup_fn)(void), + const char *mod_name, char *const argv[]) +{ + char *mod_path = NULL; + tst_module_exists(cleanup_fn, mod_name, &mod_path); + + const int offset = 2; /* command name & module path */ + int size = 0; + while (argv && argv[size]) + ++size; + size += offset; + char *mod_argv[size + 1]; /* + NULL in the end */ + mod_argv[size] = NULL; + mod_argv[0] = "insmod"; + mod_argv[1] = mod_path; + + int i; + for (i = offset; i < size; ++i) + mod_argv[i] = argv[i - offset]; + + tst_run_cmd(cleanup_fn, mod_argv); + free(mod_path); +} + +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) +{ + char *const argv[] = { "rmmod", mod_name, NULL }; + tst_run_cmd(cleanup_fn, argv); +} -- 1.7.1 |
From: Wanlong G. <gao...@cn...> - 2013-07-01 08:54:58
|
On 07/01/2013 04:42 PM, Alexey Kodanev wrote: > There are new functions: tst_module_exists(), tst_module_load() and > tst_module_unload(). These functions help to load and unload kernel > modules in the tests. > > Signed-off-by: Alexey Kodanev <ale...@or...> Applied, thank you. Wanlong Gao |
From: <ch...@su...> - 2013-06-26 13:35:45
|
Hi! > There are new functions: tst_module_exists(), tst_module_load() and > tst_module_unload(). These functions help to load and unload kernel > modules in the tests. > > Signed-off-by: Alexey Kodanev <ale...@or...> > --- > include/tst_module.h | 68 +++++++++++++++++++++++++++++++ > lib/tst_module.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 177 insertions(+), 0 deletions(-) > create mode 100644 include/tst_module.h > create mode 100644 lib/tst_module.c > > diff --git a/include/tst_module.h b/include/tst_module.h > new file mode 100644 > index 0000000..90d7cf1 > --- /dev/null > +++ b/include/tst_module.h > @@ -0,0 +1,68 @@ > +/* > + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: > + * Alexey Kodanev <ale...@or...> > + * > + * These functions help to load and unload kernel modules in the tests. > + * > + * tst_module_load and tst_module_unload functions already include > + * tst_module_exists function, which is checking the following possible > + * module's locations: > + * > + * 1. Current working directory > + * > + * 2. LTP installation path (using env LTPROOT, which is usually /opt/ltp) > + * > + * 3. If tmp directory created, it'll look at the test start working directory > + * > + */ > + > +#ifndef TST_MODULE > +#define TST_MODULE > + > +/* > + * Check module existence. > + * > + * @mod_path: if it is not NULL, then tst_module_exists places the found > + * module's path into the location pointed to by *mod_path. It must be freed > + * with free() when it is no longer needed. > + * > + * In case of failure, test'll call cleanup_fn and exit with TCONF return value. > + */ > +void tst_module_exist(void (cleanup_fn)(void), const char *mod_name, > + char **mod_path); > + > +/* > + * Load a module using insmod program. > + * > + * @argv: an array of pointers to null-terminated strings that represent the > + * additional parameters to the module. If it is NULL, it will be ignored. > + * > + * In case of insmod failure, test will call cleanup_fn and exit with TBROK > + * return value. > + */ > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]); > + > +/* > + * Unload a module using rmmod program. In case of failure, test will call > + * cleanup_fn and exit with TBROK return value. > + */ > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name); > + > +#endif /* TST_MODULE */ > diff --git a/lib/tst_module.c b/lib/tst_module.c > new file mode 100644 > index 0000000..20a73bf > --- /dev/null > +++ b/lib/tst_module.c > @@ -0,0 +1,109 @@ > +/* > + * Copyright (c) 2013 Oracle and/or its affiliates. All Rights Reserved. > + * > + * This program is free software; you can redistribute it and/or > + * modify it under the terms of the GNU General Public License as > + * published by the Free Software Foundation; either version 2 of > + * the License, or (at your option) any later version. > + * > + * This program is distributed in the hope that it would be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > + * GNU General Public License for more details. > + * > + * You should have received a copy of the GNU General Public License > + * along with this program; if not, write the Free Software Foundation, > + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA > + * > + * Author: Alexey Kodanev <ale...@or...> > + * > + */ > + > +#define _GNU_SOURCE > +#include <stdio.h> > +#include <stdlib.h> > +#include <stdarg.h> > + > +#include "test.h" > +#include "safe_macros.h" > +#include "ltp_priv.h" > +#include "tst_module.h" > + > +void tst_module_exists(void (cleanup_fn)(void), > + const char *mod_name, char **mod_path) > +{ > + /* check current working directory */ > + if (access(mod_name, F_OK) == 0) { > + if (mod_path != NULL) > + *mod_path = strdup(mod_name); > + return; > + } > + char *buf = NULL; > + int err = -1; > + /* check LTP installation path */ > + const char *ltproot = getenv("LTPROOT"); > + if (ltproot != NULL) { > + if (asprintf(&buf, "%s/testcases/bin/%s", > + ltproot, mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + /* check start working directory */ > + if (err == -1 && tst_tmpdir_created()) { > + if (buf != NULL) > + free(buf); The if is redundant here as free() can handle NULL pointers just fine. > + if (asprintf(&buf, "%s/%s", tst_get_startwd(), > + mod_name) == -1) { > + tst_brkm(TBROK | TERRNO, cleanup_fn, > + "asprintf failed at %s:%d", > + __FILE__, __LINE__); > + } > + err = access(buf, F_OK); > + } > + > + if (err != 0) { > + if (buf != NULL) > + free(buf); Here as well. > + tst_brkm(TCONF, cleanup_fn, "Failed to find module '%s'", > + mod_name); > + } > + > + if (mod_path != NULL) > + *mod_path = buf; > + else > + free(buf); > +} > + > +void tst_module_load(void (cleanup_fn)(void), > + const char *mod_name, char *const argv[]) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + > + /* add command name, module name and NULL to array */ > + static int offset = 2; > + int size = offset; > + if (argv != NULL) > + size += ARRAY_SIZE(argv); Again same problem. If you pas array of pointers in C you have two options either to NULL terminate the array or pass it's size as parameter. I would settle for NULL terminated in this case. > + char *mod_argv[size + 1]; > + mod_argv[size] = NULL; > + mod_argv[0] = "insmod"; > + mod_argv[1] = strdupa(mod_path); > + free(mod_path); Hmm what about removing the strdupa() and freeing the mod_path after the command is executed. If that fails the program exits anyway and whole malloc heap is thrown away on program exit. > + int i; > + for (i = offset; i < size; ++i) > + mod_argv[i] = argv[i - offset]; > + SAFE_EXECVP(cleanup_fn, mod_argv); > +} > + > +void tst_module_unload(void (cleanup_fn)(void), const char *mod_name) > +{ > + char *mod_path = NULL; > + tst_module_exists(cleanup_fn, mod_name, &mod_path); > + char *const argv[] = { "rmmod", strdupa(mod_path), NULL }; Same here. > + free(mod_path); > + SAFE_EXECVP(cleanup_fn, argv); > +} -- Cyril Hrubis ch...@su... |