Thank you for the fix. I tried it and it solves my problem :) As mentioned earlier it would be great if someone could also have a look at the Debian related stuff. It looks like the start/stop script needs some work and I also did not manage to build the Debian package as described in openslp.misc/Readme.debian.
Robert Am 18.10.2012 03:08, schrieb John Calcote: > Hi all – > > I’ve enhanced the daemonizing code in slpd_main.c – my changes are > committed in rev 1692. Basically, I moved the call to Daemonize up above > all the initialization so we don’t open all our socket handles before > daemonizing – this is generally considered standard procedure. > > I then added the loop that Robert wanted that closes the first 8k file > handles. A better way of doing this is to freopen the standard handles > to /dev/null so that someone attempting to write to the handle doesn’t > cause flush to hang on shutdown. Luckily, we don’t use printf in our > production code, so this isn’t really an issue for slpd. > > Finally, I moved the setuid code out of Daemonize into its own routine, > DropPrivileges, and places a call to that function where the call to > Daemonize used to be. The reason Daemonize was called so late was so we > could open our privileged sockets before we drop privs. Another standard > procedure is to daemonize early and drop privs as soon as we can, but no > sooner. > > I’ve built and tested this code on Ubuntu 12.04. It’s a *nix-only source > file, so I don’t think these changes will have any effect on Windows, > but others should give it a try on other Unix platforms. I don’t expect > any problems, but you never know… > > Hope this helps, > > John > > *From:*Nick Wagner [mailto:ne...@wingedbeast.org] > *Sent:* Wednesday, October 17, 2012 9:45 AM > *To:* Robert Hegner > *Cc:* openslp-us...@lists.sourceforge.net; > openslp-devel@lists.sourceforge.net > *Subject:* Re: [Openslp-users] slpd seems to hijack the port I'm using > in my application > > Someone on the devel list with more experience working with linux > daemons will need to make this fix. And they should patch the debian > start-stop script as well as earlier explained in this email chain. We > should do this before the code freeze. > > Robert, thanks for finding these issues! > > --Nick > > On Wed, Oct 17, 2012 at 10:30 AM, Robert Hegner > <rheg...@hsr.ch > <mailto:rheg...@hsr.ch>> wrote: > > Ok I found out what's wrong. And I would consider this as a bug in OpenSLP. > > I'm a Linux newbie but The Linux Programming Interface by Michael > Kerrisk (a great book, by the way) helped me understand what's going on. > > You can see in my first post that when slpd listens to the same port as > my application, it also uses the same file descriptor. > > As I wrote earlier, I use system() to run the start/stop script of slpd. > According to Kerrisk's book, system() is typically implemented using a > combination of fork() (which copies all open file descriptors) and > exec() (which does not close any file descriptors). So slpd inherits my > open file descriptors when I start it from within my application. > > In chapter 37 of his book, Kerrisk also describes the seven steps for > daemonizing a program. Step 6 is: > "Close all open file descriptors that the daemon has inherited from its > parent. (A daemon may need to keep certain inherited file descriptors > open, [...]" > > And he also provides some example code showing how to accomplish this: > > maxfd = sysconf(_SC_OPEN_MAX); > if (maxfd == -1) > maxfd = BD_MAX_CLOSE; // 8192 in his example > for (fd = 0; fd < maxfd; fd++) > close(fd); > > I had a look at the OpenSLP source code and I found that Daemonize() (in > slpd_main.c) does not close all open file descriptors (it only closes > descriptors 0 to 2 under some condition). > > I tried to close all file descriptors in Daemonize() but it seemed to > cause some problems. I guess that slpd has already opened some of its > own sockets at that time, which are then being closed again. > > But adding > > for (i = 3; i < 8192; i++) > close(i); > > at the beginning of main() solves all my problems :) > > Something like this should be in Daemonize() and not at the beginning of > main(), but I guess someone who is familiar with the initialization code > of slpd should have a look at this. > > I hope this change will make it into Release of version 2.0 > > Robert > > > > ------------------------------------------------------------------------------ > Everyone hates slow websites. So do we. > Make your web apps faster with AppDynamics > Download AppDynamics Lite for free today: > http://p.sf.net/sfu/appdyn_sfd2d_oct > > > ------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_sfd2d_oct _______________________________________________ Openslp-devel mailing list Openslp-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openslp-devel