h.b.furuseth@usit.uio.no wrote:
Full_Name: Hallvard B Furuseth Version: HEAD, RE24 OS: URL: Submission from: (NULL) (129.240.6.233) Submitted by: hallvard
Signal handlers slapd/daemon.c:slap_sig_shutdown()/slap_sig_wake() need to save/restore errno, since they call functions that can modify errno.
And/or possibly they need sock_errno() - sock_errset() from ac/socket.h, since they use tcp_write()? I don't know if that's safe inside signal handlers, or if Windows itself saves/restores this code around signal handlers.
Windows doesn't really have signals in the first place. SIGTERM/SIGINT are simulated by the C runtime library, none of the other signals are really supported... All of the "support" is synchronous only - can only be invoked by raise(). I don't think there's any issue here.
(An exception - I wrote a patch for the MSYS 1.11 runtime to propagate SIGINT/SIGTERM to other processes. The patch only works on win32, not win64 because I never got a decent win64 build environment working... But if you're using MSYS, it is possible to send these signals to a running slapd and have it shutdown cleanly. Otherwise, signals don't really exist for native Windows apps...)
slapd/main.c:wait4child() can loop forever after EINTR, since it checks for errno even when the waitpid returns 0. I don't know if there is a good reason it does that. Some of the commits have my name on them but I think I copied it from elsewhere.
Anyway, I'm doing the minimal changes now: save/restore errno, and set errno=0 in each loop iteration instead of before the loop. Anyone with better ideas can take it from there.
Good enough. Closing this ITS.