sbsv2/raptor/util/talon/process.c
changeset 3 e1eecf4d390d
parent 0 044383f39525
child 237 dd11681bd6f3
--- a/sbsv2/raptor/util/talon/process.c	Wed Oct 28 14:39:48 2009 +0000
+++ b/sbsv2/raptor/util/talon/process.c	Mon Nov 16 09:46:46 2009 +0000
@@ -1,203 +1,203 @@
-/*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: 
-*
-*/
-
-
-
-
-#include <unistd.h>
-
-#include "process.h"
-#include "buffer.h"
-#include <stdlib.h>
-#include <string.h>
-#include <poll.h>
-#include <signal.h>
-#include <errno.h>
-#include <sys/wait.h>
-
-#include "log.h"
-
-
-proc *process_new(void)
-{
-	proc *p = malloc(sizeof(proc));
-	p->output = buffer_new();
-	if (!p->output)
-	{
-		free(p);
-		return  NULL;
-	}
-	p->starttime = 0;
-	p->endtime = 0;
-	p->returncode = 1;
-	p->pid = 0;
-	p->causeofdeath = PROC_NORMALDEATH;
-
-	return p;
-}
-
-void childsig(int sig)
-{
-	//wait(&stat_loc);
-	DEBUG(("SIGCHLD\n"));
-}
-
-struct sigaction child_action;
-
-proc *process_run(char executable[], char *args[], int timeout)
-{
-	proc *p = process_new();
-
-	if (p == NULL)
-		return NULL;
-
-	char *text;
-	int status;
-	int stdout_p[2];
-	int stderr_p[2];
-
-	child_action.sa_handler = childsig;
-	sigemptyset (&child_action.sa_mask);
-	child_action.sa_flags = 0;
-	sigaction (SIGCHLD, &child_action, NULL);
-	
-	pipe(stdout_p);
-	pipe(stderr_p);
-
-	pid_t child = fork();
-	if (child == 0)
-	{
-		close(stdout_p[0]);
-		dup2(stdout_p[1], 1);
-		close(stdout_p[1]);
-		
-		close(stderr_p[0]);
-		dup2(stderr_p[1], 2);
-		close(stderr_p[1]);
-
-		execvp(executable, args);
-		exit(1);
-	} else if (child == -1) {
-		p->causeofdeath = PROC_SOMEODDDEATH;
-		return p;
-	}
-	else
-	{
-		close(stdout_p[1]);
-		close(stderr_p[1]);
-		p->pid = child;
-		DEBUG(("child running\n"));
-	}
-
-	struct pollfd pf[2];
-
-	int pv;
-	int have_status = 0;
-	do
-	{
-		pf[0].fd = stdout_p[0];
-		pf[1].fd = stderr_p[0];
-		pf[0].events = POLLIN;
-		pf[0].revents = 0;
-		pf[1].events = POLLIN;
-		pf[1].revents = 0;
-		DEBUG(("polling\n"));
-	       	pv = poll(pf, 2, timeout);
-		DEBUG(("polled %d\n", pv));
-		if (pv == -1)
-		{
-		       	if (errno == EAGAIN)
-			{
-				errno = 0;
-				DEBUG(("errno: \n"));
-				continue;
-			} else {
-				/* EINVAL - can't poll */
-				process_free(&p);
-				return NULL;
-			}
-		} else if (pv == 0 ) {
-			/* timeout */
-			DEBUG(("timeout: \n"));
-			kill(p->pid, SIGTERM);
-			p->causeofdeath = PROC_TIMEOUTDEATH;
-			break;
-		}
-		
-		if (pf[0].revents & POLLIN )
-		{
-			char *space = buffer_makespace(p->output, 1024);
-			int nbytes = read(pf[0].fd, space, 1024);
-			if (nbytes < 0)
-				break;
-			buffer_usespace(p->output, nbytes);
-		}
-		if (pf[1].revents & POLLIN )
-		{
-			char *space = buffer_makespace(p->output, 1024);
-			int nbytes = read(pf[1].fd, space, 1024);
-			if (nbytes < 0)
-				break;
-			buffer_usespace(p->output, nbytes);
-		}
-		if  (pf[0].revents & (POLLERR | POLLHUP | POLLNVAL))
-		{
-			DEBUG(("stdout: pollerr %d\n", pf[0].revents));
-			break;
-		}
-		
-		if (  pf[1].revents & (POLLERR | POLLHUP | POLLNVAL)) 
-		{
-			DEBUG(("stderr: pollerr %d\n", pf[1].revents));
-			break;
-		}
-		DEBUG(("events: %d %d \n", pf[0].revents, pf[1].revents));
-	}
-	while (1);
-
-	waitpid(p->pid, &status, 0);
-	if (WIFEXITED(status))
-	{
-		p->causeofdeath = PROC_NORMALDEATH;
-		p->returncode = WEXITSTATUS(status);
-		DEBUG(("process exited normally \n"));
-	} else {
-		p->causeofdeath = PROC_SOMEODDDEATH;
-		if (WIFSIGNALED(status))
-			p->returncode = WTERMSIG(status);
-		else
-			p->returncode = 128;
-		DEBUG(("process terminated \n"));
-	}
-	
-	return p;
-}
-
-void process_free(proc **pp)
-{
-	if (!pp)
-		return;
-	if (! *pp)
-		return;
-
-	if ((*pp)->output)
-		buffer_free(&((*pp)->output));
-	
-	free(*pp);
-
-	*pp = NULL;
-}
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of the License "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+
+#include <unistd.h>
+
+#include "process.h"
+#include "buffer.h"
+#include <stdlib.h>
+#include <string.h>
+#include <poll.h>
+#include <signal.h>
+#include <errno.h>
+#include <sys/wait.h>
+
+#include "log.h"
+
+
+proc *process_new(void)
+{
+	proc *p = malloc(sizeof(proc));
+	p->output = buffer_new();
+	if (!p->output)
+	{
+		free(p);
+		return  NULL;
+	}
+	p->starttime = 0;
+	p->endtime = 0;
+	p->returncode = 1;
+	p->pid = 0;
+	p->causeofdeath = PROC_NORMALDEATH;
+
+	return p;
+}
+
+void childsig(int sig)
+{
+	//wait(&stat_loc);
+	DEBUG(("SIGCHLD\n"));
+}
+
+struct sigaction child_action;
+
+proc *process_run(char executable[], char *args[], int timeout)
+{
+	proc *p = process_new();
+
+	if (p == NULL)
+		return NULL;
+
+	char *text;
+	int status;
+	int stdout_p[2];
+	int stderr_p[2];
+
+	child_action.sa_handler = childsig;
+	sigemptyset (&child_action.sa_mask);
+	child_action.sa_flags = 0;
+	sigaction (SIGCHLD, &child_action, NULL);
+	
+	pipe(stdout_p);
+	pipe(stderr_p);
+
+	pid_t child = fork();
+	if (child == 0)
+	{
+		close(stdout_p[0]);
+		dup2(stdout_p[1], 1);
+		close(stdout_p[1]);
+		
+		close(stderr_p[0]);
+		dup2(stderr_p[1], 2);
+		close(stderr_p[1]);
+
+		execvp(executable, args);
+		exit(1);
+	} else if (child == -1) {
+		p->causeofdeath = PROC_SOMEODDDEATH;
+		return p;
+	}
+	else
+	{
+		close(stdout_p[1]);
+		close(stderr_p[1]);
+		p->pid = child;
+		DEBUG(("child running\n"));
+	}
+
+	struct pollfd pf[2];
+
+	int pv;
+	int have_status = 0;
+	do
+	{
+		pf[0].fd = stdout_p[0];
+		pf[1].fd = stderr_p[0];
+		pf[0].events = POLLIN;
+		pf[0].revents = 0;
+		pf[1].events = POLLIN;
+		pf[1].revents = 0;
+		DEBUG(("polling\n"));
+	       	pv = poll(pf, 2, timeout);
+		DEBUG(("polled %d\n", pv));
+		if (pv == -1)
+		{
+		       	if (errno == EAGAIN)
+			{
+				errno = 0;
+				DEBUG(("errno: \n"));
+				continue;
+			} else {
+				/* EINVAL - can't poll */
+				process_free(&p);
+				return NULL;
+			}
+		} else if (pv == 0 ) {
+			/* timeout */
+			DEBUG(("timeout: \n"));
+			kill(p->pid, SIGTERM);
+			p->causeofdeath = PROC_TIMEOUTDEATH;
+			break;
+		}
+		
+		if (pf[0].revents & POLLIN )
+		{
+			char *space = buffer_makespace(p->output, 1024);
+			int nbytes = read(pf[0].fd, space, 1024);
+			if (nbytes < 0)
+				break;
+			buffer_usespace(p->output, nbytes);
+		}
+		if (pf[1].revents & POLLIN )
+		{
+			char *space = buffer_makespace(p->output, 1024);
+			int nbytes = read(pf[1].fd, space, 1024);
+			if (nbytes < 0)
+				break;
+			buffer_usespace(p->output, nbytes);
+		}
+		if  (pf[0].revents & (POLLERR | POLLHUP | POLLNVAL))
+		{
+			DEBUG(("stdout: pollerr %d\n", pf[0].revents));
+			break;
+		}
+		
+		if (  pf[1].revents & (POLLERR | POLLHUP | POLLNVAL)) 
+		{
+			DEBUG(("stderr: pollerr %d\n", pf[1].revents));
+			break;
+		}
+		DEBUG(("events: %d %d \n", pf[0].revents, pf[1].revents));
+	}
+	while (1);
+
+	waitpid(p->pid, &status, 0);
+	if (WIFEXITED(status))
+	{
+		p->causeofdeath = PROC_NORMALDEATH;
+		p->returncode = WEXITSTATUS(status);
+		DEBUG(("process exited normally \n"));
+	} else {
+		p->causeofdeath = PROC_SOMEODDDEATH;
+		if (WIFSIGNALED(status))
+			p->returncode = WTERMSIG(status);
+		else
+			p->returncode = 128;
+		DEBUG(("process terminated \n"));
+	}
+	
+	return p;
+}
+
+void process_free(proc **pp)
+{
+	if (!pp)
+		return;
+	if (! *pp)
+		return;
+
+	if ((*pp)->output)
+		buffer_free(&((*pp)->output));
+	
+	free(*pp);
+
+	*pp = NULL;
+}