From 2f332788502685b3d759a5210cb834fbe5ed5f3b Mon Sep 17 00:00:00 2001 From: Hallvard Furuseth Date: Wed, 4 Nov 1998 23:05:02 +0000 Subject: [PATCH] Added lutil_detach() --- libraries/liblutil/Makefile.in | 4 +- libraries/liblutil/detach.c | 97 ++++++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 libraries/liblutil/detach.c diff --git a/libraries/liblutil/Makefile.in b/libraries/liblutil/Makefile.in index 9596b2af7b..80b5420e56 100644 --- a/libraries/liblutil/Makefile.in +++ b/libraries/liblutil/Makefile.in @@ -3,8 +3,8 @@ ## LIBRARY = liblutil.a -SRCS = base64.c md5.c sha1.c -OBJS = base64.o md5.o sha1.o @LIBOBJS@ +SRCS = base64.c md5.c sha1.c detach.c +OBJS = base64.o md5.o sha1.o detach.o @LIBOBJS@ LDAP_INCDIR= ../../include LDAP_LIBDIR= ../../libraries diff --git a/libraries/liblutil/detach.c b/libraries/liblutil/detach.c new file mode 100644 index 0000000000..72ec99741f --- /dev/null +++ b/libraries/liblutil/detach.c @@ -0,0 +1,97 @@ +/* + * Copyright (c) 1990, 1994 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. + */ + +#include "portable.h" + +#include + +#include +#include + +#include +#include +#include +#include +#include + +#include "portable.h" + + +/* I'd really like to make do_close an fd_set, but that isn't portable. */ +void +lutil_detach( int debug, int do_close ) +{ + int i, sd, nbits; + +#ifdef HAVE_SYSCONF + nbits = sysconf( _SC_OPEN_MAX ); +#elif HAVE_GETDTABLESIZE + nbits = getdtablesize(); +#else + nbits = FD_SETSIZE; +#endif + +#ifdef FD_SETSIZE + if ( nbits > FD_SETSIZE ) { + nbits = FD_SETSIZE; + } +#endif /* FD_SETSIZE */ + + if ( debug == 0 ) { + for ( i = 0; i < 5; i++ ) { +#if HAVE_THR + switch ( fork1() ) +#else + switch ( fork() ) +#endif + { + case -1: + sleep( 5 ); + continue; + + case 0: + break; + + default: + _exit( 0 ); + } + break; + } + + if ( do_close ) + for ( i = 3; i < nbits; i++ ) + close( i ); + + (void) chdir( "/" ); + + if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) { + perror( "/dev/null" ); + exit( 1 ); + } + for ( i = 0; i < 3; i++ ) + if ( sd != i && isatty( i ) ) + (void) dup2( sd, i ); + if ( sd > 2 ) + close( sd ); + +#ifdef HAVE_SETSID + (void) setsid(); +#else /* HAVE_SETSID */ + if ( (sd = open( "/dev/tty", O_RDWR )) != -1 ) { + (void) ioctl( sd, TIOCNOTTY, NULL ); + (void) close( sd ); + } +#endif /* HAVE_SETSID */ + } + + (void) SIGNAL( SIGPIPE, SIG_IGN ); +} -- 2.39.5