diff options
author | Sumit Bose <sbose@nb.localdomain> | 2008-11-10 22:45:43 +0100 |
---|---|---|
committer | Sumit Bose <sbose@nb.localdomain> | 2008-11-10 22:45:43 +0100 |
commit | 4dc78278c47255a532d9b7eaa6969a102dd86e98 (patch) | |
tree | dc041c698df8cec89e01fd449179690a21f94176 | |
parent | e4a17036ff6672cafaf1d8eed90566cb28fd8dfd (diff) | |
download | ipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.tar.gz ipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.tar.xz ipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.zip |
added pipe between parent and child
-rw-r--r-- | worker/Makefile | 3 | ||||
-rw-r--r-- | worker/util.h | 7 | ||||
-rw-r--r-- | worker/worker.c | 65 |
3 files changed, 52 insertions, 23 deletions
diff --git a/worker/Makefile b/worker/Makefile index b8259a3..17a9c8c 100644 --- a/worker/Makefile +++ b/worker/Makefile @@ -16,3 +16,6 @@ worker: worker.o debug.o indent: indent $(INDENTFLAGS) $(SRCS) + +clean: + rm *.o diff --git a/worker/util.h b/worker/util.h index f3fee31..77126b4 100644 --- a/worker/util.h +++ b/worker/util.h @@ -12,6 +12,13 @@ void debug_fn(const char *format, ...); } while(0) +#define CHECK(pointer, val, message, action) do { \ + if (pointer == (val)) { \ + DEBUG(0, message); \ + action; \ + } \ +} while(0) + #define CHECK_NULL_FATAL(pointer, message) do { \ if (pointer == NULL) { \ DEBUG(0, message); \ diff --git a/worker/worker.c b/worker/worker.c index 5f5af5b..6bfc069 100644 --- a/worker/worker.c +++ b/worker/worker.c @@ -54,6 +54,9 @@ int exec_command(const char *command, const uid_t uid, const gid_t gid, char *ar pid_t pid; int ret; int status; + int stdout_pipe[2]; + int stderr_pipe[2]; + char buffer[255]; argv[c++]=strdup(command); if (arguments!=NULL) { @@ -78,22 +81,55 @@ int exec_command(const char *command, const uid_t uid, const gid_t gid, char *ar DEBUG(3,("argument array element %d: |%s|\n",i, argv[i])); } + ret=pipe(stdout_pipe); + CHECK(ret, -1, ("pipe failed: %s\n",strerror(errno)), return(-1)); + ret=pipe(stderr_pipe); + CHECK(ret, -1, ("pipe failed: %s\n",strerror(errno)), return(-1)); + pid=fork(); - CHECK_MINUS_ONE_RETURN(pid, ("fork failed: %s",strerror(errno))); + CHECK(pid, -1, ("fork failed: %s",strerror(errno)), return(-1)); if (!pid) { /* FIXME: missing error checking */ - setuid(uid); - setgid(gid); + + close(stdout_pipe[0]); + close(stderr_pipe[0]); + + ret=dup2(stdout_pipe[1], STDOUT_FILENO); + CHECK(ret, -1, ("dup2 failed: %s\n",strerror(errno)), exit(1)); + ret=dup2(stderr_pipe[1], STDERR_FILENO); + CHECK(ret, -1, ("dup2 failed: %s\n",strerror(errno)), exit(1)); + + ret=setuid(uid); + CHECK(ret, -1, ("setuid failed: %s\n",strerror(errno)), exit(1)); + ret=setgid(gid); + CHECK(ret, -1, ("setgid failed: %s\n",strerror(errno)), exit(1)); execv(command, argv); } + close(stdout_pipe[1]); + close(stderr_pipe[1]); + + *buffer='\0'; + ret=read(stdout_pipe[0], &buffer, 255); + buffer[ret]='\0'; + DEBUG(3,("stdout from child: >>%s<<\n",buffer)); + *buffer='\0'; + ret=read(stderr_pipe[0], &buffer, 255); + buffer[ret]='\0'; + DEBUG(3,("stderr from child: >>%s<<\n",buffer)); + ret = waitpid(pid, & status, 0); + if (WIFEXITED(status)) { + DEBUG(3,("Child terminated normally with exit status %d\n",WEXITSTATUS(status))); + } else { + DEBUG(1,("Child terminated not normally.\n")); + } for(i=0;i<c;i++){ free(argv[i]); } - return(0); + return(WEXITSTATUS(status)); } char *get_output_handler_parameter(xmlNode *node, const char *name, const char *default_value, const int required) { @@ -280,7 +316,8 @@ int output_handler_exec_with_args(xmlNode *node, const xmlDocPtr doc, const char while ( (end_of_line = strchr(cur, '\n'))!=NULL ) { *end_of_line='\0'; DEBUG(3,("found argument to %s: |%s|\n",command, cur)); - exec_command(command, pwd_info->pw_uid, grp_info->gr_gid, arguments, cur); + ret=exec_command(command, pwd_info->pw_uid, grp_info->gr_gid, arguments, cur); + DEBUG(3,("exec_command retrun value: %d\n",ret)); cur=end_of_line+1; }; @@ -428,9 +465,6 @@ int main(int argc, char **argv) char *xslt_file_name; xmlRelaxNGValidCtxtPtr rng_context; xmlDocPtr xslt_doc; -// xsltStylesheetPtr parsed_stylesheet = NULL; -// xmlDocPtr res; -// int ret; if (argc != 2) { DEBUG(0, @@ -499,21 +533,6 @@ int main(int argc, char **argv) find_output_handler(doc, xslt_file_name); -/* - parsed_stylesheet = xsltParseStylesheetDoc(xslt_doc); - CHECK_NULL_FATAL(parsed_stylesheet, ("Cannot parse stylesheet %s!\n", xslt_file_name)); - res = xsltApplyStylesheet(parsed_stylesheet, doc, NULL); - CHECK_NULL_FATAL(xslt_doc, - ("Cannot apply stylesheet %s!\n", xslt_file_name)); - ret = xsltSaveResultToFile(stdout, res, parsed_stylesheet); - if (ret == -1) { - DEBUG(0, ("Cannot save result!\n")); - exit(1); - } - xmlFreeDoc(res); - - xsltFreeStylesheet(parsed_stylesheet); -*/ free(xslt_file_name); xmlFreeDoc(doc); |