Corinna Vinschen
2001-Nov-20 13:01 UTC
[PATCH]: Allow SSHD to install as service under WIndows 9x/Me
Hi, the following patch is a (hopefully least intrusive) extension when sshd is started so that it daemonizes itself. In that case Windows 9x/Me has a slight problem with sshd as soon as the current user logs off. The sshd daemon will be killed as well. Since installing services is very different between NT and 9x, the way used for NT boxes isn't working well for 9x. For that reason several 9x users have asked for a solution which allows _real_ daemonizing sshd on their boxes. The following patch allows to do that. When the function daemon() forks, the child process is registered as a service when started on a 9x system. The functionality is outsourced to bsd-cygwin_util.c, the daemon.c code just contains a conditionalized call to the new function. Hope, that's ok. Additionally I added a patch to contrib/cygwin/README, which just fixes a typo. Thanks in advance, Corinna Index: contrib/cygwin/README ==================================================================RCS file: /cvs/openssh_cvs/contrib/cygwin/README,v retrieving revision 1.6 diff -u -p -r1.6 README --- contrib/cygwin/README 2001/07/18 16:25:42 1.6 +++ contrib/cygwin/README 2001/11/20 12:44:22 @@ -162,7 +162,7 @@ configure are used for the Cygwin binary --prefix=/usr \ --sysconfdir=/etc \ - --libexecdir='${exec_prefix}/sbin \ + --libexecdir='${exec_prefix}/sbin' \ --with-pcre You must have installed the zlib, openssl and regex packages to Index: openbsd-compat/bsd-cygwin_util.c ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.c,v retrieving revision 1.5 diff -u -p -r1.5 bsd-cygwin_util.c --- openbsd-compat/bsd-cygwin_util.c 2001/07/18 16:19:49 1.5 +++ openbsd-compat/bsd-cygwin_util.c 2001/11/20 12:44:23 @@ -139,4 +139,26 @@ int check_ntsec(const char *filename) return 0; } +void register_9x_service(void) +{ + HINSTANCE kerneldll; + DWORD (*RegisterServiceProcess)(DWORD, DWORD); + + /* The service register mechanism in 9x/Me is pretty different from + * NT/2K/XP. In NT/2K/XP we're using a special service starter + * application to register and control sshd as service. This method + * doesn't play nicely with 9x/Me. For that reason we register here + * as service when running under 9x/Me. This function is only called + * by the child sshd when it's going to daemonize. + */ + if (is_winnt) + return; + if (! (kerneldll = LoadLibrary("KERNEL32.DLL"))) + return; + if (! (RegisterServiceProcess = (DWORD (*)(DWORD, DWORD)) + GetProcAddress(kerneldll, "RegisterServiceProcess"))) + return; + RegisterServiceProcess(0, 1); +} + #endif /* HAVE_CYGWIN */ Index: openbsd-compat/bsd-cygwin_util.h ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.h,v retrieving revision 1.4 diff -u -p -r1.4 bsd-cygwin_util.h --- openbsd-compat/bsd-cygwin_util.h 2001/04/13 14:28:43 1.4 +++ openbsd-compat/bsd-cygwin_util.h 2001/11/20 12:44:23 @@ -26,6 +26,7 @@ int binary_open(const char *filename, in int binary_pipe(int fd[2]); int check_nt_auth(int pwd_authenticated, uid_t uid); int check_ntsec(const char *filename); +void register_9x_service(void); #define open binary_open #define pipe binary_pipe Index: openbsd-compat/daemon.c ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/daemon.c,v retrieving revision 1.1 diff -u -p -r1.1 daemon.c --- openbsd-compat/daemon.c 2001/01/31 21:52:03 1.1 +++ openbsd-compat/daemon.c 2001/11/20 12:44:23 @@ -49,6 +49,9 @@ daemon(nochdir, noclose) case -1: return (-1); case 0: +#ifdef HAVE_CYGWIN + register_9x_service(); +#endif break; default: #ifdef HAVE_CYGWIN -- Corinna Vinschen Cygwin Developer Red Hat, Inc. mailto:vinschen at redhat.com
Corinna Vinschen
2001-Nov-20 13:13 UTC
[PATCH]: Allow SSHD to install as service under WIndows 9x/Me
On Tue, Nov 20, 2001 at 02:01:19PM +0100, Corinna Vinschen wrote:> Hi, > > the following patch is a (hopefully least intrusive) extension > when sshd is started so that it daemonizes itself. In that case > Windows 9x/Me has a slight problem with sshd as soon as the current > user logs off. The sshd daemon will be killed as well. Since > installing services is very different between NT and 9x, the way > used for NT boxes isn't working well for 9x. For that reason > several 9x users have asked for a solution which allows _real_ > daemonizing sshd on their boxes. The following patch allows to do that. > > When the function daemon() forks, the child process is registered as a > service when started on a 9x system. The functionality is outsourced > to bsd-cygwin_util.c, the daemon.c code just contains a conditionalized > call to the new function. Hope, that's ok. > > Additionally I added a patch to contrib/cygwin/README, which just fixes > a typo. > > Thanks in advance, > CorinnaSorry. I just found another error in the README and I thought it might be better to add a hint which discribes the new functionality for 9x users. So the following patch substitutes the previous one. Thanks, Corinna Index: contrib/cygwin/README ==================================================================RCS file: /cvs/openssh_cvs/contrib/cygwin/README,v retrieving revision 1.6 diff -u -p -r1.6 README --- contrib/cygwin/README 2001/07/18 16:25:42 1.6 +++ contrib/cygwin/README 2001/11/20 13:12:39 @@ -1,6 +1,14 @@ This package is the actual port of OpenSSH to Cygwin 1.3. ==========================================================================+Important change since 3.0.1p1-2: + +This version introduces the ability to register sshd as service on +Windows 9x/Me systems. This is done only when the options -D and/or +-d are not given. +==========================================================================+ +========================================================================== Important change since 2.9p2: Since Cygwin is able to switch user context without password beginning @@ -162,12 +170,10 @@ configure are used for the Cygwin binary --prefix=/usr \ --sysconfdir=/etc \ - --libexecdir='${exec_prefix}/sbin \ - --with-pcre + --libexecdir='${exec_prefix}/sbin' You must have installed the zlib, openssl and regex packages to -be able to build OpenSSH! The `--with-pcre' option requires -the installation of the pcre package. +be able to build OpenSSH! Please send requests, error reports etc. to cygwin at cygwin.com. Index: openbsd-compat/bsd-cygwin_util.c ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.c,v retrieving revision 1.5 diff -u -p -r1.5 bsd-cygwin_util.c --- openbsd-compat/bsd-cygwin_util.c 2001/07/18 16:19:49 1.5 +++ openbsd-compat/bsd-cygwin_util.c 2001/11/20 13:12:39 @@ -139,4 +139,26 @@ int check_ntsec(const char *filename) return 0; } +void register_9x_service(void) +{ + HINSTANCE kerneldll; + DWORD (*RegisterServiceProcess)(DWORD, DWORD); + + /* The service register mechanism in 9x/Me is pretty different from + * NT/2K/XP. In NT/2K/XP we're using a special service starter + * application to register and control sshd as service. This method + * doesn't play nicely with 9x/Me. For that reason we register here + * as service when running under 9x/Me. This function is only called + * by the child sshd when it's going to daemonize. + */ + if (is_winnt) + return; + if (! (kerneldll = LoadLibrary("KERNEL32.DLL"))) + return; + if (! (RegisterServiceProcess = (DWORD (*)(DWORD, DWORD)) + GetProcAddress(kerneldll, "RegisterServiceProcess"))) + return; + RegisterServiceProcess(0, 1); +} + #endif /* HAVE_CYGWIN */ Index: openbsd-compat/bsd-cygwin_util.h ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/bsd-cygwin_util.h,v retrieving revision 1.4 diff -u -p -r1.4 bsd-cygwin_util.h --- openbsd-compat/bsd-cygwin_util.h 2001/04/13 14:28:43 1.4 +++ openbsd-compat/bsd-cygwin_util.h 2001/11/20 13:12:39 @@ -26,6 +26,7 @@ int binary_open(const char *filename, in int binary_pipe(int fd[2]); int check_nt_auth(int pwd_authenticated, uid_t uid); int check_ntsec(const char *filename); +void register_9x_service(void); #define open binary_open #define pipe binary_pipe Index: openbsd-compat/daemon.c ==================================================================RCS file: /cvs/openssh_cvs/openbsd-compat/daemon.c,v retrieving revision 1.1 diff -u -p -r1.1 daemon.c --- openbsd-compat/daemon.c 2001/01/31 21:52:03 1.1 +++ openbsd-compat/daemon.c 2001/11/20 13:12:39 @@ -49,6 +49,9 @@ daemon(nochdir, noclose) case -1: return (-1); case 0: +#ifdef HAVE_CYGWIN + register_9x_service(); +#endif break; default: #ifdef HAVE_CYGWIN -- Corinna Vinschen Cygwin Developer Red Hat, Inc. mailto:vinschen at redhat.com