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 * Glenn Fowler 254887Schin * AT&T Research 264887Schin * 274887Schin * close a proc opened by procopen() 284887Schin * otherwise exit() status of process is returned 294887Schin */ 304887Schin 314887Schin #include "proclib.h" 324887Schin 334887Schin #include <wait.h> 344887Schin 354887Schin int procclose(register Proc_t * p)364887Schinprocclose(register Proc_t* p) 374887Schin { 384887Schin int pid; 394887Schin int flags = 0; 404887Schin int status = -1; 414887Schin 424887Schin if (p) 434887Schin { 444887Schin if (p->rfd >= 0) 454887Schin close(p->rfd); 464887Schin if (p->wfd >= 0 && p->wfd != p->rfd) 474887Schin close(p->wfd); 484887Schin if (p->flags & PROC_ZOMBIE) 494887Schin { 504887Schin /* 514887Schin * process may leave a zombie behind 524887Schin * give it a chance to do that but 534887Schin * don't hang waiting for it 544887Schin */ 554887Schin 564887Schin flags |= WNOHANG; 574887Schin sleep(1); 584887Schin } 594887Schin if (!(p->flags & PROC_FOREGROUND)) 604887Schin sigcritical(SIG_REG_EXEC|SIG_REG_PROC); 614887Schin while ((pid = waitpid(p->pid, &status, flags)) == -1 && errno == EINTR); 624887Schin if (pid != p->pid && (flags & WNOHANG)) 634887Schin status = 0; 644887Schin if (!(p->flags & PROC_FOREGROUND)) 654887Schin sigcritical(0); 664887Schin else 674887Schin { 688462SApril.Chin@Sun.COM if (p->sigint != SIG_IGN) 698462SApril.Chin@Sun.COM signal(SIGINT, p->sigint); 708462SApril.Chin@Sun.COM if (p->sigquit != SIG_IGN) 718462SApril.Chin@Sun.COM signal(SIGQUIT, p->sigquit); 724887Schin #if defined(SIGCHLD) 734887Schin #if _lib_sigprocmask 744887Schin sigprocmask(SIG_SETMASK, &p->mask, NiL); 754887Schin #else 764887Schin #if _lib_sigsetmask 774887Schin sigsetmask(p->mask); 788462SApril.Chin@Sun.COM #else 798462SApril.Chin@Sun.COM if (p->sigchld != SIG_DFL) 808462SApril.Chin@Sun.COM signal(SIGCHLD, p->sigchld); 814887Schin #endif 824887Schin #endif 834887Schin #endif 844887Schin } 854887Schin status = status == -1 ? 864887Schin EXIT_QUIT : 874887Schin WIFSIGNALED(status) ? 884887Schin EXIT_TERM(WTERMSIG(status)) : 894887Schin EXIT_CODE(WEXITSTATUS(status)); 904887Schin procfree(p); 914887Schin } 924887Schin else 934887Schin status = errno == ENOENT ? EXIT_NOTFOUND : EXIT_NOEXEC; 944887Schin return status; 954887Schin } 96