diff options
Diffstat (limited to 'worker')
-rw-r--r-- | worker/Makefile | 4 | ||||
-rw-r--r-- | worker/worker.c | 56 |
2 files changed, 56 insertions, 4 deletions
diff --git a/worker/Makefile b/worker/Makefile index c4a2341..b8259a3 100644 --- a/worker/Makefile +++ b/worker/Makefile @@ -1,6 +1,6 @@ -CFLAGS=-Wall -Werror `xml2-config --cflags` `xslt-config --cflags` -LDFLAGS=`xml2-config --libs` `xslt-config --libs` +CFLAGS=-Wall -Werror `xml2-config --cflags` `xslt-config --cflags` -g +LDFLAGS=`xml2-config --libs` `xslt-config --libs` -g INDENTFLAGS=-kr -nut -l80 SRCS = worker.c debug.c diff --git a/worker/worker.c b/worker/worker.c index 52abf5d..5f5af5b 100644 --- a/worker/worker.c +++ b/worker/worker.c @@ -1,3 +1,4 @@ +#define _GNU_SOURCE #include <stdio.h> #include <string.h> #include <stdlib.h> @@ -10,6 +11,7 @@ #include <errno.h> #include <pwd.h> #include <grp.h> +#include <sys/wait.h> @@ -43,6 +45,56 @@ xmlChar *default_namespace_prefix = (xmlChar *) "def"; #define XSLT_METADATA_NAMESPACE_PREFIX (xmlChar *) "md" #define XPATH_OUTPUT_HANDLER (xmlChar *) "//md:output_handler/*" +int exec_command(const char *command, const uid_t uid, const gid_t gid, char *arguments, char *extra_args) { + char *argv[10]; /* FIXME */ + int c=0; + int i; + char *cur; + char *next_arg; + pid_t pid; + int ret; + int status; + + argv[c++]=strdup(command); + if (arguments!=NULL) { + cur=arguments; + while( (next_arg=strchr(cur, ' '))!=NULL) { + argv[c++]=strndup(cur, next_arg-cur); + cur=next_arg+1; + } + argv[c++]=strdup(cur); + } + if (extra_args!=NULL) { + cur=extra_args; + while( (next_arg=strchr(cur, ' '))!=NULL) { + argv[c++]=strndup(cur, next_arg-cur); + cur=next_arg+1; + } + argv[c++]=strdup(cur); + } + argv[c++]=NULL; + + for(i=0;i<c;i++){ + DEBUG(3,("argument array element %d: |%s|\n",i, argv[i])); + } + + pid=fork(); + CHECK_MINUS_ONE_RETURN(pid, ("fork failed: %s",strerror(errno))); + if (!pid) { /* FIXME: missing error checking */ + setuid(uid); + setgid(gid); + + execv(command, argv); + } + + ret = waitpid(pid, & status, 0); + + + for(i=0;i<c;i++){ + free(argv[i]); + } + return(0); +} char *get_output_handler_parameter(xmlNode *node, const char *name, const char *default_value, const int required) { char *value; @@ -225,10 +277,10 @@ int output_handler_exec_with_args(xmlNode *node, const xmlDocPtr doc, const char xsltFreeStylesheet(parsed_stylesheet); cur=(char *)result_string; - DEBUG(3,("last argument to %s: |%s|\n",command, cur)); while ( (end_of_line = strchr(cur, '\n'))!=NULL ) { *end_of_line='\0'; - DEBUG(3,("argument to %s: |%s|\n",command, cur)); + DEBUG(3,("found argument to %s: |%s|\n",command, cur)); + exec_command(command, pwd_info->pw_uid, grp_info->gr_gid, arguments, cur); cur=end_of_line+1; }; |