On Mit, 02 Apr 2003 at 01:07 (+0200), David Haller wrote: [...]
Was das "sichern" usw. von TZ angeht:
==== #include
#include int main(int argc, char * argv[]) { char * TZ; char * oldTZ;
/* save old string */ TZ = getenv("TZ"); oldTZ = TZ; printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
/* set new string */ printf("setenv = %i\n", setenv("TZ", "UTC", 1)); TZ = getenv("TZ"); printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
/* restore original string */ printf("setenv = %i\n", setenv("TZ", oldTZ, 1)); TZ = getenv("TZ"); printf("%p: '%s'\n%p: '%s'\n", TZ, TZ, oldTZ, oldTZ);
return 0; } ====
Hm, das ist IMHO nicht sauber.
Zur Verdeutlichung nochmal (was ich auch mit dem Zitat aus dem
tzset-Manual meinte):
jan@k500:~> export TZ=
jan@k500:~> date
Mit Apr 2 19:48:44 UTC 2003
jan@k500:~> unset TZ
jan@k500:~> date
Mit Apr 2 21:48:51 CEST 2003
Es ist also nicht egal, ob TZ gesetzt und leer ist oder ob TZ nicht
gesetzt ist. Bei Deinem Programm passiert nun folgendes:
jan@k500:~/tmp> export TZ=
jan@k500:~/tmp> ./tz
0xbffff720: ''
0xbffff720: ''
setenv = 0
0x8049783: 'UTC'
0xbffff720: ''
setenv = 0
0x80497ab: ''
0xbffff720: ''
OK, soweit in Ordnung, der Zustand ist wieder der alte. Aber:
jan@k500:~/tmp> unset TZ
jan@k500:~/tmp> ./tz
(nil): '(null)'
(nil): '(null)'
setenv = 0
0x8049883: 'UTC'
(nil): '(null)'
setenv = 0
0x80498ab: ''
(nil): '(null)'
Jetzt haben wir auf einmal ein TZ und damit nicht mehr den alten
Zustand. BTW: In Solaris z. B. kriegst Du IIRC postwendend einen
segfault, wenn Du einen Null-Pointer in einer Zuweisung benutzt.
Ich habe mal Peters Idee aufgegriffen und Dein Programm ein wenig
erweitert:
<schnipp>
#include