#include "p11-tests.h" #include "p11-tests-lib.h" #include "compat.h" #include #include #ifdef _WIN32 #define WIN32_LEAN_AND_MEAN #define _WIN32_WINNT 0x400 #include static HMODULE module = NULL; #else /* !_WIN32 */ #include #include static void *module = NULL; #endif /* !_WIN32 */ int p11t_test_unexpected = 1; int p11t_test_write_session = 0; static void usage() { fprintf(stderr, "usage: p11-tests [-f config] module\n"); exit(2); } void fatal (const char *message, ...) { va_list va; va_start (va, message); fprintf (stderr, message, va); va_end (va); exit (1); } CK_FUNCTION_LIST_PTR module_load(const char *filename) { CK_FUNCTION_LIST_PTR list = NULL; CK_C_GetFunctionList get_function_list; CK_RV rv; #ifdef _WIN32 module = LoadLibrary (filename); if (!module) fatal ("couldn't load library: %s: %s", filename, p11t_msg_os ()); /* Lookup the appropriate function in the library */ get_function_list = (CK_C_GetFunctionList)GetProcAddress (module, "C_GetFunctionList"); if (!get_function_list) fatal ("couldn't find function 'C_GetFunctionList' in library: %s: %s", filename, p11t_msg_os ()); #else /* !_WIN32 */ module = dlopen (filename, RTLD_NOW); if (!module) fatal ("couldn't open library: %s: %s", filename, dlerror ()); /* Lookup the appropriate function in library */ get_function_list = (CK_C_GetFunctionList)dlsym (module, "C_GetFunctionList"); if (!get_function_list) fatal ("couldn't find function 'C_GetFunctionList' in library: %s: %s", filename, dlerror ()); #endif /* !_WIN32 */ /* Get the function list */ rv = (get_function_list) (&list); if(rv != CKR_OK || !list) fatal ("couldn't get function list: %d", (int)rv); return list; } void module_unload (void) { if (module) { #ifdef _WIN32 FreeLibrary (module); #else dlclose (module); #endif } module = NULL; } int main(int argc, char* argv[]) { CK_FUNCTION_LIST_PTR module; int ch; while((ch = getopt(argc, argv, "f:svz")) != -1) { switch(ch) { case 'f': if (p11_tests_load_config (optarg) < 0) exit (2); break; case 's': p11_tests_set_write_session (1); break; case 'v': p11_tests_set_verbose (1); break; case 'z': p11_tests_set_unexpected (0); break; case '?': default: usage(); break; } } argc -= optind; argv += optind; if(argc != 1) usage(); module = module_load (argv[0]); p11_tests_perform (module); module_unload (); /* TODO: Change return value based on tests passed, failed */ return 0; }