+typedef int (*call_t)(int argc, char* argv[]);
+
+int dlopen_forshell(int argc, char **argv)
+{
+ void * handle;
+ int unresolved;
+ char * message = "loaded";
+ char *call_file_name;
+ char *call_symbol = NULL;
+ call_t call;
+ int call_ret;
+
+ if (argc < 2) {
+ printf ("file to load not specified\n");
+ return 1;
+ }
+ call_file_name = argv[1];
+
+ if (argc >= 3)
+ call_symbol = argv[2];
+
+ argc -= 2;
+ argv += 2;
+
+ handle = dlopen (call_file_name, RTLD_NOW | RTLD_GLOBAL);
+ if (!handle)
+ {
+ printf("dlopen failed: %s\n", dlerror());
+ return 1;
+ }
+
+ if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
+ message = "dlinfo error checking unresolved status";
+ else if (unresolved)
+ message = "has unresolved externals";
+
+ if (call_symbol == NULL) {
+ printf ("handle: %p %s\n", handle, message);
+ return 1;
+ }
+
+ call = dlsym (handle, call_symbol);
+ if (call == NULL)
+ {
+ printf("dlsym failed: symbol %s not found\n", call_symbol);
+ return 1;
+ }
+
+ call_ret = call(argc, argv);
+
+ return call_ret;
+}
+