14887Schin /*********************************************************************** 24887Schin * * 34887Schin * This software is part of the ast package * 4*12068SRoger.Faulkner@Oracle.COM * Copyright (c) 1985-2010 AT&T Intellectual Property * 54887Schin * and is licensed under the * 64887Schin * Common Public License, Version 1.0 * 78462SApril.Chin@Sun.COM * by AT&T Intellectual Property * 84887Schin * * 94887Schin * A copy of the License is available at * 104887Schin * http://www.opensource.org/licenses/cpl1.0.txt * 114887Schin * (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 124887Schin * * 134887Schin * Information and Software Systems Research * 144887Schin * AT&T Research * 154887Schin * Florham Park NJ * 164887Schin * * 174887Schin * Glenn Fowler <gsf@research.att.com> * 184887Schin * David Korn <dgk@research.att.com> * 194887Schin * Phong Vo <kpv@research.att.com> * 204887Schin * * 214887Schin ***********************************************************************/ 224887Schin #pragma prototyped 234887Schin 244887Schin #include <ast.h> 254887Schin 264887Schin #if _lib_setsid 274887Schin 284887Schin NoN(setsid) 294887Schin 304887Schin #else 314887Schin 324887Schin #include <ast_tty.h> 334887Schin #include <error.h> 344887Schin 354887Schin /* 364887Schin * become new process group leader and drop control tty 374887Schin */ 384887Schin 394887Schin pid_t 404887Schin setsid(void) 414887Schin { 424887Schin int pg; 434887Schin #ifdef TIOCNOTTY 444887Schin int fd; 454887Schin #endif 464887Schin 474887Schin /* 484887Schin * become a new process group leader 494887Schin */ 504887Schin 514887Schin if ((pg = getpid()) == getpgrp()) 524887Schin { 534887Schin errno = EPERM; 544887Schin return(-1); 554887Schin } 564887Schin setpgid(pg, pg); 574887Schin #ifdef TIOCNOTTY 584887Schin 594887Schin /* 604887Schin * drop the control tty 614887Schin */ 624887Schin 634887Schin if ((fd = open("/dev/tty", O_RDONLY)) >= 0) 644887Schin { 654887Schin ioctl(fd, TIOCNOTTY, 0); 664887Schin close(fd); 674887Schin } 684887Schin #else 694887Schin 704887Schin /* 714887Schin * second child in s5 to avoid reacquiring the control tty 724887Schin */ 734887Schin 744887Schin #if _lib_fork && HUH920711 /* some s5's botch this */ 754887Schin switch (fork()) 764887Schin { 774887Schin case -1: 784887Schin exit(1); 794887Schin case 0: 804887Schin break; 814887Schin default: 824887Schin exit(0); 834887Schin } 844887Schin #endif 854887Schin 864887Schin #endif 874887Schin return(pg); 884887Schin } 894887Schin 904887Schin #endif 91