/* run.cc */ #include "std.h" // REDHAT 8.0 #include #include "load-conf.h" // symbol USE_LTDL #ifdef USE_LTDL #include #else #include #endif using namespace std; OPEN_NAMESPACE /***************************** ERROR MESSAGES *****************************/ char * library_name = NULL; char * function_name = NULL; void err (const char * msg) { cerr << "run " << library_name << " " << function_name << endl; cerr << "error: " << msg << endl; } /****************************** LOAD LIBRARY ******************************/ typedef int (* func_t) (int, char * []); #ifdef USE_LTDL int load_library (char * file_name, char * func_name, int argc, char * argv []) { int code = 1; if (lt_dlinit () != 0) err (lt_dlerror ()); else { lt_dlhandle handle = lt_dlopenext (file_name); if (handle == NULL) err (lt_dlerror ()); else { lt_ptr proc = lt_dlsym (handle, func_name); if (proc == NULL) err (lt_dlerror ()); else { func_t func = (func_t) (proc); code = func (argc, argv); } } } return code; } #else int load_library (char * file_name, char * func_name, int argc, char * argv []) { int code = 1; void * handle = dlopen (file_name, RTLD_LAZY | RTLD_GLOBAL); if (handle == NULL) err (dlerror ()); else { void * proc = dlsym (handle, func_name); if (proc == NULL) err (dlerror ()); else { func_t func = (func_t) (proc); code = func (argc, argv); } } return code; } #endif /********************************** MAIN **********************************/ CLOSE_NAMESPACE USE_NAMESPACE extern "C" int main (int argc, char * argv []) { int code = 0; if (argc < 3) { cerr << "Usage: run " << endl; code = 1; } else { library_name = argv [1]; function_name = argv [2]; argv [2] = argv [0]; // copy program name code = load_library (library_name, function_name, argc-2, argv+2); } return code; }