On Fri, Sep 03, 2004 at 01:33:15PM -0400, Alan DeKok wrote: > "Thor Spruyt" <[EMAIL PROTECTED]> wrote: > > I hope the rlm_exec module is going to be changed to enable outputting > > Reject attributes! If you have to run 2 scripts each time, what's the whole > > point of making the module?
> The module can be updated, once patches are supplied. Hmm. How about this, everyone? Current behaviour retained: If the program returns <0, no attributes, RLM_MODULE_FAIL, errorlog If the program returns 0, attributes, RLM_MODULE_OK New behaviour: (Replaces behaviour identical to <0 above) If the program returns 1 through RLM_MODULE_NUMCODES, return the appropriate code and attributes as expected. 1 RLM_MODULE_REJECT, /* immediately reject the request */ 2 RLM_MODULE_FAIL, /* module failed, don't reply */ 3 RLM_MODULE_OK, /* the module is OK, continue */ 4 RLM_MODULE_HANDLED, /* the module handled the request, so stop. */ 5 RLM_MODULE_INVALID, /* the module considers the request invalid. */ 6 RLM_MODULE_USERLOCK, /* reject the request (user is locked out) */ 7 RLM_MODULE_NOTFOUND, /* user not found */ 8 RLM_MODULE_NOOP, /* module succeeded without doing anything */ 9 RLM_MODULE_UPDATED, /* OK (pairs modified) */ If it returns > RLM_MODULE_NUMCODES, return RLM_MODULE_OK. (as for 0) This should work for everyone using 0 = success and -1 = failure, but I'll prolly catch people who're using >0 for failure, which is possible but (slightly) deranged. ^_^; Hopefully this allows everyone to do what they need to do, and we can finally deprecate Exec-Program-Wait and Exec-Program. ^_^ Patch for discussion. I decided to try this route when I couldn't think what to use for a module call that failed but returned attributes. This then leads the question, what return code do we want for when the child process terminates abnormally? (!WIFEXITED or rad_waitpid returns something other than the child's pid)... If we leave it as it is, it's RLM_MODULE_REJECT with the below patch... Would RLM_MODULE_FAIL be better? (Changes return 1 at src/main/exec.c:390 to return 2... This is fine since every caller or radius_exec_program only checks for !=0, except the rlm_exec xlat call which checks <0. Index: rlm_exec.c =================================================================== RCS file: /source/radiusd/src/modules/rlm_exec/rlm_exec.c,v retrieving revision 1.11 diff -u -r1.11 rlm_exec.c --- rlm_exec.c 26 Feb 2004 19:04:32 -0000 1.11 +++ rlm_exec.c 4 Sep 2004 07:41:02 -0000 @@ -332,7 +332,7 @@ result = radius_exec_program(inst->program, request, inst->wait, NULL, 0, *input_pairs, &answer); - if (result != 0) { + if (result < 0) { radlog(L_ERR, "rlm_exec (%s): External script failed", inst->xlat_name); return RLM_MODULE_FAIL; @@ -347,7 +347,10 @@ pairfree(&answer); - return RLM_MODULE_OK; + if (result == 0 || result > RLM_MODULE_NUMCODES) { + return RLM_MODULE_OK; + } + return result-1; } -- Paul "TBBle" Hampson, on an alternate email client. - List info/subscribe/unsubscribe? See http://www.freeradius.org/list/users.html