Process event connector is a netlink connector that reports process
events to userspace, and currently we have 5 kinds of process events,
i.e. fork, exit, exec, uid, gid.

There are total 5 test cases to test its functionality.

But the test is not run by default, because I don't find a way to
decide whether the underlying kernel supports this feather or not.

Signed-off-by: Li Zefan <[EMAIL PROTECTED]>
---
 runtest/connectors                                |    2
 testcases/kernel/connectors/Makefile              |   10
 testcases/kernel/connectors/pec/Makefile          |   13
 testcases/kernel/connectors/pec/README            |   46 +++
 testcases/kernel/connectors/pec/event_generator.c |  227 ++++++++++++++++
 testcases/kernel/connectors/pec/pec_listener.c    |  309 ++++++++++++++++++++++
 testcases/kernel/connectors/pec/run_pec_test      |   92 ++++++
 7 files changed, 699 insertions(+)

diff -Nurp ltp-full-20080531.orig/runtest/connectors 
ltp-full-20080531/runtest/connectors
--- ltp-full-20080531.orig/runtest/connectors   1970-01-01 08:00:00.000000000 
+0800
+++ ltp-full-20080531/runtest/connectors        2008-06-12 13:46:44.000000000 
+0800
@@ -0,0 +1,2 @@
+#DESCRIPTION:Netlink Connector tests
+Connectors run_pec_test
diff -Nurp ltp-full-20080531.orig/testcases/kernel/connectors/Makefile 
ltp-full-20080531/testcases/kernel/connectors/Makefile
--- ltp-full-20080531.orig/testcases/kernel/connectors/Makefile 1970-01-01 
08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/Makefile      2008-05-21 
09:50:24.000000000 +0800
@@ -0,0 +1,10 @@
+SUBDIRS = pec
+
+all:
+       @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i ; done
+
+install:
+       @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done
+
+clean:
+       @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done
diff -Nurp 
ltp-full-20080531.orig/testcases/kernel/connectors/pec/event_generator.c 
ltp-full-20080531/testcases/kernel/connectors/pec/event_generator.c
--- ltp-full-20080531.orig/testcases/kernel/connectors/pec/event_generator.c    
1970-01-01 08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/pec/event_generator.c 
2008-05-21 10:48:09.000000000 +0800
@@ -0,0 +1,227 @@
+/******************************************************************************/
+/*                                                                            
*/
+/* Copyright (c) 2008 FUJITSU LIMITED                                         
*/
+/*                                                                            
*/
+/* 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 Place, Suite 330, Boston, MA 02111-1307 USA    
*/
+/*                                                                            
*/
+/* Author: Li Zefan <[EMAIL PROTECTED]>                                     */
+/*                                                                            
*/
+/******************************************************************************/
+
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <pwd.h>
+#include "test.h"
+
+#define DEFAULT_EVENT_NUM       1
+
+unsigned long nr_event = DEFAULT_EVENT_NUM;
+
+uid_t ltp_uid;
+gid_t ltp_gid;
+const char *ltp_user = "nobody";
+
+char **exec_argv;
+
+void (*gen_event)(void);
+
+/*
+ * Show the usage
+ *
+ * @status: the exit status
+ */
+static void usage(int status)
+{
+       FILE *stream = (status ? stderr : stdout);
+
+       fprintf(stream, "Usage: event_generator -e fork|exit|exec|uid|gid [-n 
nr_event]\n");
+
+       exit(status);
+}
+
+/*
+ * Generate exec event.
+ *
+ * We can't just exec nr_event times, because the current process image
+ * will be replaced with the new process image, so we use enviroment
+ * viriable as event counters, as it will be inherited after exec.
+ */
+static void gen_exec(void)
+{
+       char *val;
+       char buf[10];
+       unsigned long nr_exec;
+
+       /* get the event counter */
+       val = getenv("NR_EXEC");
+       if (!val) {
+               nr_exec = 0;
+               setenv("NR_EXEC", "1", 1);
+       } else {
+               nr_exec = atoi(val);
+               snprintf(buf, 10, "%lu", nr_exec + 1);
+               setenv("NR_EXEC", buf, 1);
+       }
+
+       /* stop generate exec event */
+       if (nr_exec >= nr_event)
+               return;
+
+       /* fflush is needed before exec */
+       printf("exec pid: %d\n", getpid());
+       fflush(stdout);
+
+       execv(exec_argv[0], exec_argv);
+}
+
+/*
+ * Generate fork event.
+ */
+static inline void gen_fork(void)
+{
+       pid_t pid;
+
+       pid = fork();
+       if (pid == 0) {
+               printf("fork parent: %d, child: %d\n", getppid(), getpid());
+               exit(0);
+       } else if (pid < 0) {
+               fprintf(stderr, "fork() failed\n");
+               exit(1);
+       }
+}
+
+/**
+ * Generate exit event
+ */
+static inline void gen_exit(void)
+{
+       pid_t pid;
+
+       pid = fork();
+       if (pid == 0) {
+               printf("exit pid: %d exit_code: %d\n", getpid(), 0);
+               exit(0);
+       } else if (pid < 0){
+               fprintf(stderr, "fork() failed\n");
+               exit(1);
+       }
+}
+
+/*
+ * Generate uid event.
+ */
+static inline void gen_uid(void)
+{
+       setuid(ltp_uid);
+       printf("uid pid: %d euid: %d\n", getpid(), ltp_uid);
+}
+
+/*
+ * Generate gid event.
+ */
+static inline void gen_gid(void)
+{
+       setgid(ltp_gid);
+       printf("gid pid: %d egid: %d\n", getpid(), ltp_gid);
+}
+
+/*
+ * Read option from user input.
+ *
+ * @argc: number of arguments
+ * @argv: argument list
+ */
+static void process_options(int argc, char **argv)
+{
+       char c;
+       char *end;
+
+       while ((c = getopt(argc, argv, "e:n:h")) != -1) {
+               switch (c) {
+               /* which event to generate */
+               case 'e':
+                       if (!strcmp(optarg, "exec"))
+                               gen_event = gen_exec;
+                       else if (!strcmp(optarg, "fork"))
+                               gen_event = gen_fork;
+                       else if (!strcmp(optarg, "exit"))
+                               gen_event = gen_exit;
+                       else if (!strcmp(optarg, "uid"))
+                               gen_event = gen_uid;
+                       else if (!strcmp(optarg, "gid"))
+                               gen_event = gen_gid;
+                       else {
+                               fprintf(stderr, "wrong -e argument!");
+                               exit(1);
+                       }
+                       break;
+               /* number of event to generate */
+               case 'n':
+                       nr_event = strtoul(optarg, &end, 10);
+                       if (*end != '\0' || nr_event == 0) {
+                               fprintf(stderr, "wrong -n argument!");
+                               exit(1);
+                       }
+                       break;
+               /* help */
+               case 'h':
+                       usage(0);
+               default:
+                       fprintf(stderr, "unknown option!\n");
+                       usage(1);
+               }
+       }
+
+       if (!gen_event) {
+               fprintf(stderr, "no event type specified!\n");
+               usage(1);
+       }
+}
+
+int main(int argc, char **argv)
+{
+       unsigned long i;
+       struct passwd *ent;
+
+       process_options(argc, argv);
+
+       ent = getpwnam(ltp_user);
+       if (ent == NULL) {
+               fprintf(stderr, "can't get password entry for %s", ltp_user);
+               exit(1);
+       }
+       ltp_uid = ent->pw_uid;
+       ltp_gid = ent->pw_gid;
+
+       /* special processing for gen_exec, see comments above gen_exec() */
+       if (gen_event == gen_exec) {
+               exec_argv = argv;
+
+               gen_exec();
+
+               /* won't reach here */
+               return 0;
+       }
+
+       /* other events */
+       for (i = 0; i < nr_event; i++)
+               gen_event();
+
+       return 0;
+}
+
diff -Nurp ltp-full-20080531.orig/testcases/kernel/connectors/pec/Makefile 
ltp-full-20080531/testcases/kernel/connectors/pec/Makefile
--- ltp-full-20080531.orig/testcases/kernel/connectors/pec/Makefile     
1970-01-01 08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/pec/Makefile  2008-05-20 
10:33:55.000000000 +0800
@@ -0,0 +1,13 @@
+CFLAGS +=       -I../../../../include -Wall
+LOADLIBES+=     -L../../../../lib -lltp
+
+SRCS:=$(wildcard *.c)
+TARGETS:=$(patsubst %.c,%,$(SRCS))
+
+all: $(TARGETS)
+ 
+install:
+       @set -e; for i in $(TARGETS) ; do ln -f $$i ../../../bin/$$i ; chmod +x 
run_pec_test ; done ;
+       ln -f run_pec_test ../../../bin/
+clean:
+       rm -f $(TARGETS)
diff -Nurp 
ltp-full-20080531.orig/testcases/kernel/connectors/pec/pec_listener.c 
ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c
--- ltp-full-20080531.orig/testcases/kernel/connectors/pec/pec_listener.c       
1970-01-01 08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c    
2008-05-21 10:48:01.000000000 +0800
@@ -0,0 +1,309 @@
+/******************************************************************************/
+/*                                                                            
*/
+/* Copyright (c) 2008 FUJITSU LIMITED                                         
*/
+/*                                                                            
*/
+/* 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 Place, Suite 330, Boston, MA 02111-1307 USA    
*/
+/*                                                                            
*/
+/* Author: Li Zefan <[EMAIL PROTECTED]>                                     */
+/*                                                                            
*/
+/******************************************************************************/
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <signal.h>
+#include <sys/socket.h>
+#include <sys/poll.h>
+
+#include <linux/netlink.h>
+#include <linux/connector.h>
+#include <linux/cn_proc.h>
+
+#define PEC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event))
+#define PEC_CTRL_MSG_SIZE (sizeof(struct cn_msg) + sizeof(enum 
proc_cn_mcast_op))
+
+#define MAX_MSG_SIZE 256
+
+static __u32 seq;
+
+static int exit_flag;
+static struct sigaction sigint_action;
+
+/*
+ * Handler for signal int. Set exit flag.
+ *
+ * @signo: the signal number, not used
+ */
+static void sigint_handler(int __attribute__((unused)) signo)
+{
+       exit_flag = 1;
+}
+
+/*
+ * Send netlink package.
+ *
+ * @sd: socket descripor
+ * @to: the destination sockaddr
+ * @cnmsg: the pec control message
+ */
+static int netlink_send(int sd, struct sockaddr_nl *to, struct cn_msg *cnmsg)
+{
+       int ret;
+       char buf[MAX_MSG_SIZE];
+       struct nlmsghdr *nlhdr;
+       struct iovec iov;
+       struct msghdr msg;
+
+       memset(buf, 0, MAX_MSG_SIZE);
+
+       nlhdr = (struct nlmsghdr *)buf;
+
+       nlhdr->nlmsg_seq = seq++;
+       nlhdr->nlmsg_pid = getpid();
+       nlhdr->nlmsg_type = NLMSG_DONE;
+       nlhdr->nlmsg_len = NLMSG_LENGTH(sizeof(*cnmsg) + cnmsg->len);
+       nlhdr->nlmsg_flags = 0;
+       memcpy(NLMSG_DATA(nlhdr), cnmsg, sizeof(*cnmsg) + cnmsg->len);
+
+       memset(&iov, 0, sizeof(struct iovec));
+       iov.iov_base = (void *)nlhdr;
+       iov.iov_len = nlhdr->nlmsg_len;
+
+       memset(&msg, 0, sizeof(struct msghdr));
+       msg.msg_name = (void *)to;
+       msg.msg_namelen = sizeof(*to);
+       msg.msg_iov = &iov;
+       msg.msg_iovlen = 1;
+
+       ret = sendmsg(sd, &msg, 0);
+
+       return ret;
+}
+
+/*
+ * Receive package from netlink.
+ *
+ * @sd: socket descripor
+ * @from: source sockaddr
+ * @buf: buffer for storing the package
+ */
+static int netlink_recv(int sd, struct sockaddr_nl *from, char *buf)
+{
+       int ret;
+       struct nlmsghdr *nlhdr = (struct nlmsghdr *)buf;
+       struct iovec iov;
+       struct msghdr msg;
+
+       memset(nlhdr, 0, NLMSG_SPACE(MAX_MSG_SIZE));
+       memset(&iov, 0, sizeof(iov));
+       memset(&msg, 0, sizeof(msg));
+
+       iov.iov_base = (void *)nlhdr;
+       iov.iov_len = NLMSG_SPACE(MAX_MSG_SIZE);
+
+       msg.msg_name = (void *)from;
+       msg.msg_namelen = sizeof(*from);
+       msg.msg_iov = &iov;
+       msg.msg_iovlen = 1;
+
+       ret = recvmsg(sd, &msg, 0);
+
+       return ret;
+}
+
+/*
+ * Send control message to PEC.
+ *
+ * @sd: socket descriptor
+ * @to: the destination sockaddr
+ * @op: control flag
+ */
+static int control_pec(int sd, struct sockaddr_nl *to, enum proc_cn_mcast_op 
op)
+{
+       int ret;
+       char buf[PEC_CTRL_MSG_SIZE];
+       struct cn_msg *cnmsg;
+       enum proc_cn_mcast_op *pec_op;
+
+       memset(buf, 0, sizeof(buf));
+
+       cnmsg = (struct cn_msg *)buf;
+       cnmsg->id.idx = CN_IDX_PROC;
+       cnmsg->id.val = CN_VAL_PROC;
+       cnmsg->seq = seq++;
+       cnmsg->ack = 0;
+       cnmsg->len = sizeof(op);
+
+       pec_op = (enum proc_cn_mcast_op *)cnmsg->data;
+       *pec_op = op;
+
+       ret = netlink_send(sd, to, cnmsg);
+
+       return ret;
+}
+
+/*
+ * Process PEC event.
+ *
+ * @nlhdr: the netlinke pacakge
+ */
+static void process_event(struct nlmsghdr *nlhdr)
+{
+       struct cn_msg *msg;
+       struct proc_event *pe;
+
+       msg = (struct cn_msg *)NLMSG_DATA(nlhdr);
+
+       pe = (struct proc_event *)msg->data;
+
+       switch (pe->what) {
+       case PROC_EVENT_NONE:
+               printf("none err: %u\n", pe->event_data.ack.err);
+               break;
+       case PROC_EVENT_FORK:
+               printf("fork parent: %d, child: %d\n",
+                      pe->event_data.fork.parent_pid,
+                      pe->event_data.fork.child_pid);
+               break;
+       case PROC_EVENT_EXEC:
+               printf("exec pid: %d\n",
+                      pe->event_data.exec.process_pid);
+               break;
+       case PROC_EVENT_UID:
+               printf("uid pid: %d euid: %d ruid: %d\n",
+                      pe->event_data.id.process_pid,
+                      pe->event_data.id.e.euid,
+                      pe->event_data.id.r.ruid);
+               break;
+       case PROC_EVENT_GID:
+               printf("gid pid: %d egid: %d rgid: %d\n",
+                      pe->event_data.id.process_pid,
+                      pe->event_data.id.e.egid,
+                      pe->event_data.id.r.rgid);
+               break;
+       case PROC_EVENT_EXIT:
+               printf("exit pid: %d exit_code: %d exit_signal: %d\n",
+                      pe->event_data.exit.process_pid,
+                      pe->event_data.exit.exit_code,
+                      pe->event_data.exit.exit_signal);
+               break;
+       default:
+               printf("unknown event\n");
+               break;
+       }
+}
+
+int main(int argc, char **argv)
+{
+       int ret;
+       int sd;
+       struct sockaddr_nl l_local;
+       struct sockaddr_nl src_addr;
+       char buf[MAX_MSG_SIZE];
+       struct pollfd pfd;
+
+       sigint_action.sa_flags = SA_ONESHOT;
+       sigint_action.sa_handler = &sigint_handler;
+       sigaction(SIGINT, &sigint_action, NULL);
+
+       /* Create and bind socket */
+       sd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_CONNECTOR);
+       if (sd == -1) {
+               fprintf(stderr, "failed to create socket\n");
+               exit(1);
+       }
+
+       memset(&src_addr, 0, sizeof(src_addr));
+       src_addr.nl_family = AF_NETLINK;
+       src_addr.nl_pid = 0;
+       src_addr.nl_groups = 0;
+
+       memset(&l_local, 0, sizeof(l_local));
+       l_local.nl_family = AF_NETLINK;
+       l_local.nl_pid = getpid();
+       l_local.nl_groups = CN_IDX_PROC;
+
+       ret = bind(sd, (struct sockaddr *)&l_local,
+                  sizeof(struct sockaddr_nl));
+       if (ret == -1) {
+               fprintf(stderr, "failed to bind socket\n");
+               exit(1);
+       }
+
+       /* Open PEC listening */
+       ret = control_pec(sd, &src_addr, PROC_CN_MCAST_LISTEN);
+       if (!ret) {
+               fprintf(stderr, "failed to open PEC listening\n");
+               exit(1);
+       }
+
+       /* Receive msg from PEC */
+       pfd.fd = sd;
+       pfd.events = POLLIN;
+       pfd.revents = 0;
+       while (!exit_flag) {
+               struct nlmsghdr *nlhdr;
+
+               ret = poll(&pfd, 1, -1);
+               if (ret == 0 || (ret == -1 && errno != EINTR)) {
+                       control_pec(sd, &src_addr, PROC_CN_MCAST_IGNORE);
+                       fprintf(stderr, "failed to poll\n");
+                       exit(1);
+               } else if (ret == -1 && errno == EINTR)
+                       break;
+
+               ret = netlink_recv(sd, &src_addr, buf);
+
+               if (ret == 0)
+                       break;
+               else if (ret == -1 && errno == EINTR)
+                       break;
+               else if (ret == -1 && errno != EINTR) {
+                       control_pec(sd, &src_addr, PROC_CN_MCAST_IGNORE);
+                       fprintf(stderr, "failed to receive from netlink\n");
+                       exit(1);
+               } else {
+                       nlhdr = (struct nlmsghdr *)buf;
+
+                       switch (nlhdr->nlmsg_type) {
+                       case NLMSG_ERROR:
+                               fprintf(stderr, "err message recieved.\n");
+                               exit(1);
+                               break;
+                       case NLMSG_DONE:
+                               /* message sent from kernel */
+                               if (nlhdr->nlmsg_pid == 0)
+                                       process_event(nlhdr);
+                               break;
+                       default:
+                               break;
+                       }
+               }
+       }
+
+       /* Close PEC listening */
+       ret = control_pec(sd, &src_addr, PROC_CN_MCAST_IGNORE);
+       if (!ret) {
+               fprintf(stderr, "failed to close PEC listening\n");
+               exit(1);
+       }
+
+       close(sd);
+
+       return 0;
+}
+
diff -Nurp ltp-full-20080531.orig/testcases/kernel/connectors/pec/README 
ltp-full-20080531/testcases/kernel/connectors/pec/README
--- ltp-full-20080531.orig/testcases/kernel/connectors/pec/README       
1970-01-01 08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/pec/README    2008-05-20 
10:07:44.000000000 +0800
@@ -0,0 +1,46 @@
+
+TEST SUITE:
+
+The directory pec contains the tests related to the process event connector.
+
+Process event connector is a netlink connector that reports process events
+to userspace. It sends events such as fork, exec, id change and exit.
+
+There are total 5 testcases.
+
+TESTS AIM:
+
+The aim of the tests is to test the functionality of process event connector.
+
+FILES DESCRIPTION:
+
+check_connector_enabled.c
+------------------
+This program is used to check if the kernel supports netlink connector.
+
+event_generator.c
+------------------
+This program is used to generate a specified process event (fork, exec, uid,
+gid or exit).
+
+run_pec_test
+------------------
+This script runs all the 5 testcases.
+
+pec_listener.c
+------------------
+This program is used to ilsten to process events received through the kernel
+connector and print them.
+
+Makefile
+------------------
+The usual makefile for this directory
+
+$LTPROOT/output/pec/*.log
+------------------
+The outputs of event_generator and pec_listeners.
+
+README:
+------------------
+The one you have gone through.
+
diff -Nurp ltp-full-20080531.orig/testcases/kernel/connectors/pec/run_pec_test 
ltp-full-20080531/testcases/kernel/connectors/pec/run_pec_test
--- ltp-full-20080531.orig/testcases/kernel/connectors/pec/run_pec_test 
1970-01-01 08:00:00.000000000 +0800
+++ ltp-full-20080531/testcases/kernel/connectors/pec/run_pec_test      
2008-06-12 13:42:07.000000000 +0800
@@ -0,0 +1,92 @@
+#! /bin/bash
+
+################################################################################
+##                                                                            
##
+## Copyright (c) 2008 FUJITSU LIMITED                                         
##
+##                                                                            
##
+## 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 Place, Suite 330, Boston, MA 02111-1307 USA    
##
+##                                                                            
##
+## Author: Li Zefan <[EMAIL PROTECTED]>                                     ##
+##                                                                            
##
+################################################################################
+
+if [ -z $LTPROOT ]; then
+       LTPROOT="`cd ../../../.. && pwd`"
+       PATH="$PATH:$LTPROOT/testcases/bin"
+       mkdir $LTPROOT/output 2> /dev/null
+fi
+
+cd $LTPROOT/testcases/bin
+
+export TCID="pec01"
+export TST_TOTAL=5
+
+exit_status=0
+
+# Run a test case
+#
+# $1: the test number
+# $2: type of event
+run_case()
+{
+       export TST_COUNT=$1
+
+       log="$LTPROOT/output/log"
+       mkdir $log 2> /dev/null
+
+       ./pec_listener > "$log/listener_$1.log" 2>&1 &
+       pid=$!
+       sleep 1
+
+       ./event_generator -e $2 > "$log/generator_$1.log" &
+
+       wait $!
+       ret1=$?
+
+       sleep 1
+       kill -s SIGINT $pid 2> /dev/null
+       wait $pid
+       ret2=$?
+
+       if [ $ret1 -ne 0 -o ! -s "$log/generator_$1.log" ]; then
+               tst_resm TFAIL "failed to generate process events"
+               exit_status=1
+               return 1
+       fi
+
+       if [ $ret2 -ne 0 ]; then
+               tst_resm TFAIL "failed to listen process events"
+               exit_status=1
+               return 1
+       fi
+
+       event="`cat $log/generator_$1.log`"
+       cat "$log/listener_$1.log" | grep "$event" > /dev/null
+       if [ $? -eq 0 ]; then
+               tst_resm TPASS "get event - $event"
+       else
+               tst_resm TFAIL "expected event - $event"
+               exit_status=1
+       fi
+}
+
+run_case 1 "fork"
+run_case 2 "exec"
+run_case 3 "exit"
+run_case 4 "uid"
+run_case 5 "gid"
+
+exit $exit_status
+

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to