Menu

[r394]: / trunk / php-java-bridge / server / RunMonoBridge.c.in  Maximize  Restore  History

Download this file

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;
}