1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                  Common Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*            http://www.opensource.org/licenses/cpl1.0.txt             *
11*         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                  David Korn <dgk@research.att.com>                   *
19*                   Phong Vo <kpv@research.att.com>                    *
20*                                                                      *
21***********************************************************************/
22#pragma prototyped
23
24#include <ast.h>
25
26#if _lib_setsid
27
28NoN(setsid)
29
30#else
31
32#include <ast_tty.h>
33#include <error.h>
34
35/*
36 * become new process group leader and drop control tty
37 */
38
39pid_t
40setsid(void)
41{
42	int	pg;
43#ifdef TIOCNOTTY
44	int	fd;
45#endif
46
47	/*
48	 * become a new process group leader
49	 */
50
51	if ((pg = getpid()) == getpgrp())
52	{
53		errno = EPERM;
54		return(-1);
55	}
56	setpgid(pg, pg);
57#ifdef TIOCNOTTY
58
59	/*
60	 * drop the control tty
61	 */
62
63	if ((fd = open("/dev/tty", O_RDONLY)) >= 0)
64	{
65		ioctl(fd, TIOCNOTTY, 0);
66		close(fd);
67	}
68#else
69
70	/*
71	 * second child in s5 to avoid reacquiring the control tty
72	 */
73
74#if _lib_fork && HUH920711 /* some s5's botch this */
75	switch (fork())
76	{
77	case -1:
78		exit(1);
79	case 0:
80		break;
81	default:
82		exit(0);
83	}
84#endif
85
86#endif
87	return(pg);
88}
89
90#endif
91