]> git.sur5r.net Git - openldap/blob - clients/gopher/detach.c
Initial revision
[openldap] / clients / gopher / detach.c
1 /*
2  * Copyright (c) 1990, 1994 Regents of the University of Michigan.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms are permitted
6  * provided that this notice is preserved and that due credit is given
7  * to the University of Michigan at Ann Arbor. The name of the University
8  * may not be used to endorse or promote products derived from this
9  * software without specific prior written permission. This software
10  * is provided ``as is'' without express or implied warranty.
11  */
12
13 #include <stdio.h>
14 #include <sys/types.h>
15 #include <sys/file.h>
16 #include <sys/ioctl.h>
17 #include <fcntl.h>
18 #include <signal.h>
19 #include "portable.h"
20
21 #ifdef USE_SYSCONF
22 #include <unistd.h>
23 #endif /* USE_SYSCONF */
24
25 detach( debug )
26 int     debug;
27 {
28         int     i, sd, nbits;
29
30 #ifdef USE_SYSCONF
31         nbits = sysconf( _SC_OPEN_MAX );
32 #else /* USE_SYSCONF */
33         nbits = getdtablesize();
34 #endif /* USE_SYSCONF */
35
36         if ( debug == 0 || !(isatty( 1 )) ) {
37                 for ( i = 0; i < 5; i++ ) {
38                         switch ( fork() ) {
39                         case -1:
40                                 sleep( 5 );
41                                 continue;
42
43                         case 0:
44                                 break;
45
46                         default:
47                                 _exit( 0 );
48                         }
49                         break;
50                 }
51
52                 for ( i = 3; i < nbits; i++ )
53                         close( i );
54
55                 (void) chdir( "/" );
56
57                 if ( (sd = open( "/dev/null", O_RDWR )) == -1 ) {
58                         if ( debug ) perror( "/dev/null" );
59                         exit( 1 );
60                 }
61                 if ( isatty( 0 ) )
62                         (void) dup2( sd, 0 );
63                 if ( isatty( 1 ) )
64                         (void) dup2( sd, 1 );
65                 if ( isatty(2) )
66                         (void) dup2( sd, 2 );
67                 close( sd );
68
69 #ifdef USE_SETSID
70                 (void) setsid();
71 #else /* USE_SETSID */
72                 if ( (sd = open( "/dev/tty", O_RDWR )) != -1 ) {
73                         (void) ioctl( sd, TIOCNOTTY, NULL );
74                         (void) close( sd );
75                 }
76 #endif /* USE_SETSID */
77         } 
78
79         (void) signal( SIGPIPE, SIG_IGN );
80 }