At 9:19 -0500 11/11/08, Karl Moskowski wrote:
I had hoped that KeepAlive={NetworkState=true} would automatically start & stop the daemon with the network being connected & disconnected. Since that seems to be incorrect, I guess I have to make it launch at startup and keep running. I can programmatically check if the network is available (using SystemConfiguration notifications, I think, unless there's a better way), and start/stop activity appropriately.
"NetworkState" is a very clumsy switch. For example, it doesn't distinguish between normal IP addresses and link-local IP addresses. I suggest you use this in concert with your System Configuration framework code. That is, use "NetworkState" to allow you to completely shut down when the user has no networking then, when you are launched, use SCF to decide whether to actually try connecting or not. Earlier you wrote:
- launchd loads the daemon as soon as the network interface is available, before it has a valid IP address.
Seems unlikely to me. It may be that the interface has a valid IPv6 address (the link local one, which arrives very quickly), but not a valid IPv4 address (which typically comes from DHCP, and thus arrives very slowly). You can see the exact criteria that launchd uses to determine whether the network is up or down by looking at the get_network_state in "launchd.c". <http://www.opensource.apple.com/darwinsource/10.5.5/launchd-258.18/launchd/src/launchd.c> [This link may require an APSL <http://www.opensource.apple.com/apsl/> account.]
- launchd loads the daemon at boot if any network interfaces are connected (e.g., Parallels ports)
Does "Parallels ports" mean that that you have Parallels installed? If so, their network virtualisation is probably installing interfaces that are messing things up. Like I said, "NetworkState" is a very clumsy switch |-:
- launchd doesn't unload the daemon automatically if the network goes down
That's expected behaviour. "KeepAlive" controls when launchd starts your job; stopping your job is your problem. If you want to stop when the network goes away, just use SCF to monitor the network state and, if it goes away and stays away for a reasonable period of time, exit the process. S+E -- Quinn "The Eskimo!" <http://www.apple.com/developer/> Apple Developer Relations, Developer Technical Support, Core OS/Hardware