/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
 *  Authors: Jeffrey Stedfast <fejj@ximian.com>
 *
 *  Copyright 2003 Ximian, Inc. (www.ximian.com)
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
 *
 */


#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <unistd.h>
#include <fcntl.h>
#include <errno.h>

#include "camel-process.h"


pid_t
camel_process_fork (const char *path, char **argv, int *infd, int *outfd, int *errfd, CamelException *ex)
{
	int errnosav, fd[6], i;
	pid_t pid;
	
	for (i = 0; i < 6; i++)
		fds[i] = -1;
	
	for (i = 0; i < 6; i += 2) {
		if (pipe (fd + i) == -1) {
			errnosav = errno;
			camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
					      _("Failed to create pipe to '%s': %s"),
					      argv[0], strerror (errno));
			
			for (i = 0; i < 6; i++) {
				if (fd[i] == -1)
					break;
				close (fd[i]);
			}
			
			errno = errnosav;
			
			return -1;
		}
	}
	
	if (!(pid = fork ())) {
		/* child process */
		int maxfd, nullfd = -1;
		
		if (!outfd || !errfd)
			nullfd = open ("/dev/null", O_WRONLY);
		
		if (dup2 (fd[0], STDIN_FILENO) == -1)
			_exit (255);
		
		if (dup2 (outfd ? fd[3] : nullfd, STDOUT_FILENO) == -1)
			_exit (255);
		
		if (dup2 (errfd ? fd[5] : nullfd, STDERR_FILENO) == -1)
			_exit (255);
		
		setsid ();
		
		if ((maxfd = sysconf (_SC_OPEN_MAX)) > 0) {
			for (i = 0; i < maxfd; i++) {
				if (i != STDIN_FILENO && i != STDOUT_FILENO && i != STDERR_FILENO)
					close (i);
			}
		}
		
		execv (path, argv);
		_exit (255);
	} else if (pid == -1) {
		camel_exception_setv (ex, CAMEL_EXCEPTION_SYSTEM,
				      _("Failed to create create child process '%s': %s"),
				      argv[0], strerror (errno));
		return -1;
	}
	
	/* parent process */
	close (fd[0]);
	close (fd[3]);
	close (fd[5]);
	
	if (infd)
		*infd = fd[1];
	else
		close (fd[1]);
	
	if (outfd)
		*outfd = fd[2];
	else
		close (fd[2]);
	
	if (errfd)
		*errfd = fd[4];
	else
		close (fd[4]);
	
	return pid;
}


int
camel_process_wait (pid_t pid)
{
	sigset_t mask, omask;
	int status;
	pid_t r;
	
	sigemptyset (&mask);
	sigaddset (&mask, SIGALRM);
	sigprocmask (SIG_BLOCK, &mask, &omask);
	alarm (1);
	
	r = waitpid (pid, &status, 0);
	
	alarm (0);
	sigprocmask (SIG_SETMASK, &omask, NULL);
	
	if (r == (pid_t) -1 && errno == EINTR) {
		kill (pid, SIGTERM);
		sleep (1);
		r = waitpid (pid, &status, WNOHANG);
		if (r == (pid_t) 0) {
			kill (pid, SIGKILL);
			sleep (1);
			r = waitpid (pid, &status, WNOHANG);
		}
	}
	
	if (r != (pid_t) -1 && WIFEXITED (status))
		return WEXITSTATUS (status);
	else
		return -1;
}
6.5.3</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4'>dependabot/npm_and_yarn/devel/electron6/files/elliptic-6.5.4</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8'>dependabot/npm_and_yarn/devel/electron6/files/ini-1.3.8</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19'>dependabot/npm_and_yarn/devel/electron6/files/lodash-4.17.19</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2'>dependabot/npm_and_yarn/devel/electron6/files/lodash.merge-4.6.2</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1'>dependabot/npm_and_yarn/devel/electron6/files/node-fetch-2.6.1</option>
<option value='dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2'>dependabot/npm_and_yarn/devel/electron6/files/serve-10.1.2</option>
<option value='gnome-3.22'>gnome-3.22</option>
<option value='gnome-3.24'>gnome-3.24</option>
<option value='gnome-3.26'>gnome-3.26</option>
<option value='gnome-3.28'>gnome-3.28</option>
<option value='gnome-3.32'>gnome-3.32</option>
<option value='gnome-3.36'>gnome-3.36</option>
<option value='gstreamer'>gstreamer</option>
<option value='gstreamer-1.16'>gstreamer-1.16</option>
<option value='gstreamer0.10-removal' selected='selected'>gstreamer0.10-removal</option>
<option value='main'>main</option>
<option value='master'>master</option>
<option value='mate-1.16'>mate-1.16</option>
<option value='mate-1.18'>mate-1.18</option>
<option value='mate-1.20'>mate-1.20</option>
<option value='mate-1.22'>mate-1.22</option>
</select> <input type='submit' value='switch'/></form></td></tr>
<tr><td class='sub'>FreeBSD GNOME current development ports (https://github.com/freebsd/freebsd-ports-gnome)</td><td class='sub right'></td></tr></table>
<table class='tabs'><tr><td>
<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/about/?h=gstreamer0.10-removal'>about</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/?h=gstreamer0.10-removal'>summary</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/refs/?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>refs</a><a class='active' href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/java/jakarta-commons-pool?h=gstreamer0.10-removal'>log</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/tree/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>tree</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>commit</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/diff/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>diff</a><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/stats/java/jakarta-commons-pool?h=gstreamer0.10-removal'>stats</a></td><td class='form'><form class='right' method='get' action='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/java/jakarta-commons-pool'>
<input type='hidden' name='h' value='gstreamer0.10-removal'/><input type='hidden' name='id' value='239790ea3743cd753161cb6bc1fcacf592bd5ae6'/><select name='qt'>
<option value='grep'>log msg</option>
<option value='author'>author</option>
<option value='committer'>committer</option>
<option value='range'>range</option>
</select>
<input class='txt' type='search' size='10' name='q' value=''/>
<input type='submit' value='search'/>
</form>
</td></tr></table>
<div class='path'>path: <a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>root</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/java?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>java</a>/<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6'>jakarta-commons-pool</a></div><div class='content'><table class='list nowrap'><tr class='nohover'><th></th><th class='left'>Commit message (<a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/log/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=239790ea3743cd753161cb6bc1fcacf592bd5ae6&amp;showmsg=1'>Expand</a>)</th><th class='left'>Author</th><th class='left'>Age</th><th class='left'>Files</th><th class='left'>Lines</th></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=1b9b2a88f8c1ca58432d0ed99a05fe94185f725e'>Apache Commons project are no longer hosted under MASTER_SITES_APACHE</a></td><td>ehaupt</td><td><span title='2008-02-27 23:10:54 +0800'>2008-02-27</span></td><td>1</td><td><span class='deletions'>-2</span>/<span class='insertions'>+2</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=87f4d471fb27b9547c1a0de221b51f4c31684157'>- Welcome X.org 7.2 \o/.</a></td><td>flz</td><td><span title='2007-05-20 04:36:56 +0800'>2007-05-20</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=42a70aa12ba9c3d634f7807b618a14ebf85f22c5'>Update to 1.3.</a></td><td>stefan</td><td><span title='2006-06-09 00:51:59 +0800'>2006-06-09</span></td><td>3</td><td><span class='deletions'>-47</span>/<span class='insertions'>+7</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=835cd3814bc4ac55bb09be5cef8e0709cbd78e19'>Solve JDK 1.5 incompatibility.</a></td><td>stefan</td><td><span title='2006-05-21 21:27:53 +0800'>2006-05-21</span></td><td>2</td><td><span class='deletions'>-2</span>/<span class='insertions'>+33</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=20dca57b87c36e8896568e78616c585ea9559f79'>BROKEN: Does not compile</a></td><td>kris</td><td><span title='2006-04-23 06:25:04 +0800'>2006-04-23</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+2</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=52a9ad99d9581d49a45d5e5beba9049037715163'>SHA256ify</a></td><td>edwin</td><td><span title='2006-01-22 20:42:24 +0800'>2006-01-22</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=1c0284d5c68858a3994e3015d0f1581457debcff'>- Update to bsd.java.mk 2.0 [1]</a></td><td>hq</td><td><span title='2005-01-18 17:09:42 +0800'>2005-01-18</span></td><td>3</td><td><span class='deletions'>-23</span>/<span class='insertions'>+25</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=0c2df36f41efdaec5f3a0ffa6c4018b823a19695'>. Update to 1.2 [1]</a></td><td>glewis</td><td><span title='2004-07-26 13:37:19 +0800'>2004-07-26</span></td><td>3</td><td><span class='deletions'>-8</span>/<span class='insertions'>+6</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=f0d34a787d1e35f19b8a62c99a2d72ecac8b20b9'>SIZEify.</a></td><td>clement</td><td><span title='2004-03-22 20:07:27 +0800'>2004-03-22</span></td><td>1</td><td><span class='deletions'>-0</span>/<span class='insertions'>+1</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=794ee1dc7040bf35ee7d43e83a44adb6daa6a438'>. Unbreak the build after the recent changes to ant.  I've done it slightly</a></td><td>glewis</td><td><span title='2004-01-23 14:26:08 +0800'>2004-01-23</span></td><td>1</td><td><span class='deletions'>-1</span>/<span class='insertions'>+2</span></td></tr>
<tr><td class='commitgraph'>* </td><td><a href='/~lantw44/cgit/cgit.cgi/freebsd-ports-gnome/commit/java/jakarta-commons-pool?h=gstreamer0.10-removal&amp;id=6d80cd11f3fca5b8676858f071af4895981bda79'>. Simplify the packing list [1]</a></td><td>glewis</td><td><span title='2003-11-21 07:21:26 +0800'>2003-11-21</span></td><td>2</td><td><span class='deletions'>-43</span>/<span class='insertions'>+3</span></td></tr>