Joe Maimon wrote:
That makes more sense.
Please try the attached patch. It turns out that the only calls to rad_fork() are in src/main, and everything else calls radius_exec_program(). Alan DeKok. -- http://deployingradius.com - The web site of the book http://deployingradius.com/blog/ - The blog Index: src/include/radiusd.h =================================================================== RCS file: /source/radiusd/src/include/radiusd.h,v retrieving revision 1.156.2.4 diff -u -r1.156.2.4 radiusd.h --- src/include/radiusd.h 11 Apr 2005 23:45:21 -0000 1.156.2.4 +++ src/include/radiusd.h 18 Jan 2007 15:05:15 -0000 @@ -405,7 +405,7 @@ extern int thread_pool_init(void); extern int thread_pool_clean(time_t now); extern int thread_pool_addrequest(REQUEST *, RAD_REQUEST_FUNP); -extern pid_t rad_fork(int exec_wait); +extern pid_t rad_fork(void); extern pid_t rad_waitpid(pid_t pid, int *status, int options); extern int total_active_threads(void); Index: src/main/threads.c =================================================================== RCS file: /source/radiusd/src/main/threads.c,v retrieving revision 1.77.2.7 diff -u -r1.77.2.7 threads.c --- src/main/threads.c 17 Oct 2005 18:38:07 -0000 1.77.2.7 +++ src/main/threads.c 18 Jan 2007 15:05:15 -0000 @@ -982,12 +982,10 @@ /* * Thread wrapper for fork(). */ -pid_t rad_fork(int exec_wait) +pid_t rad_fork(void) { pid_t child_pid; - if (exec_wait) return fork(); - /* * Ensure that children are reaped always. */ Index: src/main/exec.c =================================================================== RCS file: /source/radiusd/src/main/exec.c,v retrieving revision 1.42.2.1.2.2 diff -u -r1.42.2.1.2.2 exec.c --- src/main/exec.c 6 Oct 2006 23:39:21 -0000 1.42.2.1.2.2 +++ src/main/exec.c 18 Jan 2007 15:05:16 -0000 @@ -311,7 +311,13 @@ output_pairs = NULL; } - if ((pid = rad_fork(exec_wait)) == 0) { + if (exec_wait) { + pid = rad_fork(); /* remember PID */ + } else { + pid = fork(); /* don't wait */ + } + + if (pid == 0) { #define MAX_ENVP 1024 int devnull; char *envp[MAX_ENVP]; Index: src/main/session.c =================================================================== RCS file: /source/radiusd/src/main/session.c,v retrieving revision 1.21.2.1.2.1 diff -u -r1.21.2.1.2.1 session.c --- src/main/session.c 24 Mar 2006 17:54:57 -0000 1.21.2.1.2.1 +++ src/main/session.c 18 Jan 2007 15:05:16 -0000 @@ -155,7 +155,7 @@ /* * Fork. */ - if ((pid = rad_fork(1)) < 0) { /* do wait for the fork'd result */ + if ((pid = rad_fork()) < 0) { /* do wait for the fork'd result */ radlog(L_ERR, "Accounting: Failed in fork(): Cannot run checkrad\n"); return -1; }