--- daemons/common/pdc.c.orig Thu Sep 1 02:09:04 2005 +++ daemons/common/pdc.c Thu Apr 13 22:05:15 2006 @@ -118,6 +118,16 @@ #include "sge_unistd.h" #endif +#if defined(FREEBSD) +#include +#include +#include + +#include +#include +#include +#endif + #if defined(LINUX) || defined(ALPHA) || defined(IRIX) || defined(SOLARIS) || defined(DARWIN) || defined (FREEBSD) || defined(NETBSD) #include "sge_os.h" @@ -188,12 +198,57 @@ } #endif -#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA) +#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA) || defined(FREEBSD) void pdc_kill_addgrpid(gid_t add_grp_id, int sig, tShepherd_trace shepherd_trace) { +#if defined(LINUX) || defined(SOLARIS) || defined(ALPHA) procfs_kill_addgrpid(add_grp_id, sig, shepherd_trace); +#elif defined(FREEBSD) + kvm_t *kd; + int i, nprocs; + struct kinfo_proc *procs; + char kerrbuf[_POSIX2_LINE_MAX]; + + kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, kerrbuf); + if (kd == NULL) { +#if DEBUG + fprintf(stderr, "kvm_getprocs: error %s\n", kerrbuf); +#endif + return; + } + + procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs); + if (procs == NULL) { +#if DEBUG + fprintf(stderr, "kvm_getprocs: error %s\n", kvm_geterr(kd)); +#endif + kvm_close(kd); + return; + } + for (; nprocs >= 0; nprocs--, procs++) { + for (i = 0; i < procs->ki_ngroups; i++) { + if (procs->ki_groups[i] == add_grp_id) { + char err_str[256]; + + if (procs->ki_uid != 0 && procs->ki_ruid != 0 && + procs->ki_svuid != 0 && + procs->ki_rgid != 0 && procs->ki_svgid != 0) { + kill(procs->ki_pid, sig); + sprintf(err_str, MSG_SGE_KILLINGPIDXY_UI , + sge_u32c(procs->ki_pid), add_grp_id); + } else { + sprintf(err_str, MSG_SGE_DONOTKILLROOTPROCESSXY_UI , + sge_u32c(procs->ki_pid), add_grp_id); + } + if (shepherd_trace) + shepherd_trace(err_str); + } + } + } + kvm_close(kd); +#endif } #endif @@ -1404,6 +1459,95 @@ ; pt_close(); } +#elif defined(FREEBSD) + { + kvm_t *kd; + int i, nprocs; + struct kinfo_proc *procs; + char kerrbuf[_POSIX2_LINE_MAX]; + job_elem_t *job_elem; + double old_time = 0.0; + uint64 old_vmem = 0; + + kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, kerrbuf); + if (kd == NULL) { +#if DEBUG + fprintf(stderr, "kvm_getprocs: error %s\n", kerrbuf); +#endif + DEXIT; + return -1; + } + + procs = kvm_getprocs(kd, KERN_PROC_ALL, 0, &nprocs); + if (procs == NULL) { +#if DEBUG + fprintf(stderr, "kvm_getprocs: error %s\n", kvm_geterr(kd)); +#endif + kvm_close(kd); + DEXIT; + return -1; + } + for (; nprocs >= 0; nprocs--, procs++) { + for (curr=job_list.next; curr != &job_list; curr=curr->next) { + job_elem = LNK_DATA(curr, job_elem_t, link); + + for (i = 0; i < procs->ki_ngroups; i++) { + if (job_elem->job.jd_jid == procs->ki_groups[i]) { + lnk_link_t *curr2; + proc_elem_t *proc_elem; + int newprocess; + + newprocess = 1; + if (job_elem->job.jd_proccount != 0) { + for (curr2=job_elem->procs.next; curr2 != &job_elem->procs; curr2=curr2->next) { + proc_elem = LNK_DATA(curr2, proc_elem_t, link); + + if (proc_elem->proc.pd_pid == procs->ki_pid) { + newprocess = 0; + break; + } + } + } + if (newprocess) { + proc_elem = malloc(sizeof(proc_elem_t)); + if (proc_elem == NULL) { + kvm_close(kd); + DEXIT; + return 0; + } + + memset(proc_elem, 0, sizeof(proc_elem_t)); + proc_elem->proc.pd_length = sizeof(psProc_t); + proc_elem->proc.pd_state = 1; /* active */ + proc_elem->proc.pd_pstart = procs->ki_start.tv_sec; + + LNK_ADD(job_elem->procs.prev, &proc_elem->link); + job_elem->job.jd_proccount++; + } else { + /* save previous usage data - needed to build delta usage */ + old_time = proc_elem->proc.pd_utime + proc_elem->proc.pd_stime; + old_vmem = proc_elem->vmem; + } + proc_elem->proc.pd_tstamp = time_stamp; + proc_elem->proc.pd_pid = procs->ki_pid; + + proc_elem->proc.pd_utime = procs->ki_rusage.ru_utime.tv_sec; + proc_elem->proc.pd_stime = procs->ki_rusage.ru_stime.tv_sec; + + proc_elem->proc.pd_uid = procs->ki_uid; + proc_elem->proc.pd_gid = procs->ki_rgid; + proc_elem->vmem = procs->ki_size; + proc_elem->rss = procs->ki_rssize; + + proc_elem->mem = ((proc_elem->proc.pd_stime + proc_elem->proc.pd_utime) - old_time) * + (( old_vmem + proc_elem->vmem)/2); + } + } + } + } + + kvm_close(kd); + } #elif defined(NECSX4) || defined(NECSX5) { for (curr=job_list.next; curr != &job_list; curr=curr->next) { @@ -1951,7 +2095,7 @@ } -#elif defined(ALPHA) || defined(LINUX) || defined(SOLARIS) +#elif defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREEBSD) { int proccount; lnk_link_t *currp, *nextp; --- daemons/common/pdc.h.orig Mon Feb 9 06:06:49 2004 +++ daemons/common/pdc.h Thu Apr 13 22:00:01 2006 @@ -187,7 +187,7 @@ int sup_groups_in_proc(void); #endif -#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) +#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREEBSD) void pdc_kill_addgrpid(gid_t, int, tShepherd_trace); #endif --- daemons/common/setosjobid.c.orig Tue May 3 02:18:19 2005 +++ daemons/common/setosjobid.c Thu Apr 13 22:00:01 2006 @@ -126,7 +126,7 @@ sprintf(err_str, "setosjobid: uid = "pid_t_fmt", euid = "pid_t_fmt, getuid(), geteuid()); shepherd_trace(err_str); -# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) /* Read SgeId from config-File and create Addgrpid-File */ { char *cp; --- daemons/execd/exec_job.c.orig Wed Nov 23 03:03:59 2005 +++ daemons/execd/exec_job.c Thu Apr 13 22:06:17 2006 @@ -106,7 +106,7 @@ extern char execd_spool_dir[SGE_PATH_MAX]; #if COMPILE_DC -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) /* local functions */ static int addgrpid_already_in_use(long); static long get_next_addgrpid(lList *, long); @@ -143,7 +143,7 @@ } #if COMPILE_DC -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) static long get_next_addgrpid( lList *rlp, long last_addgrpid @@ -245,7 +245,7 @@ char dce_wrapper_cmd[128]; #if COMPILE_DC -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) static gid_t last_addgrpid; #endif #endif @@ -778,7 +778,7 @@ #ifdef COMPILE_DC -# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +# if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) { lList *rlp = NULL; --- daemons/execd/execd_ck_to_do.c.orig Wed Nov 2 08:03:13 2005 +++ daemons/execd/execd_ck_to_do.c Thu Apr 13 22:07:18 2006 @@ -913,7 +913,7 @@ FILE *fp; SGE_STRUCT_STAT sb; -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) gid_t addgrpid; dstring addgrpid_path = DSTRING_INIT; #else @@ -928,7 +928,7 @@ pe_task_id = lGetString(pe_task, PET_id); } -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) /** ** read additional group id and use it as osjobid **/ --- daemons/execd/ptf.c.orig Tue Nov 22 07:35:00 2005 +++ daemons/execd/ptf.c Thu Apr 13 22:08:27 2006 @@ -44,7 +44,7 @@ #if defined(COMPILE_DC) || defined(MODULE_TEST) -#if defined(IRIX) || defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(NECSX4) || defined(NECSX5) || !defined(MODULE_TEST) +#if defined(IRIX) || defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(NECSX4) || defined(NECSX5) || !defined(MODULE_TEST) || defined(FREEBSD) # define USE_DC #endif @@ -82,7 +82,7 @@ # include #endif -#if defined(ALPHA) || defined(SOLARIS) || defined(LINUX) +#if defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD) # include #endif @@ -217,7 +217,7 @@ static void ptf_setpriority_jobid(lListElem *job, lListElem *osjob, long pri); -#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) +#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD) static void ptf_setpriority_addgrpid(lListElem *job, lListElem *osjob, long pri); @@ -365,7 +365,7 @@ lSetDouble(usage, UA_value, 0); lAppendElem(usage_list, usage); -#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) +#if defined(ALPHA) || defined(LINUX) || defined(SOLARIS) || defined(FREBSD) usage = lCreateElem(UA_Type); lSetString(usage, UA_name, USAGE_ATTR_VMEM); lSetDouble(usage, UA_value, 0); @@ -494,7 +494,7 @@ ptf_setpriority_ash(job, osjob, pri); #elif defined(CRAY) || defined(NECSX4) || defined(NECSX5) ptf_setpriority_jobid(job, osjob, pri); -#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) +#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD) ptf_setpriority_addgrpid(job, osjob, pri); #endif } @@ -713,7 +713,7 @@ DEXIT; } -#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) +#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD) /****** execd/ptf/ptf_setpriority_addgrpid() ********************************** * NAME @@ -724,9 +724,9 @@ * long *pri) * * FUNCTION -* This function is only available for the architecture SOLARIS, ALPHA and -* LINUX. All processes belonging to "job" and "osjob" will get a new i -* priority. +* This function is only available for the architecture SOLARIS, ALPHA, +* LINUX, and FREEBSD. All processes belonging to "job" and "osjob" will +* get a new priority. * * This function assumes the the "max" priority is smaller than the "min" * priority. @@ -1981,7 +1981,7 @@ } } -#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) +#elif defined(ALPHA) || defined(SOLARIS) || defined(LINUX) || defined(FREEBSD) if (getuid() == 0) { if (setpriority(PRIO_PROCESS, getpid(), PTF_MAX_PRIORITY) < 0) { ERROR((SGE_EVENT, MSG_PRIO_SETPRIOFAILED_S, strerror(errno))); --- daemons/shepherd/shepherd.c.orig Mon Jan 1 05:44:56 2007 +++ daemons/shepherd/shepherd.c Mon Feb 5 10:07:37 2007 @@ -2478,9 +2478,9 @@ kill(pid, sig); sge_switch2admin_user(); -#if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(IRIX) +#if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(IRIX) || defined(FREEBSD) if (first_kill == 0 || sig != SIGKILL || is_qrsh == false) { -# if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) +# if defined(SOLARIS) || defined(LINUX) || defined(ALPHA) || defined(FREEBSD) # ifdef COMPILE_DC if (atoi(get_conf_val("enable_addgrp_kill")) == 1) { gid_t add_grp_id; --- libs/uti/sge_uidgid.c.orig Wed Nov 23 03:04:09 2005 +++ libs/uti/sge_uidgid.c Thu Apr 13 22:00:01 2006 @@ -850,7 +850,7 @@ #endif #endif /* WIN32 */ -#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) +#if defined(SOLARIS) || defined(ALPHA) || defined(LINUX) || defined(FREEBSD) /* add Additional group id to current list of groups */ if (add_grp) { if (sge_add_group(add_grp, err_str) == -1) {