52 lines (43 with data), 1.4 kB
/*-*- mode: C; tab-width:4 -*-*/
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <stdio.h>
/* convenience and SELinux security wrapper for mmono. This file is
called by the service script and should be tagged with appropriate
security context (see chcon(1)). */
void usage(char*name){
fprintf(stderr, "This file should not be called directly.\n");
fprintf(stderr, "Tag this file with the javabridge_exec_t security context and set it to\n");
fprintf(stderr, "suid/guid apache/apache. Example:\n");
fprintf(stderr, "chcon -t javabridge_exec_t %s; chown apache:apache %s; chmod 6111 %s\n", name, name, name);
exit(1);
}
char *stringcat(char *s1, char *s2) {
char *s3=malloc(strlen(s1)+strlen(s2)+1);
*s3=0; strcat(s3,s1);
return strcat(s3,s2);
}
char *stringdup(char *s) {
if(!s) return s;
return strdup(s);
}
int main(int argc, char**_argv){
char **argv;
char *error;
int i;
if(argc<5) usage(_argv[0]);
argv=calloc(argc, sizeof*argv);
for(i=0; i<argc-1; i++)
argv[i]=stringdup(_argv[i+1]);
argv[i]=0;
setreuid(geteuid(), -1);
setregid(getegid(), -1);
if(*argv[0]=='/') execv(argv[0], argv); else execvp(argv[0], argv);
error = strerror(errno);
execvp("mono", argv);
fprintf(stderr, "Could not execute %s: %s\n", argv[0], error);
return 2;
}