/*-*- 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 java.  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 *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;

  if(!getuid()) setreuid(geteuid(), -1);
  if(!getgid()) setregid(getegid(), -1);
  if(*argv[0]=='/') execv(argv[0], argv); else execvp(argv[0], argv);
  error = strerror(errno);
  execvp("java", argv);
  fprintf(stderr, "Could not execute %s: %s\n", argv[0], error);
  return 2;
}
