ADD_FUNCTION("getenv", f_system_getenv, tFunc(tStr, tOr(tStr, tInt)),
You don't need tOr(tStr, tInt) just because the function can return 0. 0 is a valid value for tStr, and every other type as well (except float (Hi Al! :) ).
/ Marcus Comstedt (ACROSS) (Hail Ilpalazzo!)
Previous text:
2003-10-16 21:06: Subject: putenv/getenv
I've cobbled together a System.putenv() and System.getenv(), but I'm having some odd problems. The code itself works most of the time, but randomly getenv() fails to get an envvar I've putenv()ed (ie getenv(2) returns NULL). The functions are below, along with a short test script that demonstrates the problem. Any suggestions are welcome, as my C skills are quite rusty.
Bill
in modules/system/system.c:
#include <stdlib.h> static void f_system_putenv(INT32 args) { int rv; char *envvar; get_all_args("putenv", args, "%s", &envvar); pop_n_elems(args); rv=putenv(envvar); push_int(rv); }
static void f_system_getenv(INT32 args) { char *rv; char *envvar; get_all_args("getenv", args, "%s", &envvar); pop_n_elems(args); rv=getenv(envvar); if(rv==NULL) push_int(0); else push_text(rv); }
and later:
ADD_FUNCTION("putenv", f_system_putenv, tFunc(tStr, tInt), 0); ADD_FUNCTION("getenv", f_system_getenv, tFunc(tStr, tOr(tStr, tInt)), 0);
test script:
int fail=0; int main() { string var="DISPLAY"; string val="BASE"; int a='A'; for(int i=0; i<2050; i++) { val+=String.int2char(a); werror("iteration " + i + "\n"); doit(var,val); } werror("failures: " + fail + "\n"); return 1; } void doit(string var, string val) { if(System.putenv(var+"="+ val)) werror("failed putenv\n"); string r=System.getenv(var); if(r!=val) { fail++; }
The test fails consistently and in the same locations for a given environment variable. The manpage doesn't say what might cause failures like this.
Any thoughts?
Bill
/ Brevbäraren