void *lib_handle = NULL;
int (*plugin_install) (xmlDocPtr, const char *);
int ret = -1;
- char *ac;
+ char *ac = NULL;
+ int cpid = -1;
+ int status = 0;
+ int w = 0;
switch (action) {
case ACTION_INSTALL:
if (!lib_path) {
goto END;
}
-
- if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
- DBGE("dlopen is failed lib_path[%s]\n", lib_path);
- goto END;
- }
-
- if ((plugin_install =
- dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
- DBGE("can not find symbol \n");
+ /*fork a child*/
+ cpid = fork();
+ switch (cpid) {
+ case -1:
+ DBGE("fork() failed\n");
goto END;
+ case 0:
+ /*child process*/
+ if ((lib_handle = dlopen(lib_path, RTLD_LAZY)) == NULL) {
+ DBGE("dlopen is failed lib_path[%s]\n", lib_path);
+ exit(-1);
+ }
+ if ((plugin_install =
+ dlsym(lib_handle, ac)) == NULL || dlerror() != NULL) {
+ DBGE("can not find symbol \n");
+ if (lib_handle)
+ dlclose(lib_handle);
+ exit(-1);
+ }
+ ret = plugin_install(docPtr, pkgid);
+ if (lib_handle)
+ dlclose(lib_handle);
+ exit(ret);
+ default:
+ /*parent process*/
+ do {
+ w = waitpid(cpid, &status, WUNTRACED | WCONTINUED);
+ if (w == -1) {
+ DBGE("waitpid() failed\n");
+ break;
+ }
+ } while (!WIFEXITED(status) && !WIFSIGNALED(status));
+ if (WIFEXITED(status))
+ ret = WEXITSTATUS(status);
+ else if (WIFSIGNALED(status))
+ ret = WTERMSIG(status);
+ else
+ ret = 0;
+ DBGE("Child exit status=%d\n", ret);
+ break;
}
-
- ret = plugin_install(docPtr, pkgid);
-
- END:
+END:
if (lib_path)
free(lib_path);
- if (lib_handle)
- dlclose(lib_handle);
return ret;
}
privileges_x *pvs = NULL;
privilege_x *pv = NULL;
char query[MAX_QUERY_LEN] = { '\0' };
+ char root[MAX_QUERY_LEN] = { '\0' };
int ret = -1;
char *type = NULL;
char *path = NULL;
path = strdup(mfx->root_path);
else{
if (strcmp(type,"rpm")==0)
- path = strdup("/usr/apps");
+ snprintf(root, MAX_QUERY_LEN - 1, "/usr/apps/%s", mfx->package);
else
- path = strdup("/opt/usr/apps");
+ snprintf(root, MAX_QUERY_LEN - 1, "/opt/usr/apps/%s", mfx->package);
+
+ path = strdup(root);
}
snprintf(query, MAX_QUERY_LEN,
"insert into package_info(package, package_type, package_version, install_location, package_size, " \