You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
139 lines
3.3 KiB
139 lines
3.3 KiB
#include <EXTERN.h>
|
|
#include <perl.h>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <syslog.h>
|
|
#include <pwd.h>
|
|
#include <grp.h>
|
|
#include <sys/resource.h>
|
|
#include <sys/time.h>
|
|
#include "config.h"
|
|
|
|
/* All this crap is needed to allow perl modules, copied from perlembed manpage */
|
|
static void xs_init _((void));
|
|
|
|
EXTERN_C void boot_DynaLoader _((CV* cv));
|
|
EXTERN_C void xs_init()
|
|
{
|
|
char *file = __FILE__;
|
|
newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
|
|
};
|
|
|
|
static PerlInterpreter *my_perl;
|
|
|
|
static void resource_limits (void){
|
|
struct rlimit core,openfiles,procs,filesize,cputime;
|
|
|
|
core.rlim_cur = core.rlim_max = CORE_SIZE;
|
|
openfiles.rlim_cur = openfiles.rlim_max = OPEN_FILES;
|
|
procs.rlim_cur = procs.rlim_max = PROCESSES;
|
|
filesize.rlim_cur = filesize.rlim_max = FILE_SIZE;
|
|
cputime.rlim_cur = cputime.rlim_max = CPU_TIME;
|
|
|
|
if ( setrlimit(RLIMIT_CORE,&core) ){
|
|
printf("Couldn't set corefile size\n");
|
|
exit(1);
|
|
};
|
|
if ( setrlimit(RLIMIT_NOFILE,&openfiles) ){
|
|
printf("Couldn't set openfiles\n");
|
|
exit(1);
|
|
};
|
|
if ( setrlimit(RLIMIT_NPROC,&procs) ){
|
|
printf("Couldn't set procs\n");
|
|
exit(1);
|
|
};
|
|
if ( setrlimit(RLIMIT_FSIZE,&filesize) ){
|
|
printf("Couldn't set filesize\n");
|
|
exit(1);
|
|
};
|
|
if ( setrlimit(RLIMIT_CPU,&cputime) ){
|
|
printf("Couldn't set cputime\n");
|
|
exit(1);
|
|
};
|
|
|
|
}
|
|
|
|
int main ( int argc, char **argv, char **env) {
|
|
|
|
int argvsize = 0, i = 0;
|
|
char *argvbuf,*pwd;
|
|
char tmp;
|
|
struct passwd *pw;
|
|
struct group *gw;
|
|
int path_max = PATH_MAX + 2; /* The getcwd docs say to do this. */
|
|
|
|
|
|
if( FIX_PWD ){
|
|
pwd = malloc(path_max);
|
|
getcwd(pwd,path_max);
|
|
};
|
|
|
|
if( CHROOT ){
|
|
if( chroot(CHROOT_DIR) ){
|
|
printf("Couldn't chroot\n");
|
|
exit(1);
|
|
} else {
|
|
if( chdir(CHROOT_DIR) ){
|
|
printf("Couldn't chdir\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
}
|
|
if( FIX_PWD ){
|
|
chdir(pwd);
|
|
}
|
|
|
|
if( SET_LIMITS )
|
|
resource_limits();
|
|
|
|
/* No more need for high privs, lose them */
|
|
if( setuid(geteuid()) ){
|
|
printf("Couldn't setuid\n");
|
|
exit(1);
|
|
};
|
|
|
|
for(i = 0; i < argc ; argvsize += strlen(argv[i++]));
|
|
argvsize += argc;
|
|
|
|
if (!(argvbuf = malloc(argvsize))){
|
|
printf("Couldn't malloc\n");
|
|
exit(1);
|
|
}
|
|
|
|
for ( i = 0, *argvbuf = 0; i < argc;){
|
|
strcat(argvbuf,argv[i]);
|
|
if(++i < argc)
|
|
strcat(argvbuf, " ");
|
|
};
|
|
|
|
tmp = argvbuf[LENGTH];
|
|
argvbuf[LENGTH]= '\0';
|
|
|
|
my_perl = perl_alloc();
|
|
perl_construct(my_perl);
|
|
|
|
if( ALLOW_MODULES ){
|
|
perl_parse(my_perl,xs_init, argc, argv, env);
|
|
} else {
|
|
perl_parse(my_perl,NULL,argc,argv,env);
|
|
}
|
|
|
|
/* Run the entire program */
|
|
perl_run(my_perl);
|
|
|
|
perl_destruct(my_perl);
|
|
perl_free(my_perl);
|
|
pw = getpwuid(geteuid());
|
|
gw = getgrgid(getegid());
|
|
if ( pw && gw && SYSLOG){
|
|
syslog(FACILITY,"[%d] (%s,%s) ran '%s'",getpid(), pw->pw_name, gw->gr_name, argvbuf );
|
|
} else {
|
|
syslog(FACILITY,"[%d] (%d,%d) ran '%s'",getpid(),getuid(),getgid(), argvbuf );
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
/* Das boot. */
|
|
|
|
|