summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSumit Bose <sbose@nb.localdomain>2008-11-10 22:45:43 +0100
committerSumit Bose <sbose@nb.localdomain>2008-11-10 22:45:43 +0100
commit4dc78278c47255a532d9b7eaa6969a102dd86e98 (patch)
treedc041c698df8cec89e01fd449179690a21f94176
parente4a17036ff6672cafaf1d8eed90566cb28fd8dfd (diff)
downloadipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.tar.gz
ipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.tar.xz
ipa_policy-4dc78278c47255a532d9b7eaa6969a102dd86e98.zip
added pipe between parent and child
-rw-r--r--worker/Makefile3
-rw-r--r--worker/util.h7
-rw-r--r--worker/worker.c65
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);