summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSumit Bose <sbose@nb.localdomain>2008-11-10 13:55:06 +0100
committerSumit Bose <sbose@nb.localdomain>2008-11-10 13:55:06 +0100
commite4a17036ff6672cafaf1d8eed90566cb28fd8dfd (patch)
tree7742b58613f0b2f5b4df6e2738384436f7db06db
parent0a1d652b27013cd4e6fb80c9011262e155af050b (diff)
downloadipa_policy-e4a17036ff6672cafaf1d8eed90566cb28fd8dfd.tar.gz
ipa_policy-e4a17036ff6672cafaf1d8eed90566cb28fd8dfd.tar.xz
ipa_policy-e4a17036ff6672cafaf1d8eed90566cb28fd8dfd.zip
started external command execution
-rw-r--r--worker/Makefile4
-rw-r--r--worker/worker.c56
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;
};