[PATCH]: Allow SSHD to install as service under WIndows 9x/Me

Corinna Vinschen vinschen at redhat.com
Tue Nov 27 00:13:54 EST 2001


Hi,

did anybody with CVS write access look into this patch?  It would
be nice to get that included with 3.0.1p2 or 3.0.2p1.

Corinna

On Tue, Nov 20, 2001 at 02:13:59PM +0100, Corinna Vinschen wrote:
> 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,
> > Corinna
> 
> Sorry.  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

-- 
Corinna Vinschen
Cygwin Developer
Red Hat, Inc.
mailto:vinschen at redhat.com



More information about the openssh-unix-dev mailing list