From: Li Z. <li...@cn...> - 2008-06-12 06:20:32
|
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 <li...@cn...> --- 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 <li...@cn...> */ +/* */ +/******************************************************************************/ + +#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 <li...@cn...> */ +/* */ +/******************************************************************************/ + +#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 <li...@cn...> ## +## ## +################################################################################ + +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 + |
From: Li Z. <li...@cn...> - 2008-06-12 06:22:48
|
Here's the test result: # ./runltp -f connectors ... pec01 1 PASS : get event - fork parent: 11350, child: 11351 pec01 2 PASS : get event - exec pid: 11360 pec01 3 PASS : get event - exit pid: 11371 exit_code: 0 pec01 4 PASS : get event - uid pid: 11381 euid: 99 pec01 5 PASS : get event - gid pid: 11390 egid: 99 ... INFO: pan reported all tests PASS |
From: Subrata M. <su...@li...> - 2008-06-12 08:55:00
|
Thanks for this. I will test and get back to you soon. Regards-- Subrata On Thu, 2008-06-12 at 14:18 +0800, Li Zefan wrote: > 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 <li...@cn...> > --- > 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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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 <li...@cn...> ## > +## ## > +################################################################################ > + > +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 > + |
From: Subrata M. <su...@li...> - 2008-06-12 11:00:03
Attachments:
ProcessEventConnectorBuildDefault.patch
|
Hi, I went through in doing testing around couple of machines and here are my observations. First of all i would like it to get it integrated with LTP-build, which your patch presently does not provide. In next iteration you can include this patch: ProcessEventConnectorBuildDefault.patch Process Event Connector was added from 2.6.15 onwards(Correct me if i am wrong). So, i can see that the tests did not build for kernels below 2.6.15 (for all architectures i tested, it failed when kernel is below 2.6.15). Even for kernels above 2.6.15, it failed for ia64 (kernel=2.6.16.21-0.8-default). Even though the test built successfully for ppc64 and ia64(kernel > 2.6.15), the test-run failed for both. Please see the following table for the summary and later for detailed output: =========================================================== ||Architecture||Kernel||Build||Run|| =========================================================== ||i386||2.6.18-53.1.13.el5||PASSED||PASS(root),FAIL(non-root)|| ||x86_64||2.6.9-67.ELsmp||FAILED|| ||x86_64||2.6.18-92.el5||PASSED||PASSED as root-user|| ||ppc64||2.6.9-67.ELsmp||FAILED|| ||ppc64||2.6.20-CBE||PASSED||FAILED|| ||ia64||2.6.16.21-0.8-default||FAILED|| ||ia64||2.6.23.13||PASSED||FAILED|| =========================================================== Also it seems that the tests should be executed as root. Please document them in your README file. So, we have 2 potential problem to solve: 1) Prevent building in machines where it is not supported (Criteria can be i)kernel 2.6.15 below, ii) Some #define criteria). Please see how this is handled in containers test cases: http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/, http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/Makefile, http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/check_for_unshare.c, 2) Even if you go ahead and build successfully from the Makefile, you can prevent execution through the usage of tst_kvercmp(int r1, int r2, int r3) function defined here: http://ltp.cvs.sourceforge.net/ltp/ltp/lib/tst_kvercmp.c and used here: http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/syscalls/remap_file_pages/remap_file_pages01.c, I hope this will help you in re-writing this patch and send it across. When everything goes fine, i will include it and also will generate a code coverage for the same. Thanks for contributing to LTP. I also found a test program written by Matt: http://linux.derkeiler.com/pdf/Mailing-Lists/Kernel/2005-09/8369.pdf, Regards-- Subrata ======================================================================================== Detailed Output on various Machines: ======================================================================================== # uname -a Linux <sniff> 2.6.18-53.1.13.el5 #1 SMP Mon Feb 11 13:27:52 EST 2008 i686 i686 i386 GNU/Linux <<<test_start>>> tag=Connectors stime=1213260740 cmdline="run_pec_test" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> incrementing stop pec01 1 FAIL : failed to listen process events pec01 2 FAIL : failed to listen process events pec01 3 FAIL : failed to listen process events pec01 4 FAIL : failed to listen process events pec01 5 FAIL : failed to listen process events <<<execution_status>>> duration=10 termination_type=exited termination_id=1 corefile=no cutime=1 cstime=4 <<<test_end>>> [root@<>]#uname -a Linux <sniff> 2.6.18-53.1.13.el5 #1 SMP Mon Feb 11 13:27:52 EST 2008 i686 i686 i386 GNU/Linux <<<test_start>>> tag=Connectors stime=1213263628 cmdline="run_pec_test" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> incrementing stop pec01 1 PASS : get event - fork parent: 7478, child: 7479 pec01 2 PASS : get event - exec pid: 7490 pec01 3 PASS : get event - exit pid: 7500 exit_code: 0 pec01 4 PASS : get event - uid pid: 7510 euid: 99 pec01 5 PASS : get event - gid pid: 7519 egid: 99 <<<execution_status>>> duration=10 termination_type=exited termination_id=0 corefile=no cutime=3 cstime=6 <<<test_end>>> ======================================================================================== ======================================================================================== # uname -a Linux <sniff> 2.6.9-67.EL #1 SMP Wed Nov 7 13:50:40 EST 2007 ppc64 ppc64 ppc64 GNU/Linux # uname -a Linux <sniff> 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 x86_64 x86_64 GNU/Linux make[4]: Entering directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator event_generator.c: In function `process_options': event_generator.c:154: warning: comparison is always true due to limited range of data type cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from pec_listener.c:32: /usr/include/linux/netlink.h:22: error: syntax error before "__u32" /usr/include/linux/netlink.h:28: error: syntax error before "__u32" /usr/include/linux/netlink.h:30: error: syntax error before "nlmsg_flags" /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type pec_listener.c:33:29: linux/connector.h: No such file or directory pec_listener.c:34:27: linux/cn_proc.h: No such file or directory pec_listener.c:41: error: syntax error before "seq" pec_listener.c:41: warning: type defaults to `int' in declaration of `seq' pec_listener.c:41: warning: data definition has no type or storage class pec_listener.c:63: warning: "struct cn_msg" declared inside parameter list pec_listener.c:63: warning: its scope is only this definition or declaration, which is probably not what you want pec_listener.c: In function `netlink_send': pec_listener.c:75: error: dereferencing pointer to incomplete type pec_listener.c:76: error: dereferencing pointer to incomplete type pec_listener.c:77: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:79: error: dereferencing pointer to incomplete type pec_listener.c:80: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:84: error: dereferencing pointer to incomplete type pec_listener.c:88: error: dereferencing pointer to incomplete type pec_listener.c: In function `netlink_recv': pec_listener.c:111: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:116: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:119: error: dereferencing pointer to incomplete type pec_listener.c: At top level: pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside parameter list pec_listener.c:136: error: parameter `op' has incomplete type pec_listener.c: In function `control_pec': pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `cn_msg' pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `proc_cn_mcast_op' pec_listener.c:145: error: dereferencing pointer to incomplete type pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:145: error: (Each undeclared identifier is reported only once pec_listener.c:145: error: for each function it appears in.) pec_listener.c:146: error: dereferencing pointer to incomplete type pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this function) pec_listener.c:147: error: dereferencing pointer to incomplete type pec_listener.c:148: error: dereferencing pointer to incomplete type pec_listener.c:149: error: dereferencing pointer to incomplete type pec_listener.c:151: error: dereferencing pointer to incomplete type pec_listener.c:152: error: dereferencing pointer to incomplete type pec_listener.c:154: warning: passing arg 3 of `netlink_send' from incompatible pointer type pec_listener.c: In function `process_event': pec_listener.c:169: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:171: error: dereferencing pointer to incomplete type pec_listener.c:173: error: dereferencing pointer to incomplete type pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in this function) pec_listener.c:175: error: dereferencing pointer to incomplete type pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in this function) pec_listener.c:179: error: dereferencing pointer to incomplete type pec_listener.c:180: error: dereferencing pointer to incomplete type pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in this function) pec_listener.c:184: error: dereferencing pointer to incomplete type pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in this function) pec_listener.c:188: error: dereferencing pointer to incomplete type pec_listener.c:189: error: dereferencing pointer to incomplete type pec_listener.c:190: error: dereferencing pointer to incomplete type pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in this function) pec_listener.c:194: error: dereferencing pointer to incomplete type pec_listener.c:195: error: dereferencing pointer to incomplete type pec_listener.c:196: error: dereferencing pointer to incomplete type pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in this function) pec_listener.c:200: error: dereferencing pointer to incomplete type pec_listener.c:201: error: dereferencing pointer to incomplete type pec_listener.c:202: error: dereferencing pointer to incomplete type pec_listener.c: In function `main': pec_listener.c:214: error: storage size of 'l_local' isn't known pec_listener.c:215: error: storage size of 'src_addr' isn't known pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in this function) pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:241: error: invalid application of `sizeof' to incomplete type `sockaddr_nl' pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use in this function) pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use in this function) pec_listener.c:282: error: dereferencing pointer to incomplete type pec_listener.c:289: error: dereferencing pointer to incomplete type pec_listener.c:214: warning: unused variable `l_local' pec_listener.c:215: warning: unused variable `src_addr' make[4]: *** [pec_listener] Error 1 make[4]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' make[3]: *** [all] Error 2 make[3]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors' make[2]: *** [all] Error 2 make[2]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel' make[1]: *** [all] Error 2 make[1]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases' make: *** [all] Error 2 ======================================================================================== ======================================================================================== # uname -a Linux <sniff> 2.6.20-CBE #1 SMP Wed Mar 21 10:24:39 CET 2007 ppc64 ppc64 ppc64 GNU/Linux <<<test_start>>> tag=Connectors stime=1213263077 cmdline="run_pec_test" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> incrementing stop unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 1 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 2 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 3 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 4 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 5 FAIL : failed to generate process events <<<execution_status>>> duration=10 termination_type=exited termination_id=1 corefile=no cutime=3 cstime=8 <<<test_end>>> ======================================================================================== ======================================================================================== # uname -a Linux <sniff> 2.6.16.21-0.8-default #1 SMP Mon Jul 3 18:25:39 UTC 2006 ia64 ia64 ia64 GNU/Linux make[4]: Entering directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from /usr/include/linux/cn_proc.h:29, from pec_listener.c:34: /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ make[4]: *** [pec_listener] Error 1 make[4]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' make[3]: *** [all] Error 2 make[3]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors' make[2]: *** [all] Error 2 make[2]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases/kernel' make[1]: *** [all] Error 2 make[1]: Leaving directory `/root/subrata/ltp/ltp-full-20080531/testcases' make: *** [all] Error 2 ======================================================================================== ======================================================================================== # uname -a Linux <sniff> 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux <<<test_start>>> tag=Connectors stime=1213264628 cmdline="run_pec_test" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> incrementing stop pec01 1 PASS : get event - fork parent: 18993, child: 18994 pec01 2 PASS : get event - exec pid: 19003 pec01 3 PASS : get event - exit pid: 19013 exit_code: 0 pec01 4 PASS : get event - uid pid: 19022 euid: 99 pec01 5 PASS : get event - gid pid: 19031 egid: 99 <<<execution_status>>> duration=10 termination_type=exited termination_id=0 corefile=no cutime=2 cstime=4 <<<test_end>>> ======================================================================================== ======================================================================================== # uname -a Linux <sniff> 2.6.23.13 #1 SMP Wed Jan 9 18:14:28 PST 2008 ia64 GNU/Linux <<<test_start>>> tag=Connectors stime=1213267703 cmdline="run_pec_test" contacts="" analysis=exit initiation_status="ok" <<<test_output>>> incrementing stop pec01 1 FAIL : failed to listen process events pec01 2 FAIL : failed to listen process events pec01 3 FAIL : failed to listen process events pec01 4 FAIL : failed to listen process events pec01 5 FAIL : failed to listen process events <<<execution_status>>> duration=10 termination_type=exited termination_id=1 corefile=no cutime=5 cstime=7 <<<test_end>>> ======================================================================================== ======================================================================================== On Thu, 2008-06-12 at 14:24 +0530, Subrata Modak wrote: > Thanks for this. I will test and get back to you soon. > > Regards-- > Subrata > > On Thu, 2008-06-12 at 14:18 +0800, Li Zefan wrote: > > 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 <li...@cn...> > > --- > > 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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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 <li...@cn...> ## > > +## ## > > +################################################################################ > > + > > +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 > Ltp...@li... > https://lists.sourceforge.net/lists/listinfo/ltp-list |
From: Li Z. <li...@cn...> - 2008-06-13 05:27:48
|
Subrata Modak 写道: > Hi, > > I went through in doing testing around couple of machines and here are > my observations. First of all i would like it to get it integrated with > LTP-build, which your patch presently does not provide. In next > iteration you can include this patch: > ProcessEventConnectorBuildDefault.patch > Thanks, I will revise the patch. > > Process Event Connector was added from 2.6.15 onwards(Correct me if i am > wrong). So, i can see that the tests did not build for kernels below > 2.6.15 (for all architectures i tested, it failed when kernel is below > 2.6.15). Even for kernels above 2.6.15, it failed for ia64 > (kernel=2.6.16.21-0.8-default). Even though the test built successfully > for ppc64 and ia64(kernel > 2.6.15), the test-run failed for both. > Please see the following table for the summary and later for detailed > output: > Yes, it was 2.6.15. We can prevent building failure by checking the kernel version, but it seems we have no way to check whether this feature is compiled into kernel or not, that's why I can't make it run by default. At best we can check if netlink connector is supported. If it's not supported, the return value of bind() is ENOENT. > =========================================================== > ||Architecture||Kernel||Build||Run|| > =========================================================== > ||i386||2.6.18-53.1.13.el5||PASSED||PASS(root),FAIL(non-root)|| > ||x86_64||2.6.9-67.ELsmp||FAILED|| > ||x86_64||2.6.18-92.el5||PASSED||PASSED as root-user|| > ||ppc64||2.6.9-67.ELsmp||FAILED|| > ||ppc64||2.6.20-CBE||PASSED||FAILED|| > ||ia64||2.6.16.21-0.8-default||FAILED|| > ||ia64||2.6.23.13||PASSED||FAILED|| > =========================================================== > > Also it seems that the tests should be executed as root. Please document > them in your README file. > Yes, it can be execuetd as root only. I'll document it and fix the patch. > So, we have 2 potential problem to solve: > 1) Prevent building in machines where it is not supported (Criteria can > be i)kernel 2.6.15 below, ii) Some #define criteria). Please see how > this is handled in containers test cases: > http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/, > http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/Makefile, > http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/containers/check_for_unshare.c, > 2) Even if you go ahead and build successfully from the Makefile, you > can prevent execution through the usage of tst_kvercmp(int r1, int r2, > int r3) function defined here: > http://ltp.cvs.sourceforge.net/ltp/ltp/lib/tst_kvercmp.c > and used here: > http://ltp.cvs.sourceforge.net/ltp/ltp/testcases/kernel/syscalls/remap_file_pages/remap_file_pages01.c, > > > I hope this will help you in re-writing this patch and send it across. > When everything goes fine, i will include it and also will generate a > code coverage for the same. Thanks for contributing to LTP. I also found > a test program written by Matt: > http://linux.derkeiler.com/pdf/Mailing-Lists/Kernel/2005-09/8369.pdf, > That program is essentially the same with pec_listenner.c in my patch, but it's somewhat outdated that I'm sure it can't even compile. > > Regards-- > Subrata > > ======================================================================================== > Detailed Output on various Machines: > ======================================================================================== > # uname -a > Linux <sniff> 2.6.18-53.1.13.el5 #1 SMP Mon Feb 11 13:27:52 EST 2008 > i686 i686 i386 GNU/Linux > > <<<test_start>>> > tag=Connectors stime=1213260740 > cmdline="run_pec_test" > contacts="" > analysis=exit > initiation_status="ok" > <<<test_output>>> > incrementing stop > pec01 1 FAIL : failed to listen process events > pec01 2 FAIL : failed to listen process events > pec01 3 FAIL : failed to listen process events > pec01 4 FAIL : failed to listen process events > pec01 5 FAIL : failed to listen process events > <<<execution_status>>> > duration=10 termination_type=exited termination_id=1 corefile=no > cutime=1 cstime=4 > <<<test_end>>> > > [root@<>]#uname -a > Linux <sniff> 2.6.18-53.1.13.el5 #1 SMP Mon Feb 11 13:27:52 EST 2008 > i686 i686 i386 GNU/Linux > > <<<test_start>>> > tag=Connectors stime=1213263628 > cmdline="run_pec_test" > contacts="" > analysis=exit > initiation_status="ok" > <<<test_output>>> > incrementing stop > pec01 1 PASS : get event - fork parent: 7478, child: 7479 > pec01 2 PASS : get event - exec pid: 7490 > pec01 3 PASS : get event - exit pid: 7500 exit_code: 0 > pec01 4 PASS : get event - uid pid: 7510 euid: 99 > pec01 5 PASS : get event - gid pid: 7519 egid: 99 > <<<execution_status>>> > duration=10 termination_type=exited termination_id=0 corefile=no > cutime=3 cstime=6 > <<<test_end>>> > ======================================================================================== > ======================================================================================== > # uname -a > Linux <sniff> 2.6.9-67.EL #1 SMP Wed Nov 7 13:50:40 EST 2007 ppc64 ppc64 > ppc64 GNU/Linux > > # uname -a > Linux <sniff> 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:56:44 EST 2007 x86_64 > x86_64 x86_64 GNU/Linux > > make[4]: Entering directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > event_generator.c: In function `process_options': > event_generator.c:154: warning: comparison is always true due to limited > range of data type > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from pec_listener.c:32: > /usr/include/linux/netlink.h:22: error: syntax error before "__u32" > /usr/include/linux/netlink.h:28: error: syntax error before "__u32" > /usr/include/linux/netlink.h:30: error: syntax error before > "nlmsg_flags" > /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" > /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" > /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type > pec_listener.c:33:29: linux/connector.h: No such file or directory > pec_listener.c:34:27: linux/cn_proc.h: No such file or directory > pec_listener.c:41: error: syntax error before "seq" > pec_listener.c:41: warning: type defaults to `int' in declaration of > `seq' > pec_listener.c:41: warning: data definition has no type or storage class > pec_listener.c:63: warning: "struct cn_msg" declared inside parameter > list > pec_listener.c:63: warning: its scope is only this definition or > declaration, which is probably not what you want > pec_listener.c: In function `netlink_send': > pec_listener.c:75: error: dereferencing pointer to incomplete type > pec_listener.c:76: error: dereferencing pointer to incomplete type > pec_listener.c:77: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:79: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:84: error: dereferencing pointer to incomplete type > pec_listener.c:88: error: dereferencing pointer to incomplete type > pec_listener.c: In function `netlink_recv': > pec_listener.c:111: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:116: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:119: error: dereferencing pointer to incomplete type > pec_listener.c: At top level: > pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside > parameter list > pec_listener.c:136: error: parameter `op' has incomplete type > pec_listener.c: In function `control_pec': > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `cn_msg' > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `proc_cn_mcast_op' > pec_listener.c:145: error: dereferencing pointer to incomplete type > pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:145: error: (Each undeclared identifier is reported only > once > pec_listener.c:145: error: for each function it appears in.) > pec_listener.c:146: error: dereferencing pointer to incomplete type > pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this > function) > pec_listener.c:147: error: dereferencing pointer to incomplete type > pec_listener.c:148: error: dereferencing pointer to incomplete type > pec_listener.c:149: error: dereferencing pointer to incomplete type > pec_listener.c:151: error: dereferencing pointer to incomplete type > pec_listener.c:152: error: dereferencing pointer to incomplete type > pec_listener.c:154: warning: passing arg 3 of `netlink_send' from > incompatible pointer type > pec_listener.c: In function `process_event': > pec_listener.c:169: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:171: error: dereferencing pointer to incomplete type > pec_listener.c:173: error: dereferencing pointer to incomplete type > pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in > this function) > pec_listener.c:175: error: dereferencing pointer to incomplete type > pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in > this function) > pec_listener.c:179: error: dereferencing pointer to incomplete type > pec_listener.c:180: error: dereferencing pointer to incomplete type > pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in > this function) > pec_listener.c:184: error: dereferencing pointer to incomplete type > pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in > this function) > pec_listener.c:188: error: dereferencing pointer to incomplete type > pec_listener.c:189: error: dereferencing pointer to incomplete type > pec_listener.c:190: error: dereferencing pointer to incomplete type > pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in > this function) > pec_listener.c:194: error: dereferencing pointer to incomplete type > pec_listener.c:195: error: dereferencing pointer to incomplete type > pec_listener.c:196: error: dereferencing pointer to incomplete type > pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in > this function) > pec_listener.c:200: error: dereferencing pointer to incomplete type > pec_listener.c:201: error: dereferencing pointer to incomplete type > pec_listener.c:202: error: dereferencing pointer to incomplete type > pec_listener.c: In function `main': > pec_listener.c:214: error: storage size of 'l_local' isn't known > pec_listener.c:215: error: storage size of 'src_addr' isn't known > pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in > this function) > pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:241: error: invalid application of `sizeof' to incomplete > type `sockaddr_nl' > pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use > in this function) > pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use > in this function) > pec_listener.c:282: error: dereferencing pointer to incomplete type > pec_listener.c:289: error: dereferencing pointer to incomplete type > pec_listener.c:214: warning: unused variable `l_local' > pec_listener.c:215: warning: unused variable `src_addr' > make[4]: *** [pec_listener] Error 1 > make[4]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' > make[3]: *** [all] Error 2 > make[3]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors' > make[2]: *** [all] Error 2 > make[2]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel' > make[1]: *** [all] Error 2 > make[1]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases' > make: *** [all] Error 2 > ======================================================================================== > ======================================================================================== > # uname -a > Linux <sniff> 2.6.20-CBE #1 SMP Wed Mar 21 10:24:39 CET 2007 ppc64 ppc64 > ppc64 GNU/Linux > > <<<test_start>>> > tag=Connectors stime=1213263077 > cmdline="run_pec_test" > contacts="" > analysis=exit > initiation_status="ok" > <<<test_output>>> > incrementing stop > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 1 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 2 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 3 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 4 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 5 FAIL : failed to generate process events > <<<execution_status>>> > duration=10 termination_type=exited termination_id=1 corefile=no > cutime=3 cstime=8 > <<<test_end>>> > ======================================================================================== > ======================================================================================== > # uname -a > Linux <sniff> 2.6.16.21-0.8-default #1 SMP Mon Jul 3 18:25:39 UTC 2006 > ia64 ia64 ia64 GNU/Linux > > make[4]: Entering directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from /usr/include/linux/cn_proc.h:29, > from pec_listener.c:34: > /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ > /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ > make[4]: *** [pec_listener] Error 1 > make[4]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors/pec' > make[3]: *** [all] Error 2 > make[3]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel/connectors' > make[2]: *** [all] Error 2 > make[2]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases/kernel' > make[1]: *** [all] Error 2 > make[1]: Leaving directory > `/root/subrata/ltp/ltp-full-20080531/testcases' > make: *** [all] Error 2 > ======================================================================================== > ======================================================================================== > # uname -a > Linux <sniff> 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 > x86_64 x86_64 GNU/Linux > > <<<test_start>>> > tag=Connectors stime=1213264628 > cmdline="run_pec_test" > contacts="" > analysis=exit > initiation_status="ok" > <<<test_output>>> > incrementing stop > pec01 1 PASS : get event - fork parent: 18993, child: 18994 > pec01 2 PASS : get event - exec pid: 19003 > pec01 3 PASS : get event - exit pid: 19013 exit_code: 0 > pec01 4 PASS : get event - uid pid: 19022 euid: 99 > pec01 5 PASS : get event - gid pid: 19031 egid: 99 > <<<execution_status>>> > duration=10 termination_type=exited termination_id=0 corefile=no > cutime=2 cstime=4 > <<<test_end>>> > ======================================================================================== > ======================================================================================== > # uname -a > Linux <sniff> 2.6.23.13 #1 SMP Wed Jan 9 18:14:28 PST 2008 ia64 > GNU/Linux > > <<<test_start>>> > tag=Connectors stime=1213267703 > cmdline="run_pec_test" > contacts="" > analysis=exit > initiation_status="ok" > <<<test_output>>> > incrementing stop > pec01 1 FAIL : failed to listen process events > pec01 2 FAIL : failed to listen process events > pec01 3 FAIL : failed to listen process events > pec01 4 FAIL : failed to listen process events > pec01 5 FAIL : failed to listen process events > <<<execution_status>>> > duration=10 termination_type=exited termination_id=1 corefile=no > cutime=5 cstime=7 > <<<test_end>>> > ======================================================================================== > ======================================================================================== |
From: Matt H. <mat...@us...> - 2008-06-14 03:28:57
|
On Thu, 2008-06-12 at 14:24 +0530, Subrata Modak wrote: > Thanks for this. I will test and get back to you soon. > > Regards-- > Subrata > > On Thu, 2008-06-12 at 14:18 +0800, Li Zefan wrote: > > 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 <li...@cn...> > > --- > > 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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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; > > + Since you don't wait for fork()'d child processes how about a: signal(SIGCHLD, SIG_IGN); Which will prevent them from ever becoming zombies. > > + /* 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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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); > > + I think you should also flush stdout: while (fsync(0) == -1) { if (errno != EIO) break; sleep(10); /* retry once every 10 seconds */ } Otherwise you've no guarantee that stdout buffers have been flushed before the kill (more below). The close() man page has an ominous NOTES section which I think suggests what could go wrong. > > + 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 <li...@cn...> ## > > +## ## > > +################################################################################ > > + > > +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 You might add comments for these sleeps. I guess this one should be something like: # Wait for pec_listener to start listening > > + > > + ./event_generator -e $2 > "$log/generator_$1.log" & > > + > > + wait $! What does running in the background and then waiting on the event_generator ($!) process buy us? Couldn't you just do: ./event_generator -e $2 > "$log/generator_$1.log" > > + ret1=$? > > + > > + sleep 1 The comment for the above sleep might read: # Sleep until pec_listener has seen and handled all of the generated events Also, in theory ./event_generator could someday generate multiple events (-n <NUM>). Perhaps there ought to be: NUM_EVENTS=1 at the top and: sleep $((1*NUM_EVENTS)) here? Use of "sleep" in tests worries me because they are generally meant to "avoid" races in the underlying test programs but the amount of time to sleep makes timing assumptions about the system's ability to run the tests pieces. However, sleep is highly practical while closing all possible races in test scripts make the code much more complicated. Hence I personally like to see these uses of "sleep" commented. In this case, depending on the system, load, and the number of events generated this sleep may not be sufficient. If there's other load on this system or if it's running on a virtual machine then pec_listener may not have enough time to process all of the events (from event_generator or otherwise) before receiving the signal. Unlikely I expect, but possible... > > + kill -s SIGINT $pid 2> /dev/null This worries me a little. I think we need to ensure that pec_listener has flushed its buffers before we kill it -- otherwise sometimes we may get false FAIL results. You already have pec_listener catch this signal and exit. The only missing part is the fsync(). > > + 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" > > + At the top of this script you could put: EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) TST_TOTAL=${#EVENT_TEST_CASES[@]} Then you could replace the "run_case" invokations with: i=0 for CASE in "${EVENT_TEST_CASES[@]}" ; do run_case $i $CASE ((i++)) done I don't see any significant issues -- just a couple obscure problems folks aren't very likely to encounter. Personally, I think these tests will be a valuable addition to LTP. Thanks for writing them! Cheers, -Matt Helsley |
From: Subrata M. <su...@li...> - 2008-06-15 17:28:21
|
> for CASE in "${EVENT_TEST_CASES[@]}" ; do > run_case $i $CASE > ((i++)) > done > > I don't see any significant issues -- just a couple obscure problems > folks aren't very likely to encounter. Personally, I think these tests > will be a valuable addition to LTP. Thanks for writing them! Hi Matt, Thanks for providing the initial and very valuable review comments. Any other tests/test cases that you might have written earlier, and which can be contributed to LTP under GPL now ? Regards-- Subrata > > Cheers, > -Matt Helsley > |
From: Li Z. <li...@cn...> - 2008-06-17 01:11:41
|
>>> +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; >>> + > > Since you don't wait for fork()'d child processes how about a: > signal(SIGCHLD, SIG_IGN); > > Which will prevent them from ever becoming zombies. > Ok, will fix. >>> + /* 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); >>> + > > I think you should also flush stdout: > > while (fsync(0) == -1) { > if (errno != EIO) > break; > sleep(10); /* retry once every 10 seconds */ > } > > Otherwise you've no guarantee that stdout buffers have been flushed > before the kill (more below). The close() man page has an ominous NOTES > section which I think suggests what could go wrong. > will fix. >>> +# $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 > > You might add comments for these sleeps. I guess this one should be > something like: > > # Wait for pec_listener to start listening > will fix. >>> + >>> + ./event_generator -e $2 > "$log/generator_$1.log" & >>> + >>> + wait $! > > What does running in the background and then waiting on the > event_generator ($!) process buy us? Couldn't you just do: > > ./event_generator -e $2 > "$log/generator_$1.log" > right, don't know what I was thinking when I wrote this. >>> + ret1=$? >>> + >>> + sleep 1 > > The comment for the above sleep might read: > > # Sleep until pec_listener has seen and handled all of the generated events > > Also, in theory ./event_generator could someday generate multiple events > (-n <NUM>). Perhaps there ought to be: > > NUM_EVENTS=1 > > at the top and: > > sleep $((1*NUM_EVENTS)) > > here? > this makes sense. > Use of "sleep" in tests worries me because they are generally meant to > "avoid" races in the underlying test programs but the amount of time to > sleep makes timing assumptions about the system's ability to run the > tests pieces. > > However, sleep is highly practical while closing all possible races in > test scripts make the code much more complicated. Hence I personally > like to see these uses of "sleep" commented. > > In this case, depending on the system, load, and the number of events > generated this sleep may not be sufficient. If there's other load on > this system or if it's running on a virtual machine then pec_listener > may not have enough time to process all of the events (from > event_generator or otherwise) before receiving the signal. Unlikely I > expect, but possible... > I know it's not a good habbit to use "sleep", but it's practical and commonly used, and the test is not intended to be run in high-load system. And when we run ltpstress, we will get some failures as expected, so I think this won't be a problem. >>> + kill -s SIGINT $pid 2> /dev/null > > This worries me a little. > > I think we need to ensure that pec_listener has flushed its buffers > before we kill it -- otherwise sometimes we may get false FAIL results. > You already have pec_listener catch this signal and exit. The only > missing part is the fsync(). > will fix. >>> + 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" >>> + > > At the top of this script you could put: > > EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) > TST_TOTAL=${#EVENT_TEST_CASES[@]} > > Then you could replace the "run_case" invokations with: > > i=0 > for CASE in "${EVENT_TEST_CASES[@]}" ; do > run_case $i $CASE > ((i++)) > done > This is better. :) > I don't see any significant issues -- just a couple obscure problems > folks aren't very likely to encounter. Personally, I think these tests > will be a valuable addition to LTP. Thanks for writing them! > Thanks for the comments. I'll revise the patch in this week. > Cheers, > -Matt Helsley > > > |
From: Li Z. <li...@cn...> - 2008-06-19 07:38:07
|
Hi, I've revised the patch according to your comments: - get it integrated with LTP-build - check if the user is root or not - prevent building if kernel version is below 2.6.15 And also fixed issues which Matt pointed out. But still not run by default, as I explained in a previous mail. Signed-off-by: Li Zefan <li...@cn...> --- runtest/connectors | 2 testcases/kernel/Makefile | 2 testcases/kernel/connectors/Makefile | 13 testcases/kernel/connectors/pec/Makefile | 13 testcases/kernel/connectors/pec/README | 48 +++ testcases/kernel/connectors/pec/event_generator.c | 229 +++++++++++++++ testcases/kernel/connectors/pec/pec_listener.c | 316 ++++++++++++++++++++++ testcases/kernel/connectors/pec/run_pec_test | 103 +++++++ 8 files changed, 725 insertions(+), 1 deletion(-) 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-06-19 14:54:45.000000000 +0800 @@ -0,0 +1,13 @@ +SUBDIRS = pec + +all: + @set -e; \ + if tst_kvercmp 2 6 15; then \ + echo "system does not support process event connector"; \ + else $(MAKE) -C pec; true; fi + +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-06-17 15:49:55.000000000 +0800 @@ -0,0 +1,229 @@ +/******************************************************************************/ +/* */ +/* 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 <li...@cn...> */ +/* */ +/******************************************************************************/ + +#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; + + signal(SIGCHLD, SIG_IGN); + + /* 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-06-19 13:41:44.000000000 +0800 @@ -0,0 +1,13 @@ +CFLAGS += -I../../../../include -Wall +LDLIBS += -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-06-17 15:59:41.000000000 +0800 @@ -0,0 +1,316 @@ +/******************************************************************************/ +/* */ +/* 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 <li...@cn...> */ +/* */ +/******************************************************************************/ + +#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); + + while (fsync(STDOUT_FILENO) == -1) { + if (errno != EIO) + break; + /* retry once every 10 secodns */ + sleep(10); + } + + 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-06-19 13:54:06.000000000 +0800 @@ -0,0 +1,48 @@ + +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. + +Note: the test can be run by root only. + +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-19 13:01:33.000000000 +0800 @@ -0,0 +1,103 @@ +#! /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 <li...@cn...> ## +## ## +################################################################################ + +NUM_EVENTS=1 +EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) +TST_TOTAL=${#EVENT_TEST_CASES[@]} + +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 +export TST_COUNT=1 + +exit_status=0 + +if [ "$USER" != root ]; then + tst_brkm TBROK ignored "Test must be run as root" + exit 0; +fi + +# 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=$! + # Wait for pec_listener to start listening + sleep $((1*NUM_EVENTS)) + + ./event_generator -e $2 > "$log/generator_$1.log" + ret1=$? + + # Sleep until pec_listener has seen and handled all of + # the generated events + sleep $((1*NUM_EVENTS)) + 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 +} + +i=1; +for CASE in "${EVENT_TEST_CASES[@]}" ; do + run_case $i $CASE + ((i++)) +done + +exit $exit_status + diff -Nurp ltp-full-20080531.orig/testcases/kernel/Makefile ltp-full-20080531/testcases/kernel/Makefile --- ltp-full-20080531.orig/testcases/kernel/Makefile 2008-02-28 22:06:16.000000000 +0800 +++ ltp-full-20080531/testcases/kernel/Makefile 2008-06-19 11:46:50.000000000 +0800 @@ -1,4 +1,4 @@ -SUBDIRS = numa containers controllers include fs io ipc mem pty sched security syscalls timers +SUBDIRS = connectors numa containers controllers include fs io ipc mem pty sched security syscalls timers UCLINUX_SUBDIRS = syscalls all: |
From: Subrata M. <su...@li...> - 2008-06-19 09:02:18
|
Thanks Li for resending the revised patch. I will take some time before i do the testing and will get back to you soon. Regards-- Subrata On Thu, 2008-06-19 at 15:35 +0800, Li Zefan wrote: > Hi, > > I've revised the patch according to your comments: > - get it integrated with LTP-build > - check if the user is root or not > - prevent building if kernel version is below 2.6.15 > > And also fixed issues which Matt pointed out. > > But still not run by default, as I explained in a previous mail. > > Signed-off-by: Li Zefan <li...@cn...> > --- > runtest/connectors | 2 > testcases/kernel/Makefile | 2 > testcases/kernel/connectors/Makefile | 13 > testcases/kernel/connectors/pec/Makefile | 13 > testcases/kernel/connectors/pec/README | 48 +++ > testcases/kernel/connectors/pec/event_generator.c | 229 +++++++++++++++ > testcases/kernel/connectors/pec/pec_listener.c | 316 ++++++++++++++++++++++ > testcases/kernel/connectors/pec/run_pec_test | 103 +++++++ > 8 files changed, 725 insertions(+), 1 deletion(-) > > 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-06-19 14:54:45.000000000 +0800 > @@ -0,0 +1,13 @@ > +SUBDIRS = pec > + > +all: > + @set -e; \ > + if tst_kvercmp 2 6 15; then \ > + echo "system does not support process event connector"; \ > + else $(MAKE) -C pec; true; fi > + > +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-06-17 15:49:55.000000000 +0800 > @@ -0,0 +1,229 @@ > +/******************************************************************************/ > +/* */ > +/* 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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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; > + > + signal(SIGCHLD, SIG_IGN); > + > + /* 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-06-19 13:41:44.000000000 +0800 > @@ -0,0 +1,13 @@ > +CFLAGS += -I../../../../include -Wall > +LDLIBS += -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-06-17 15:59:41.000000000 +0800 > @@ -0,0 +1,316 @@ > +/******************************************************************************/ > +/* */ > +/* 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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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); > + > + while (fsync(STDOUT_FILENO) == -1) { > + if (errno != EIO) > + break; > + /* retry once every 10 secodns */ > + sleep(10); > + } > + > + 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-06-19 13:54:06.000000000 +0800 > @@ -0,0 +1,48 @@ > + > +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. > + > +Note: the test can be run by root only. > + > +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-19 13:01:33.000000000 +0800 > @@ -0,0 +1,103 @@ > +#! /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 <li...@cn...> ## > +## ## > +################################################################################ > + > +NUM_EVENTS=1 > +EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) > +TST_TOTAL=${#EVENT_TEST_CASES[@]} > + > +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 > +export TST_COUNT=1 > + > +exit_status=0 > + > +if [ "$USER" != root ]; then > + tst_brkm TBROK ignored "Test must be run as root" > + exit 0; > +fi > + > +# 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=$! > + # Wait for pec_listener to start listening > + sleep $((1*NUM_EVENTS)) > + > + ./event_generator -e $2 > "$log/generator_$1.log" > + ret1=$? > + > + # Sleep until pec_listener has seen and handled all of > + # the generated events > + sleep $((1*NUM_EVENTS)) > + 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 > +} > + > +i=1; > +for CASE in "${EVENT_TEST_CASES[@]}" ; do > + run_case $i $CASE > + ((i++)) > +done > + > +exit $exit_status > + > diff -Nurp ltp-full-20080531.orig/testcases/kernel/Makefile ltp-full-20080531/testcases/kernel/Makefile > --- ltp-full-20080531.orig/testcases/kernel/Makefile 2008-02-28 22:06:16.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/Makefile 2008-06-19 11:46:50.000000000 +0800 > @@ -1,4 +1,4 @@ > -SUBDIRS = numa containers controllers include fs io ipc mem pty sched security syscalls timers > +SUBDIRS = connectors numa containers controllers include fs io ipc mem pty sched security syscalls timers > UCLINUX_SUBDIRS = syscalls > > all: > |
From: Subrata M. <su...@li...> - 2008-06-22 05:17:52
|
On Thu, 2008-06-19 at 15:35 +0800, Li Zefan wrote: > Hi, > > I've revised the patch according to your comments: > - get it integrated with LTP-build > - check if the user is root or not > - prevent building if kernel version is below 2.6.15 > > And also fixed issues which Matt pointed out. > > But still not run by default, as I explained in a previous mail. > > Signed-off-by: Li Zefan <li...@cn...> Thanks again for resending a revised patch. I had the opportunity to test it on various architectures and kernels. Following are my observations after testing this patch: 1) It is still not integrated inside default run. You should have an entry inside ltp/runltp script, so that it runs by default, instead of users needing to execute "./runltp -f connectors". A patch of the following kind is needed: --- ltp-full-20080531/runltp.orig 2008-06-22 02:10:39.000000000 +0530 +++ ltp-full-20080531/runltp 2008-06-22 02:11:18.000000000 +0530 @@ -510,7 +510,8 @@ main() ${LTPROOT}/runtest/fs_bind \ ${LTPROOT}/runtest/controllers \ ${LTPROOT}/runtest/filecaps \ - ${LTPROOT}/runtest/fcntl-locktests + ${LTPROOT}/runtest/fcntl-locktests \ + ${LTPROOT}/runtest/connectors do [ -e "$SCENFILES" ] || \ { 2) Checking kernel version to prevent building below was not correct, so it was giving build failures for kernels below 2.6.15. However i rectified that with the following patch: --- testcases/kernel/connectors/Makefile.orig 2008-06-21 12:24:15.000000000 -0700 +++ testcases/kernel/connectors/Makefile 2008-06-21 12:24:45.000000000 -0700 @@ -2,7 +2,7 @@ SUBDIRS = pec all: @set -e; \ - if tst_kvercmp 2 6 15; then \ + if ../../bin/tst_kvercmp 2 6 15; then \ echo "system does not support process event connector"; \ else $(MAKE) -C pec; true; fi Although it prevented building for kernels below 2.6.15, it gave install error post patch. 3) It gave build error (and hence install error) for even kernels above 2.6.15. Please see the results attached below for full details. 4) When it gets into default run through ltp/runltp, we will face a situation when the build and install has been avoided, but calling the binary through ltp/runltp will exist. In that case, the user will receive the following error: initiation_status="pan(): execvp of 'run_pec_test' (tag Connectors) failed. errno:2 No such file or directory" I would like to have a proper error shown to the user like: Connectors 0 CONF : System doesn't support execution of the test For this, the code inside runtest/connectors can be of: Connectors if [ -f run_pec_test ]; then run_pec_test; else echo "Connectors 0 CONF : System doesn't support execution of the test"; exit 0; fi 5) It built and installed successfully on some architectures. But run gave some error messages. Please see the detailed output below for more information. Following are results as obtained on various machines/architectures: ===================================================================== ===================================================================== 1) Linux 2.6.23.13 #1 SMP Wed Jan 9 18:14:28 PST 2008 ia64 GNU/Linux [Process_Event_Connectors: No Build Failure, Installed Properly, But Run failed, <<<test_output>>> incrementing stop pec01 1 FAIL : failed to listen process events pec01 2 FAIL : failed to listen process events pec01 3 FAIL : failed to listen process events pec01 4 FAIL : failed to listen process events pec01 5 FAIL : failed to listen process events <<<execution_status>>> ] ===================================================================== 2) Linux 2.6.16.21-0.8-default #1 SMP Mon Jul 3 18:25:39 UTC 2006 ia64 ia64 ia64 GNU/Linux [Process_Event_Connectors: Build Failure, cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from /usr/include/linux/cn_proc.h:29, from pec_listener.c:34: /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ make[4]: *** [pec_listener] Error 1 Post Patch: Build Failure: make[4]: Entering directory `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from /usr/include/linux/cn_proc.h:29, from pec_listener.c:34: /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ make[4]: *** [pec_listener] Error 1 ===================================================================== 3) Linux 2.6.9-70.EL #1 Fri May 2 13:00:36 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux [Process_Event_Connectors: Build Failure, cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from pec_listener.c:32: /usr/include/linux/netlink.h:22: error: syntax error before "__u32" /usr/include/linux/netlink.h:28: error: syntax error before "__u32" /usr/include/linux/netlink.h:30: error: syntax error before "nlmsg_flags" /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type pec_listener.c:33:29: linux/connector.h: No such file or directory pec_listener.c:34:27: linux/cn_proc.h: No such file or directory pec_listener.c:41: error: syntax error before "seq" pec_listener.c:41: warning: type defaults to `int' in declaration of `seq' pec_listener.c:41: warning: data definition has no type or storage class pec_listener.c:63: warning: "struct cn_msg" declared inside parameter list pec_listener.c:63: warning: its scope is only this definition or declaration, which is probably not what you want pec_listener.c: In function `netlink_send': pec_listener.c:75: error: dereferencing pointer to incomplete type pec_listener.c:76: error: dereferencing pointer to incomplete type pec_listener.c:77: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:79: error: dereferencing pointer to incomplete type pec_listener.c:80: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:84: error: dereferencing pointer to incomplete type pec_listener.c:88: error: dereferencing pointer to incomplete type pec_listener.c: In function `netlink_recv': pec_listener.c:111: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:116: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:119: error: dereferencing pointer to incomplete type pec_listener.c: At top level: pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside parameter list pec_listener.c:136: error: parameter `op' has incomplete type pec_listener.c: In function `control_pec': pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `cn_msg' pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `proc_cn_mcast_op' pec_listener.c:145: error: dereferencing pointer to incomplete type pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:145: error: (Each undeclared identifier is reported only once pec_listener.c:145: error: for each function it appears in.) pec_listener.c:146: error: dereferencing pointer to incomplete type pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this function) pec_listener.c:147: error: dereferencing pointer to incomplete type pec_listener.c:148: error: dereferencing pointer to incomplete type pec_listener.c:149: error: dereferencing pointer to incomplete type pec_listener.c:151: error: dereferencing pointer to incomplete type pec_listener.c:152: error: dereferencing pointer to incomplete type pec_listener.c:154: warning: passing arg 3 of `netlink_send' from incompatible pointer type pec_listener.c: In function `process_event': pec_listener.c:169: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:171: error: dereferencing pointer to incomplete type pec_listener.c:173: error: dereferencing pointer to incomplete type pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in this function) pec_listener.c:175: error: dereferencing pointer to incomplete type pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in this function) pec_listener.c:179: error: dereferencing pointer to incomplete type pec_listener.c:180: error: dereferencing pointer to incomplete type pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in this function) pec_listener.c:184: error: dereferencing pointer to incomplete type pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in this function) pec_listener.c:188: error: dereferencing pointer to incomplete type pec_listener.c:189: error: dereferencing pointer to incomplete type pec_listener.c:190: error: dereferencing pointer to incomplete type pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in this function) pec_listener.c:194: error: dereferencing pointer to incomplete type pec_listener.c:195: error: dereferencing pointer to incomplete type pec_listener.c:196: error: dereferencing pointer to incomplete type pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in this function) pec_listener.c:200: error: dereferencing pointer to incomplete type pec_listener.c:201: error: dereferencing pointer to incomplete type pec_listener.c:202: error: dereferencing pointer to incomplete type pec_listener.c: In function `main': pec_listener.c:214: error: storage size of 'l_local' isn't known pec_listener.c:215: error: storage size of 'src_addr' isn't known pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in this function) pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:241: error: invalid application of `sizeof' to incomplete type `sockaddr_nl' pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use in this function) pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use in this function) pec_listener.c:282: error: dereferencing pointer to incomplete type pec_listener.c:289: error: dereferencing pointer to incomplete type pec_listener.c:214: warning: unused variable `l_local' pec_listener.c:215: warning: unused variable `src_addr' make[4]: *** [pec_listener] Error 1 Post Patching: Install Error: make[4]: Entering directory `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' ln: accessing `pec_listener': No such file or directory make[4]: *** [install] Error 1 ] ===================================================================== 4) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 x86_64 GNU/Linux [Process_Event_Connector: Build Successfull, Install Successfull, Run Successfull, <<<test_output>>> incrementing stop pec01 1 PASS : get event - fork parent: 6259, child: 6260 pec01 2 PASS : get event - exec pid: 6271 pec01 3 PASS : get event - exit pid: 6281 exit_code: 0 pec01 4 PASS : get event - uid pid: 6290 euid: 99 pec01 5 PASS : get event - gid pid: 6299 egid: 99 <<<execution_status>>> ] ===================================================================== 5) Linux 2.6.15-23-server #1 SMP Tue May 23 15:10:35 UTC 2006 i686 GNU/Linux [Process_Event_Connector: Build Failure, cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener pec_listener.c:33:29: error: linux/connector.h: No such file or directory pec_listener.c:34:27: error: linux/cn_proc.h: No such file or directory pec_listener.c:63: warning: 'struct cn_msg' declared inside parameter list pec_listener.c:63: warning: its scope is only this definition or declaration, which is probably not what you want pec_listener.c: In function 'netlink_send': pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c: At top level: pec_listener.c:135: warning: 'enum proc_cn_mcast_op' declared inside parameter list pec_listener.c:135: error: parameter 3 ('op') has incomplete type pec_listener.c: In function 'control_pec': pec_listener.c:138: error: invalid application of 'sizeof' to incomplete type 'struct cn_msg' pec_listener.c:138: error: invalid application of 'sizeof' to incomplete type 'enum proc_cn_mcast_op' pec_listener.c:145: error: dereferencing pointer to incomplete type pec_listener.c:145: error: 'CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:145: error: (Each undeclared identifier is reported only once pec_listener.c:145: error: for each function it appears in.) pec_listener.c:146: error: dereferencing pointer to incomplete type pec_listener.c:146: error: 'CN_VAL_PROC' undeclared (first use in this function) pec_listener.c:147: error: dereferencing pointer to incomplete type pec_listener.c:148: error: dereferencing pointer to incomplete type pec_listener.c:149: error: dereferencing pointer to incomplete type pec_listener.c:151: error: dereferencing pointer to incomplete type pec_listener.c:152: error: dereferencing pointer to incomplete type pec_listener.c:154: warning: passing argument 3 of 'netlink_send' from incompatible pointer type pec_listener.c: In function 'process_event': pec_listener.c:171: error: dereferencing pointer to incomplete type pec_listener.c:173: error: dereferencing pointer to incomplete type pec_listener.c:174: error: 'PROC_EVENT_NONE' undeclared (first use in this function) pec_listener.c:175: error: dereferencing pointer to incomplete type pec_listener.c:177: error: 'PROC_EVENT_FORK' undeclared (first use in this function) pec_listener.c:179: error: dereferencing pointer to incomplete type pec_listener.c:180: error: dereferencing pointer to incomplete type pec_listener.c:182: error: 'PROC_EVENT_EXEC' undeclared (first use in this function) pec_listener.c:184: error: dereferencing pointer to incomplete type pec_listener.c:186: error: 'PROC_EVENT_UID' undeclared (first use in this function) pec_listener.c:188: error: dereferencing pointer to incomplete type pec_listener.c:189: error: dereferencing pointer to incomplete type pec_listener.c:190: error: dereferencing pointer to incomplete type pec_listener.c:192: error: 'PROC_EVENT_GID' undeclared (first use in this function) pec_listener.c:194: error: dereferencing pointer to incomplete type pec_listener.c:195: error: dereferencing pointer to incomplete type pec_listener.c:196: error: dereferencing pointer to incomplete type pec_listener.c:198: error: 'PROC_EVENT_EXIT' undeclared (first use in this function) pec_listener.c:200: error: dereferencing pointer to incomplete type pec_listener.c:201: error: dereferencing pointer to incomplete type pec_listener.c:202: error: dereferencing pointer to incomplete type pec_listener.c: In function 'main': pec_listener.c:224: error: 'NETLINK_CONNECTOR' undeclared (first use in this function) pec_listener.c:238: error: 'CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:248: error: 'PROC_CN_MCAST_LISTEN' undeclared (first use in this function) pec_listener.c:248: error: type of formal parameter 3 is incomplete pec_listener.c:263: error: 'PROC_CN_MCAST_IGNORE' undeclared (first use in this function) pec_listener.c:263: error: type of formal parameter 3 is incomplete pec_listener.c:276: error: type of formal parameter 3 is incomplete pec_listener.c:299: error: type of formal parameter 3 is incomplete make[4]: *** [pec_listener] Error 1 Post Patch: Build Failure as above ] ===================================================================== 6) Linux 2.6.7 #1 SMP Tue Aug 10 15:35:24 PDT 2004 i686 GNU/Linux [Process_Event_Connector: Build Failure, cc -Wall -I../../../../include -Wall event_generator.c -L../../../../lib -lltp -o event_generator cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener pec_listener.c:33:29: linux/connector.h: No such file or directory pec_listener.c:34:27: linux/cn_proc.h: No such file or directory pec_listener.c:63: warning: `struct cn_msg' declared inside parameter list pec_listener.c:63: warning: its scope is only this definition or declaration, which is probably not what you want pec_listener.c: In function `netlink_send': pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c: At top level: pec_listener.c:135: warning: `enum proc_cn_mcast_op' declared inside parameter list pec_listener.c:136: error: parameter `op' has incomplete type pec_listener.c: In function `control_pec': pec_listener.c:138: error: invalid application of `sizeof' to an incomplete type pec_listener.c:138: error: invalid application of `sizeof' to an incomplete type pec_listener.c:145: error: dereferencing pointer to incomplete type pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:145: error: (Each undeclared identifier is reported only once pec_listener.c:145: error: for each function it appears in.) pec_listener.c:146: error: dereferencing pointer to incomplete type pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this function) pec_listener.c:147: error: dereferencing pointer to incomplete type pec_listener.c:148: error: dereferencing pointer to incomplete type pec_listener.c:149: error: dereferencing pointer to incomplete type pec_listener.c:151: error: dereferencing pointer to incomplete type pec_listener.c:152: error: dereferencing pointer to incomplete type pec_listener.c:154: warning: passing arg 3 of `netlink_send' from incompatible pointer type pec_listener.c: In function `process_event': pec_listener.c:171: error: dereferencing pointer to incomplete type pec_listener.c:173: error: dereferencing pointer to incomplete type pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in this function) pec_listener.c:175: error: dereferencing pointer to incomplete type pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in this function) pec_listener.c:179: error: dereferencing pointer to incomplete type pec_listener.c:180: error: dereferencing pointer to incomplete type pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in this function) pec_listener.c:184: error: dereferencing pointer to incomplete type pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in this function) pec_listener.c:188: error: dereferencing pointer to incomplete type pec_listener.c:189: error: dereferencing pointer to incomplete type pec_listener.c:190: error: dereferencing pointer to incomplete type pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in this function) pec_listener.c:194: error: dereferencing pointer to incomplete type pec_listener.c:195: error: dereferencing pointer to incomplete type pec_listener.c:196: error: dereferencing pointer to incomplete type pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in this function) pec_listener.c:200: error: dereferencing pointer to incomplete type pec_listener.c:201: error: dereferencing pointer to incomplete type pec_listener.c:202: error: dereferencing pointer to incomplete type pec_listener.c: In function `main': pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in this function) pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use in this function) pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use in this function) make[4]: *** [pec_listener] Error 1 Post Patch: Install error: make[4]: Entering directory `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' ln: accessing `pec_listener': No such file or directory make[4]: *** [install] Error 1 ] ===================================================================== 7) Linux 2.6.9-42.EL #1 SMP Wed Jul 12 23:22:51 EDT 2006 ppc64 ppc64 ppc64 GNU/Linux [Process_Event_Connector: Build Failure, cc -Wall -I../../../../include -Wall pec_listener.c -L../../../../lib -lltp -o pec_listener In file included from pec_listener.c:32: /usr/include/linux/netlink.h:22: error: syntax error before "__u32" /usr/include/linux/netlink.h:28: error: syntax error before "__u32" /usr/include/linux/netlink.h:30: error: syntax error before "nlmsg_flags" /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type pec_listener.c:33:29: linux/connector.h: No such file or directory pec_listener.c:34:27: linux/cn_proc.h: No such file or directory pec_listener.c:41: error: syntax error before "seq" pec_listener.c:41: warning: type defaults to `int' in declaration of `seq' pec_listener.c:41: warning: data definition has no type or storage class pec_listener.c:63: warning: "struct cn_msg" declared inside parameter list pec_listener.c:63: warning: its scope is only this definition or declaration, which is probably not what you want pec_listener.c: In function `netlink_send': pec_listener.c:75: error: dereferencing pointer to incomplete type pec_listener.c:76: error: dereferencing pointer to incomplete type pec_listener.c:77: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: dereferencing pointer to incomplete type pec_listener.c:78: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:79: error: dereferencing pointer to incomplete type pec_listener.c:80: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:80: error: dereferencing pointer to incomplete type pec_listener.c:84: error: dereferencing pointer to incomplete type pec_listener.c:88: error: dereferencing pointer to incomplete type pec_listener.c: In function `netlink_recv': pec_listener.c:111: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:116: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:119: error: dereferencing pointer to incomplete type pec_listener.c: At top level: pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside parameter list pec_listener.c:136: error: parameter `op' has incomplete type pec_listener.c: In function `control_pec': pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `cn_msg' pec_listener.c:138: error: invalid application of `sizeof' to incomplete type `proc_cn_mcast_op' pec_listener.c:145: error: dereferencing pointer to incomplete type pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:145: error: (Each undeclared identifier is reported only once pec_listener.c:145: error: for each function it appears in.) pec_listener.c:146: error: dereferencing pointer to incomplete type pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this function) pec_listener.c:147: error: dereferencing pointer to incomplete type pec_listener.c:148: error: dereferencing pointer to incomplete type pec_listener.c:149: error: dereferencing pointer to incomplete type pec_listener.c:151: error: dereferencing pointer to incomplete type pec_listener.c:152: error: dereferencing pointer to incomplete type pec_listener.c:154: warning: passing arg 3 of `netlink_send' from incompatible pointer type pec_listener.c: In function `process_event': pec_listener.c:169: error: invalid application of `sizeof' to incomplete type `nlmsghdr' pec_listener.c:171: error: dereferencing pointer to incomplete type pec_listener.c:173: error: dereferencing pointer to incomplete type pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in this function) pec_listener.c:175: error: dereferencing pointer to incomplete type pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in this function) pec_listener.c:179: error: dereferencing pointer to incomplete type pec_listener.c:180: error: dereferencing pointer to incomplete type pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in this function) pec_listener.c:184: error: dereferencing pointer to incomplete type pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in this function) pec_listener.c:188: error: dereferencing pointer to incomplete type pec_listener.c:189: error: dereferencing pointer to incomplete type pec_listener.c:190: error: dereferencing pointer to incomplete type pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in this function) pec_listener.c:194: error: dereferencing pointer to incomplete type pec_listener.c:195: error: dereferencing pointer to incomplete type pec_listener.c:196: error: dereferencing pointer to incomplete type pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in this function) pec_listener.c:200: error: dereferencing pointer to incomplete type pec_listener.c:201: error: dereferencing pointer to incomplete type pec_listener.c:202: error: dereferencing pointer to incomplete type pec_listener.c: In function `main': pec_listener.c:214: error: storage size of 'l_local' isn't known pec_listener.c:215: error: storage size of 'src_addr' isn't known pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in this function) pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this function) pec_listener.c:241: error: invalid application of `sizeof' to incomplete type `sockaddr_nl' pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use in this function) pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use in this function) pec_listener.c:282: error: dereferencing pointer to incomplete type pec_listener.c:289: error: dereferencing pointer to incomplete type pec_listener.c:214: warning: unused variable `l_local' pec_listener.c:215: warning: unused variable `src_addr' make[4]: *** [pec_listener] Error 1 Post Patch: Install Error: make[4]: Entering directory `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' ln: accessing `pec_listener': No such file or directory make[4]: *** [install] Error 1 ] ===================================================================== 8) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:21:29 EDT 2008 ppc64 ppc64 ppc64 GNU/Linux [Process_Event_Connector: Build Successful, Install Successful, Run Failed with weired results, <<<test_output>>> incrementing stop unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 1 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 2 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 3 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 4 FAIL : failed to generate process events unknown option! Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] pec01 5 FAIL : failed to generate process events <<<execution_status>>> ] ===================================================================== ===================================================================== Regards-- Subrata > --- > runtest/connectors | 2 > testcases/kernel/Makefile | 2 > testcases/kernel/connectors/Makefile | 13 > testcases/kernel/connectors/pec/Makefile | 13 > testcases/kernel/connectors/pec/README | 48 +++ > testcases/kernel/connectors/pec/event_generator.c | 229 +++++++++++++++ > testcases/kernel/connectors/pec/pec_listener.c | 316 ++++++++++++++++++++++ > testcases/kernel/connectors/pec/run_pec_test | 103 +++++++ > 8 files changed, 725 insertions(+), 1 deletion(-) > > 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-06-19 14:54:45.000000000 +0800 > @@ -0,0 +1,13 @@ > +SUBDIRS = pec > + > +all: > + @set -e; \ > + if tst_kvercmp 2 6 15; then \ > + echo "system does not support process event connector"; \ > + else $(MAKE) -C pec; true; fi > + > +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-06-17 15:49:55.000000000 +0800 > @@ -0,0 +1,229 @@ > +/******************************************************************************/ > +/* */ > +/* 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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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; > + > + signal(SIGCHLD, SIG_IGN); > + > + /* 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-06-19 13:41:44.000000000 +0800 > @@ -0,0 +1,13 @@ > +CFLAGS += -I../../../../include -Wall > +LDLIBS += -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-06-17 15:59:41.000000000 +0800 > @@ -0,0 +1,316 @@ > +/******************************************************************************/ > +/* */ > +/* 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 <li...@cn...> */ > +/* */ > +/******************************************************************************/ > + > +#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); > + > + while (fsync(STDOUT_FILENO) == -1) { > + if (errno != EIO) > + break; > + /* retry once every 10 secodns */ > + sleep(10); > + } > + > + 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-06-19 13:54:06.000000000 +0800 > @@ -0,0 +1,48 @@ > + > +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. > + > +Note: the test can be run by root only. > + > +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-19 13:01:33.000000000 +0800 > @@ -0,0 +1,103 @@ > +#! /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 <li...@cn...> ## > +## ## > +################################################################################ > + > +NUM_EVENTS=1 > +EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) > +TST_TOTAL=${#EVENT_TEST_CASES[@]} > + > +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 > +export TST_COUNT=1 > + > +exit_status=0 > + > +if [ "$USER" != root ]; then > + tst_brkm TBROK ignored "Test must be run as root" > + exit 0; > +fi > + > +# 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=$! > + # Wait for pec_listener to start listening > + sleep $((1*NUM_EVENTS)) > + > + ./event_generator -e $2 > "$log/generator_$1.log" > + ret1=$? > + > + # Sleep until pec_listener has seen and handled all of > + # the generated events > + sleep $((1*NUM_EVENTS)) > + 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 > +} > + > +i=1; > +for CASE in "${EVENT_TEST_CASES[@]}" ; do > + run_case $i $CASE > + ((i++)) > +done > + > +exit $exit_status > + > diff -Nurp ltp-full-20080531.orig/testcases/kernel/Makefile ltp-full-20080531/testcases/kernel/Makefile > --- ltp-full-20080531.orig/testcases/kernel/Makefile 2008-02-28 22:06:16.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/Makefile 2008-06-19 11:46:50.000000000 +0800 > @@ -1,4 +1,4 @@ > -SUBDIRS = numa containers controllers include fs io ipc mem pty sched security syscalls timers > +SUBDIRS = connectors numa containers controllers include fs io ipc mem pty sched security syscalls timers > UCLINUX_SUBDIRS = syscalls > > all: > |
From: Subrata M. <su...@li...> - 2008-06-25 13:19:22
|
Li, Will you be resending me a renewed patch that fixes those issues, so that i can merge for the June 2008 LTP release ? Regards-- Subrata On Sun, 2008-06-22 at 02:38 +0530, Subrata Modak wrote: > On Thu, 2008-06-19 at 15:35 +0800, Li Zefan wrote: > > Hi, > > > > I've revised the patch according to your comments: > > - get it integrated with LTP-build > > - check if the user is root or not > > - prevent building if kernel version is below 2.6.15 > > > > And also fixed issues which Matt pointed out. > > > > But still not run by default, as I explained in a previous mail. > > > > Signed-off-by: Li Zefan <li...@cn...> > > Thanks again for resending a revised patch. I had the opportunity to > test it on various architectures and kernels. Following are my > observations after testing this patch: > > 1) It is still not integrated inside default run. You should have an > entry inside ltp/runltp script, so that it runs by default, instead of > users needing to execute "./runltp -f connectors". A patch of the > following kind is needed: > > --- ltp-full-20080531/runltp.orig 2008-06-22 02:10:39.000000000 +0530 > +++ ltp-full-20080531/runltp 2008-06-22 02:11:18.000000000 +0530 > @@ -510,7 +510,8 @@ main() > ${LTPROOT}/runtest/fs_bind \ > ${LTPROOT}/runtest/controllers \ > ${LTPROOT}/runtest/filecaps \ > - ${LTPROOT}/runtest/fcntl-locktests > + ${LTPROOT}/runtest/fcntl-locktests \ > + ${LTPROOT}/runtest/connectors > do > [ -e "$SCENFILES" ] || \ > { > > 2) Checking kernel version to prevent building below was not correct, so > it was giving build failures for kernels below 2.6.15. However i > rectified that with the following patch: > > --- testcases/kernel/connectors/Makefile.orig 2008-06-21 > 12:24:15.000000000 -0700 > +++ testcases/kernel/connectors/Makefile 2008-06-21 12:24:45.000000000 > -0700 > @@ -2,7 +2,7 @@ SUBDIRS = pec > > all: > @set -e; \ > - if tst_kvercmp 2 6 15; then \ > + if ../../bin/tst_kvercmp 2 6 15; then \ > echo "system does not support process event connector"; \ > else $(MAKE) -C pec; true; fi > > > Although it prevented building for kernels below 2.6.15, it gave install > error post patch. > > 3) It gave build error (and hence install error) for even kernels above > 2.6.15. Please see the results attached below for full details. > > 4) When it gets into default run through ltp/runltp, we will face a > situation when the build and install has been avoided, but calling the > binary through ltp/runltp will exist. In that case, the user will > receive the following error: > > initiation_status="pan(): execvp of 'run_pec_test' (tag Connectors) > failed. errno:2 No such file or directory" > > I would like to have a proper error shown to the user like: > > Connectors 0 CONF : System doesn't support execution of the test > > For this, the code inside runtest/connectors can be of: > > Connectors if [ -f run_pec_test ]; then run_pec_test; else echo > "Connectors 0 CONF : System doesn't support execution of the test"; > exit 0; fi > > 5) It built and installed successfully on some architectures. But run > gave some error messages. Please see the detailed output below for more > information. > > Following are results as obtained on various machines/architectures: > ===================================================================== > ===================================================================== > 1) Linux 2.6.23.13 #1 SMP Wed Jan 9 18:14:28 PST 2008 ia64 GNU/Linux > [Process_Event_Connectors: No Build Failure, Installed Properly, But Run > failed, > <<<test_output>>> > incrementing stop > pec01 1 FAIL : failed to listen process events > pec01 2 FAIL : failed to listen process events > pec01 3 FAIL : failed to listen process events > pec01 4 FAIL : failed to listen process events > pec01 5 FAIL : failed to listen process events > <<<execution_status>>> > ] > ===================================================================== > 2) Linux 2.6.16.21-0.8-default #1 SMP Mon Jul 3 18:25:39 UTC 2006 ia64 > ia64 ia64 GNU/Linux > [Process_Event_Connectors: Build Failure, > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from /usr/include/linux/cn_proc.h:29, > from pec_listener.c:34: > /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ > /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ > make[4]: *** [pec_listener] Error 1 > > Post Patch: Build Failure: > > make[4]: Entering directory > `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from /usr/include/linux/cn_proc.h:29, > from pec_listener.c:34: > /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ > /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ > make[4]: *** [pec_listener] Error 1 > ===================================================================== > 3) Linux 2.6.9-70.EL #1 Fri May 2 13:00:36 EDT 2008 x86_64 x86_64 x86_64 > GNU/Linux > [Process_Event_Connectors: Build Failure, > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from pec_listener.c:32: > /usr/include/linux/netlink.h:22: error: syntax error before "__u32" > /usr/include/linux/netlink.h:28: error: syntax error before "__u32" > /usr/include/linux/netlink.h:30: error: syntax error before > "nlmsg_flags" > /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" > /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" > /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type > pec_listener.c:33:29: linux/connector.h: No such file or directory > pec_listener.c:34:27: linux/cn_proc.h: No such file or directory > pec_listener.c:41: error: syntax error before "seq" > pec_listener.c:41: warning: type defaults to `int' in declaration of > `seq' > pec_listener.c:41: warning: data definition has no type or storage class > pec_listener.c:63: warning: "struct cn_msg" declared inside parameter > list > pec_listener.c:63: warning: its scope is only this definition or > declaration, which is probably not what you want > pec_listener.c: In function `netlink_send': > pec_listener.c:75: error: dereferencing pointer to incomplete type > pec_listener.c:76: error: dereferencing pointer to incomplete type > pec_listener.c:77: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:79: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:84: error: dereferencing pointer to incomplete type > pec_listener.c:88: error: dereferencing pointer to incomplete type > pec_listener.c: In function `netlink_recv': > pec_listener.c:111: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:116: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:119: error: dereferencing pointer to incomplete type > pec_listener.c: At top level: > pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside > parameter list > pec_listener.c:136: error: parameter `op' has incomplete type > pec_listener.c: In function `control_pec': > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `cn_msg' > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `proc_cn_mcast_op' > pec_listener.c:145: error: dereferencing pointer to incomplete type > pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:145: error: (Each undeclared identifier is reported only > once > pec_listener.c:145: error: for each function it appears in.) > pec_listener.c:146: error: dereferencing pointer to incomplete type > pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this > function) > pec_listener.c:147: error: dereferencing pointer to incomplete type > pec_listener.c:148: error: dereferencing pointer to incomplete type > pec_listener.c:149: error: dereferencing pointer to incomplete type > pec_listener.c:151: error: dereferencing pointer to incomplete type > pec_listener.c:152: error: dereferencing pointer to incomplete type > pec_listener.c:154: warning: passing arg 3 of `netlink_send' from > incompatible pointer type > pec_listener.c: In function `process_event': > pec_listener.c:169: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:171: error: dereferencing pointer to incomplete type > pec_listener.c:173: error: dereferencing pointer to incomplete type > pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in > this function) > pec_listener.c:175: error: dereferencing pointer to incomplete type > pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in > this function) > pec_listener.c:179: error: dereferencing pointer to incomplete type > pec_listener.c:180: error: dereferencing pointer to incomplete type > pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in > this function) > pec_listener.c:184: error: dereferencing pointer to incomplete type > pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in > this function) > pec_listener.c:188: error: dereferencing pointer to incomplete type > pec_listener.c:189: error: dereferencing pointer to incomplete type > pec_listener.c:190: error: dereferencing pointer to incomplete type > pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in > this function) > pec_listener.c:194: error: dereferencing pointer to incomplete type > pec_listener.c:195: error: dereferencing pointer to incomplete type > pec_listener.c:196: error: dereferencing pointer to incomplete type > pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in > this function) > pec_listener.c:200: error: dereferencing pointer to incomplete type > pec_listener.c:201: error: dereferencing pointer to incomplete type > pec_listener.c:202: error: dereferencing pointer to incomplete type > pec_listener.c: In function `main': > pec_listener.c:214: error: storage size of 'l_local' isn't known > pec_listener.c:215: error: storage size of 'src_addr' isn't known > pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in > this function) > pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:241: error: invalid application of `sizeof' to incomplete > type `sockaddr_nl' > pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use > in this function) > pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use > in this function) > pec_listener.c:282: error: dereferencing pointer to incomplete type > pec_listener.c:289: error: dereferencing pointer to incomplete type > pec_listener.c:214: warning: unused variable `l_local' > pec_listener.c:215: warning: unused variable `src_addr' > make[4]: *** [pec_listener] Error 1 > > Post Patching: Install Error: > > make[4]: Entering directory > `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' > ln: accessing `pec_listener': No such file or directory > make[4]: *** [install] Error 1 > ] > ===================================================================== > 4) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 > x86_64 GNU/Linux > [Process_Event_Connector: Build Successfull, Install Successfull, Run > Successfull, > <<<test_output>>> > incrementing stop > pec01 1 PASS : get event - fork parent: 6259, child: 6260 > pec01 2 PASS : get event - exec pid: 6271 > pec01 3 PASS : get event - exit pid: 6281 exit_code: 0 > pec01 4 PASS : get event - uid pid: 6290 euid: 99 > pec01 5 PASS : get event - gid pid: 6299 egid: 99 > <<<execution_status>>> > ] > ===================================================================== > 5) Linux 2.6.15-23-server #1 SMP Tue May 23 15:10:35 UTC 2006 i686 > GNU/Linux > [Process_Event_Connector: Build Failure, > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > pec_listener.c:33:29: error: linux/connector.h: No such file or > directory > pec_listener.c:34:27: error: linux/cn_proc.h: No such file or directory > pec_listener.c:63: warning: 'struct cn_msg' declared inside parameter > list > pec_listener.c:63: warning: its scope is only this definition or > declaration, which is probably not what you want > pec_listener.c: In function 'netlink_send': > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c: At top level: > pec_listener.c:135: warning: 'enum proc_cn_mcast_op' declared inside > parameter list > pec_listener.c:135: error: parameter 3 ('op') has incomplete type > pec_listener.c: In function 'control_pec': > pec_listener.c:138: error: invalid application of 'sizeof' to incomplete > type 'struct cn_msg' > pec_listener.c:138: error: invalid application of 'sizeof' to incomplete > type 'enum proc_cn_mcast_op' > pec_listener.c:145: error: dereferencing pointer to incomplete type > pec_listener.c:145: error: 'CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:145: error: (Each undeclared identifier is reported only > once > pec_listener.c:145: error: for each function it appears in.) > pec_listener.c:146: error: dereferencing pointer to incomplete type > pec_listener.c:146: error: 'CN_VAL_PROC' undeclared (first use in this > function) > pec_listener.c:147: error: dereferencing pointer to incomplete type > pec_listener.c:148: error: dereferencing pointer to incomplete type > pec_listener.c:149: error: dereferencing pointer to incomplete type > pec_listener.c:151: error: dereferencing pointer to incomplete type > pec_listener.c:152: error: dereferencing pointer to incomplete type > pec_listener.c:154: warning: passing argument 3 of 'netlink_send' from > incompatible pointer type > pec_listener.c: In function 'process_event': > pec_listener.c:171: error: dereferencing pointer to incomplete type > pec_listener.c:173: error: dereferencing pointer to incomplete type > pec_listener.c:174: error: 'PROC_EVENT_NONE' undeclared (first use in > this function) > pec_listener.c:175: error: dereferencing pointer to incomplete type > pec_listener.c:177: error: 'PROC_EVENT_FORK' undeclared (first use in > this function) > pec_listener.c:179: error: dereferencing pointer to incomplete type > pec_listener.c:180: error: dereferencing pointer to incomplete type > pec_listener.c:182: error: 'PROC_EVENT_EXEC' undeclared (first use in > this function) > pec_listener.c:184: error: dereferencing pointer to incomplete type > pec_listener.c:186: error: 'PROC_EVENT_UID' undeclared (first use in > this function) > pec_listener.c:188: error: dereferencing pointer to incomplete type > pec_listener.c:189: error: dereferencing pointer to incomplete type > pec_listener.c:190: error: dereferencing pointer to incomplete type > pec_listener.c:192: error: 'PROC_EVENT_GID' undeclared (first use in > this function) > pec_listener.c:194: error: dereferencing pointer to incomplete type > pec_listener.c:195: error: dereferencing pointer to incomplete type > pec_listener.c:196: error: dereferencing pointer to incomplete type > pec_listener.c:198: error: 'PROC_EVENT_EXIT' undeclared (first use in > this function) > pec_listener.c:200: error: dereferencing pointer to incomplete type > pec_listener.c:201: error: dereferencing pointer to incomplete type > pec_listener.c:202: error: dereferencing pointer to incomplete type > pec_listener.c: In function 'main': > pec_listener.c:224: error: 'NETLINK_CONNECTOR' undeclared (first use in > this function) > pec_listener.c:238: error: 'CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:248: error: 'PROC_CN_MCAST_LISTEN' undeclared (first use > in this function) > pec_listener.c:248: error: type of formal parameter 3 is incomplete > pec_listener.c:263: error: 'PROC_CN_MCAST_IGNORE' undeclared (first use > in this function) > pec_listener.c:263: error: type of formal parameter 3 is incomplete > pec_listener.c:276: error: type of formal parameter 3 is incomplete > pec_listener.c:299: error: type of formal parameter 3 is incomplete > make[4]: *** [pec_listener] Error 1 > > Post Patch: Build Failure as above > ] > ===================================================================== > 6) Linux 2.6.7 #1 SMP Tue Aug 10 15:35:24 PDT 2004 i686 GNU/Linux > [Process_Event_Connector: Build Failure, > cc -Wall -I../../../../include -Wall event_generator.c > -L../../../../lib -lltp -o event_generator > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > pec_listener.c:33:29: linux/connector.h: No such file or directory > pec_listener.c:34:27: linux/cn_proc.h: No such file or directory > pec_listener.c:63: warning: `struct cn_msg' declared inside parameter > list > pec_listener.c:63: warning: its scope is only this definition or > declaration, which is probably not what you want > pec_listener.c: In function `netlink_send': > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c: At top level: > pec_listener.c:135: warning: `enum proc_cn_mcast_op' declared inside > parameter list > pec_listener.c:136: error: parameter `op' has incomplete type > pec_listener.c: In function `control_pec': > pec_listener.c:138: error: invalid application of `sizeof' to an > incomplete type > pec_listener.c:138: error: invalid application of `sizeof' to an > incomplete type > pec_listener.c:145: error: dereferencing pointer to incomplete type > pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:145: error: (Each undeclared identifier is reported only > once > pec_listener.c:145: error: for each function it appears in.) > pec_listener.c:146: error: dereferencing pointer to incomplete type > pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this > function) > pec_listener.c:147: error: dereferencing pointer to incomplete type > pec_listener.c:148: error: dereferencing pointer to incomplete type > pec_listener.c:149: error: dereferencing pointer to incomplete type > pec_listener.c:151: error: dereferencing pointer to incomplete type > pec_listener.c:152: error: dereferencing pointer to incomplete type > pec_listener.c:154: warning: passing arg 3 of `netlink_send' from > incompatible pointer type > pec_listener.c: In function `process_event': > pec_listener.c:171: error: dereferencing pointer to incomplete type > pec_listener.c:173: error: dereferencing pointer to incomplete type > pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in > this function) > pec_listener.c:175: error: dereferencing pointer to incomplete type > pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in > this function) > pec_listener.c:179: error: dereferencing pointer to incomplete type > pec_listener.c:180: error: dereferencing pointer to incomplete type > pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in > this function) > pec_listener.c:184: error: dereferencing pointer to incomplete type > pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in > this function) > pec_listener.c:188: error: dereferencing pointer to incomplete type > pec_listener.c:189: error: dereferencing pointer to incomplete type > pec_listener.c:190: error: dereferencing pointer to incomplete type > pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in > this function) > pec_listener.c:194: error: dereferencing pointer to incomplete type > pec_listener.c:195: error: dereferencing pointer to incomplete type > pec_listener.c:196: error: dereferencing pointer to incomplete type > pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in > this function) > pec_listener.c:200: error: dereferencing pointer to incomplete type > pec_listener.c:201: error: dereferencing pointer to incomplete type > pec_listener.c:202: error: dereferencing pointer to incomplete type > pec_listener.c: In function `main': > pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in > this function) > pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use > in this function) > pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use > in this function) > make[4]: *** [pec_listener] Error 1 > > Post Patch: Install error: > > make[4]: Entering directory > `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' > ln: accessing `pec_listener': No such file or directory > make[4]: *** [install] Error 1 > ] > ===================================================================== > 7) Linux 2.6.9-42.EL #1 SMP Wed Jul 12 23:22:51 EDT 2006 ppc64 ppc64 > ppc64 GNU/Linux > [Process_Event_Connector: Build Failure, > cc -Wall -I../../../../include -Wall pec_listener.c > -L../../../../lib -lltp -o pec_listener > In file included from pec_listener.c:32: > /usr/include/linux/netlink.h:22: error: syntax error before "__u32" > /usr/include/linux/netlink.h:28: error: syntax error before "__u32" > /usr/include/linux/netlink.h:30: error: syntax error before > "nlmsg_flags" > /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" > /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" > /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type > pec_listener.c:33:29: linux/connector.h: No such file or directory > pec_listener.c:34:27: linux/cn_proc.h: No such file or directory > pec_listener.c:41: error: syntax error before "seq" > pec_listener.c:41: warning: type defaults to `int' in declaration of > `seq' > pec_listener.c:41: warning: data definition has no type or storage class > pec_listener.c:63: warning: "struct cn_msg" declared inside parameter > list > pec_listener.c:63: warning: its scope is only this definition or > declaration, which is probably not what you want > pec_listener.c: In function `netlink_send': > pec_listener.c:75: error: dereferencing pointer to incomplete type > pec_listener.c:76: error: dereferencing pointer to incomplete type > pec_listener.c:77: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: dereferencing pointer to incomplete type > pec_listener.c:78: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:79: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:80: error: dereferencing pointer to incomplete type > pec_listener.c:84: error: dereferencing pointer to incomplete type > pec_listener.c:88: error: dereferencing pointer to incomplete type > pec_listener.c: In function `netlink_recv': > pec_listener.c:111: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:116: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:119: error: dereferencing pointer to incomplete type > pec_listener.c: At top level: > pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside > parameter list > pec_listener.c:136: error: parameter `op' has incomplete type > pec_listener.c: In function `control_pec': > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `cn_msg' > pec_listener.c:138: error: invalid application of `sizeof' to incomplete > type `proc_cn_mcast_op' > pec_listener.c:145: error: dereferencing pointer to incomplete type > pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:145: error: (Each undeclared identifier is reported only > once > pec_listener.c:145: error: for each function it appears in.) > pec_listener.c:146: error: dereferencing pointer to incomplete type > pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this > function) > pec_listener.c:147: error: dereferencing pointer to incomplete type > pec_listener.c:148: error: dereferencing pointer to incomplete type > pec_listener.c:149: error: dereferencing pointer to incomplete type > pec_listener.c:151: error: dereferencing pointer to incomplete type > pec_listener.c:152: error: dereferencing pointer to incomplete type > pec_listener.c:154: warning: passing arg 3 of `netlink_send' from > incompatible pointer type > pec_listener.c: In function `process_event': > pec_listener.c:169: error: invalid application of `sizeof' to incomplete > type `nlmsghdr' > pec_listener.c:171: error: dereferencing pointer to incomplete type > pec_listener.c:173: error: dereferencing pointer to incomplete type > pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in > this function) > pec_listener.c:175: error: dereferencing pointer to incomplete type > pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in > this function) > pec_listener.c:179: error: dereferencing pointer to incomplete type > pec_listener.c:180: error: dereferencing pointer to incomplete type > pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in > this function) > pec_listener.c:184: error: dereferencing pointer to incomplete type > pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in > this function) > pec_listener.c:188: error: dereferencing pointer to incomplete type > pec_listener.c:189: error: dereferencing pointer to incomplete type > pec_listener.c:190: error: dereferencing pointer to incomplete type > pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in > this function) > pec_listener.c:194: error: dereferencing pointer to incomplete type > pec_listener.c:195: error: dereferencing pointer to incomplete type > pec_listener.c:196: error: dereferencing pointer to incomplete type > pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in > this function) > pec_listener.c:200: error: dereferencing pointer to incomplete type > pec_listener.c:201: error: dereferencing pointer to incomplete type > pec_listener.c:202: error: dereferencing pointer to incomplete type > pec_listener.c: In function `main': > pec_listener.c:214: error: storage size of 'l_local' isn't known > pec_listener.c:215: error: storage size of 'src_addr' isn't known > pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in > this function) > pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this > function) > pec_listener.c:241: error: invalid application of `sizeof' to incomplete > type `sockaddr_nl' > pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use > in this function) > pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use > in this function) > pec_listener.c:282: error: dereferencing pointer to incomplete type > pec_listener.c:289: error: dereferencing pointer to incomplete type > pec_listener.c:214: warning: unused variable `l_local' > pec_listener.c:215: warning: unused variable `src_addr' > make[4]: *** [pec_listener] Error 1 > > Post Patch: Install Error: > > make[4]: Entering directory > `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' > ln: accessing `pec_listener': No such file or directory > make[4]: *** [install] Error 1 > ] > ===================================================================== > 8) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:21:29 EDT 2008 ppc64 ppc64 > ppc64 GNU/Linux > [Process_Event_Connector: Build Successful, Install Successful, Run > Failed with weired results, > <<<test_output>>> > incrementing stop > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 1 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 2 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 3 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 4 FAIL : failed to generate process events > unknown option! > Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] > pec01 5 FAIL : failed to generate process events > <<<execution_status>>> > ] > ===================================================================== > ===================================================================== > > Regards-- > Subrata > > > > --- > > runtest/connectors | 2 > > testcases/kernel/Makefile | 2 > > testcases/kernel/connectors/Makefile | 13 > > testcases/kernel/connectors/pec/Makefile | 13 > > testcases/kernel/connectors/pec/README | 48 +++ > > testcases/kernel/connectors/pec/event_generator.c | 229 +++++++++++++++ > > testcases/kernel/connectors/pec/pec_listener.c | 316 ++++++++++++++++++++++ > > testcases/kernel/connectors/pec/run_pec_test | 103 +++++++ > > 8 files changed, 725 insertions(+), 1 deletion(-) > > > > 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-06-19 14:54:45.000000000 +0800 > > @@ -0,0 +1,13 @@ > > +SUBDIRS = pec > > + > > +all: > > + @set -e; \ > > + if tst_kvercmp 2 6 15; then \ > > + echo "system does not support process event connector"; \ > > + else $(MAKE) -C pec; true; fi > > + > > +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-06-17 15:49:55.000000000 +0800 > > @@ -0,0 +1,229 @@ > > +/******************************************************************************/ > > +/* */ > > +/* 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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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; > > + > > + signal(SIGCHLD, SIG_IGN); > > + > > + /* 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-06-19 13:41:44.000000000 +0800 > > @@ -0,0 +1,13 @@ > > +CFLAGS += -I../../../../include -Wall > > +LDLIBS += -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-06-17 15:59:41.000000000 +0800 > > @@ -0,0 +1,316 @@ > > +/******************************************************************************/ > > +/* */ > > +/* 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 <li...@cn...> */ > > +/* */ > > +/******************************************************************************/ > > + > > +#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); > > + > > + while (fsync(STDOUT_FILENO) == -1) { > > + if (errno != EIO) > > + break; > > + /* retry once every 10 secodns */ > > + sleep(10); > > + } > > + > > + 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-06-19 13:54:06.000000000 +0800 > > @@ -0,0 +1,48 @@ > > + > > +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. > > + > > +Note: the test can be run by root only. > > + > > +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-19 13:01:33.000000000 +0800 > > @@ -0,0 +1,103 @@ > > +#! /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 <li...@cn...> ## > > +## ## > > +################################################################################ > > + > > +NUM_EVENTS=1 > > +EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) > > +TST_TOTAL=${#EVENT_TEST_CASES[@]} > > + > > +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 > > +export TST_COUNT=1 > > + > > +exit_status=0 > > + > > +if [ "$USER" != root ]; then > > + tst_brkm TBROK ignored "Test must be run as root" > > + exit 0; > > +fi > > + > > +# 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=$! > > + # Wait for pec_listener to start listening > > + sleep $((1*NUM_EVENTS)) > > + > > + ./event_generator -e $2 > "$log/generator_$1.log" > > + ret1=$? > > + > > + # Sleep until pec_listener has seen and handled all of > > + # the generated events > > + sleep $((1*NUM_EVENTS)) > > + 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 > > +} > > + > > +i=1; > > +for CASE in "${EVENT_TEST_CASES[@]}" ; do > > + run_case $i $CASE > > + ((i++)) > > +done > > + > > +exit $exit_status > > + > > diff -Nurp ltp-full-20080531.orig/testcases/kernel/Makefile ltp-full-20080531/testcases/kernel/Makefile > > --- ltp-full-20080531.orig/testcases/kernel/Makefile 2008-02-28 22:06:16.000000000 +0800 > > +++ ltp-full-20080531/testcases/kernel/Makefile 2008-06-19 11:46:50.000000000 +0800 > > @@ -1,4 +1,4 @@ > > -SUBDIRS = numa containers controllers include fs io ipc mem pty sched security syscalls timers > > +SUBDIRS = connectors numa containers controllers include fs io ipc mem pty sched security syscalls timers > > UCLINUX_SUBDIRS = syscalls > > > > all: > > > > > ------------------------------------------------------------------------- > 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 > Ltp...@li... > https://lists.sourceforge.net/lists/listinfo/ltp-list |
From: Li Z. <li...@cn...> - 2008-06-26 01:04:43
|
Subrata Modak 写道: > Li, > > Will you be resending me a renewed patch that fixes those issues, so > that i can merge for the June 2008 LTP release ? > Will it be better to hold this until David Miller accepts my patch or Evgeniy Polyakov extends the connector core to allow querying of connector users ? > Regards-- > Subrata > > On Sun, 2008-06-22 at 02:38 +0530, Subrata Modak wrote: >> On Thu, 2008-06-19 at 15:35 +0800, Li Zefan wrote: >>> Hi, >>> >>> I've revised the patch according to your comments: >>> - get it integrated with LTP-build >>> - check if the user is root or not >>> - prevent building if kernel version is below 2.6.15 >>> >>> And also fixed issues which Matt pointed out. >>> >>> But still not run by default, as I explained in a previous mail. >>> >>> Signed-off-by: Li Zefan <li...@cn...> >> Thanks again for resending a revised patch. I had the opportunity to >> test it on various architectures and kernels. Following are my >> observations after testing this patch: >> >> 1) It is still not integrated inside default run. You should have an >> entry inside ltp/runltp script, so that it runs by default, instead of >> users needing to execute "./runltp -f connectors". A patch of the >> following kind is needed: >> >> --- ltp-full-20080531/runltp.orig 2008-06-22 02:10:39.000000000 +0530 >> +++ ltp-full-20080531/runltp 2008-06-22 02:11:18.000000000 +0530 >> @@ -510,7 +510,8 @@ main() >> ${LTPROOT}/runtest/fs_bind \ >> ${LTPROOT}/runtest/controllers \ >> ${LTPROOT}/runtest/filecaps \ >> - ${LTPROOT}/runtest/fcntl-locktests >> + ${LTPROOT}/runtest/fcntl-locktests \ >> + ${LTPROOT}/runtest/connectors >> do >> [ -e "$SCENFILES" ] || \ >> { >> >> 2) Checking kernel version to prevent building below was not correct, so >> it was giving build failures for kernels below 2.6.15. However i >> rectified that with the following patch: >> >> --- testcases/kernel/connectors/Makefile.orig 2008-06-21 >> 12:24:15.000000000 -0700 >> +++ testcases/kernel/connectors/Makefile 2008-06-21 12:24:45.000000000 >> -0700 >> @@ -2,7 +2,7 @@ SUBDIRS = pec >> >> all: >> @set -e; \ >> - if tst_kvercmp 2 6 15; then \ >> + if ../../bin/tst_kvercmp 2 6 15; then \ >> echo "system does not support process event connector"; \ >> else $(MAKE) -C pec; true; fi >> >> >> Although it prevented building for kernels below 2.6.15, it gave install >> error post patch. >> >> 3) It gave build error (and hence install error) for even kernels above >> 2.6.15. Please see the results attached below for full details. >> >> 4) When it gets into default run through ltp/runltp, we will face a >> situation when the build and install has been avoided, but calling the >> binary through ltp/runltp will exist. In that case, the user will >> receive the following error: >> >> initiation_status="pan(): execvp of 'run_pec_test' (tag Connectors) >> failed. errno:2 No such file or directory" >> >> I would like to have a proper error shown to the user like: >> >> Connectors 0 CONF : System doesn't support execution of the test >> >> For this, the code inside runtest/connectors can be of: >> >> Connectors if [ -f run_pec_test ]; then run_pec_test; else echo >> "Connectors 0 CONF : System doesn't support execution of the test"; >> exit 0; fi >> >> 5) It built and installed successfully on some architectures. But run >> gave some error messages. Please see the detailed output below for more >> information. >> >> Following are results as obtained on various machines/architectures: >> ===================================================================== >> ===================================================================== >> 1) Linux 2.6.23.13 #1 SMP Wed Jan 9 18:14:28 PST 2008 ia64 GNU/Linux >> [Process_Event_Connectors: No Build Failure, Installed Properly, But Run >> failed, >> <<<test_output>>> >> incrementing stop >> pec01 1 FAIL : failed to listen process events >> pec01 2 FAIL : failed to listen process events >> pec01 3 FAIL : failed to listen process events >> pec01 4 FAIL : failed to listen process events >> pec01 5 FAIL : failed to listen process events >> <<<execution_status>>> >> ] >> ===================================================================== >> 2) Linux 2.6.16.21-0.8-default #1 SMP Mon Jul 3 18:25:39 UTC 2006 ia64 >> ia64 ia64 GNU/Linux >> [Process_Event_Connectors: Build Failure, >> cc -Wall -I../../../../include -Wall event_generator.c >> -L../../../../lib -lltp -o event_generator >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> In file included from /usr/include/linux/cn_proc.h:29, >> from pec_listener.c:34: >> /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ >> /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ >> make[4]: *** [pec_listener] Error 1 >> >> Post Patch: Build Failure: >> >> make[4]: Entering directory >> `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> In file included from /usr/include/linux/cn_proc.h:29, >> from pec_listener.c:34: >> /usr/include/linux/time.h:12: error: redefinition of ‘struct timespec’ >> /usr/include/linux/time.h:18: error: redefinition of ‘struct timeval’ >> make[4]: *** [pec_listener] Error 1 >> ===================================================================== >> 3) Linux 2.6.9-70.EL #1 Fri May 2 13:00:36 EDT 2008 x86_64 x86_64 x86_64 >> GNU/Linux >> [Process_Event_Connectors: Build Failure, >> cc -Wall -I../../../../include -Wall event_generator.c >> -L../../../../lib -lltp -o event_generator >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> In file included from pec_listener.c:32: >> /usr/include/linux/netlink.h:22: error: syntax error before "__u32" >> /usr/include/linux/netlink.h:28: error: syntax error before "__u32" >> /usr/include/linux/netlink.h:30: error: syntax error before >> "nlmsg_flags" >> /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" >> /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" >> /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type >> pec_listener.c:33:29: linux/connector.h: No such file or directory >> pec_listener.c:34:27: linux/cn_proc.h: No such file or directory >> pec_listener.c:41: error: syntax error before "seq" >> pec_listener.c:41: warning: type defaults to `int' in declaration of >> `seq' >> pec_listener.c:41: warning: data definition has no type or storage class >> pec_listener.c:63: warning: "struct cn_msg" declared inside parameter >> list >> pec_listener.c:63: warning: its scope is only this definition or >> declaration, which is probably not what you want >> pec_listener.c: In function `netlink_send': >> pec_listener.c:75: error: dereferencing pointer to incomplete type >> pec_listener.c:76: error: dereferencing pointer to incomplete type >> pec_listener.c:77: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:79: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:84: error: dereferencing pointer to incomplete type >> pec_listener.c:88: error: dereferencing pointer to incomplete type >> pec_listener.c: In function `netlink_recv': >> pec_listener.c:111: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:116: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:119: error: dereferencing pointer to incomplete type >> pec_listener.c: At top level: >> pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside >> parameter list >> pec_listener.c:136: error: parameter `op' has incomplete type >> pec_listener.c: In function `control_pec': >> pec_listener.c:138: error: invalid application of `sizeof' to incomplete >> type `cn_msg' >> pec_listener.c:138: error: invalid application of `sizeof' to incomplete >> type `proc_cn_mcast_op' >> pec_listener.c:145: error: dereferencing pointer to incomplete type >> pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:145: error: (Each undeclared identifier is reported only >> once >> pec_listener.c:145: error: for each function it appears in.) >> pec_listener.c:146: error: dereferencing pointer to incomplete type >> pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this >> function) >> pec_listener.c:147: error: dereferencing pointer to incomplete type >> pec_listener.c:148: error: dereferencing pointer to incomplete type >> pec_listener.c:149: error: dereferencing pointer to incomplete type >> pec_listener.c:151: error: dereferencing pointer to incomplete type >> pec_listener.c:152: error: dereferencing pointer to incomplete type >> pec_listener.c:154: warning: passing arg 3 of `netlink_send' from >> incompatible pointer type >> pec_listener.c: In function `process_event': >> pec_listener.c:169: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:171: error: dereferencing pointer to incomplete type >> pec_listener.c:173: error: dereferencing pointer to incomplete type >> pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in >> this function) >> pec_listener.c:175: error: dereferencing pointer to incomplete type >> pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in >> this function) >> pec_listener.c:179: error: dereferencing pointer to incomplete type >> pec_listener.c:180: error: dereferencing pointer to incomplete type >> pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in >> this function) >> pec_listener.c:184: error: dereferencing pointer to incomplete type >> pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in >> this function) >> pec_listener.c:188: error: dereferencing pointer to incomplete type >> pec_listener.c:189: error: dereferencing pointer to incomplete type >> pec_listener.c:190: error: dereferencing pointer to incomplete type >> pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in >> this function) >> pec_listener.c:194: error: dereferencing pointer to incomplete type >> pec_listener.c:195: error: dereferencing pointer to incomplete type >> pec_listener.c:196: error: dereferencing pointer to incomplete type >> pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in >> this function) >> pec_listener.c:200: error: dereferencing pointer to incomplete type >> pec_listener.c:201: error: dereferencing pointer to incomplete type >> pec_listener.c:202: error: dereferencing pointer to incomplete type >> pec_listener.c: In function `main': >> pec_listener.c:214: error: storage size of 'l_local' isn't known >> pec_listener.c:215: error: storage size of 'src_addr' isn't known >> pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in >> this function) >> pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:241: error: invalid application of `sizeof' to incomplete >> type `sockaddr_nl' >> pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use >> in this function) >> pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use >> in this function) >> pec_listener.c:282: error: dereferencing pointer to incomplete type >> pec_listener.c:289: error: dereferencing pointer to incomplete type >> pec_listener.c:214: warning: unused variable `l_local' >> pec_listener.c:215: warning: unused variable `src_addr' >> make[4]: *** [pec_listener] Error 1 >> >> Post Patching: Install Error: >> >> make[4]: Entering directory >> `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' >> ln: accessing `pec_listener': No such file or directory >> make[4]: *** [install] Error 1 >> ] >> ===================================================================== >> 4) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:16:15 EDT 2008 x86_64 x86_64 >> x86_64 GNU/Linux >> [Process_Event_Connector: Build Successfull, Install Successfull, Run >> Successfull, >> <<<test_output>>> >> incrementing stop >> pec01 1 PASS : get event - fork parent: 6259, child: 6260 >> pec01 2 PASS : get event - exec pid: 6271 >> pec01 3 PASS : get event - exit pid: 6281 exit_code: 0 >> pec01 4 PASS : get event - uid pid: 6290 euid: 99 >> pec01 5 PASS : get event - gid pid: 6299 egid: 99 >> <<<execution_status>>> >> ] >> ===================================================================== >> 5) Linux 2.6.15-23-server #1 SMP Tue May 23 15:10:35 UTC 2006 i686 >> GNU/Linux >> [Process_Event_Connector: Build Failure, >> cc -Wall -I../../../../include -Wall event_generator.c >> -L../../../../lib -lltp -o event_generator >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> pec_listener.c:33:29: error: linux/connector.h: No such file or >> directory >> pec_listener.c:34:27: error: linux/cn_proc.h: No such file or directory >> pec_listener.c:63: warning: 'struct cn_msg' declared inside parameter >> list >> pec_listener.c:63: warning: its scope is only this definition or >> declaration, which is probably not what you want >> pec_listener.c: In function 'netlink_send': >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c: At top level: >> pec_listener.c:135: warning: 'enum proc_cn_mcast_op' declared inside >> parameter list >> pec_listener.c:135: error: parameter 3 ('op') has incomplete type >> pec_listener.c: In function 'control_pec': >> pec_listener.c:138: error: invalid application of 'sizeof' to incomplete >> type 'struct cn_msg' >> pec_listener.c:138: error: invalid application of 'sizeof' to incomplete >> type 'enum proc_cn_mcast_op' >> pec_listener.c:145: error: dereferencing pointer to incomplete type >> pec_listener.c:145: error: 'CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:145: error: (Each undeclared identifier is reported only >> once >> pec_listener.c:145: error: for each function it appears in.) >> pec_listener.c:146: error: dereferencing pointer to incomplete type >> pec_listener.c:146: error: 'CN_VAL_PROC' undeclared (first use in this >> function) >> pec_listener.c:147: error: dereferencing pointer to incomplete type >> pec_listener.c:148: error: dereferencing pointer to incomplete type >> pec_listener.c:149: error: dereferencing pointer to incomplete type >> pec_listener.c:151: error: dereferencing pointer to incomplete type >> pec_listener.c:152: error: dereferencing pointer to incomplete type >> pec_listener.c:154: warning: passing argument 3 of 'netlink_send' from >> incompatible pointer type >> pec_listener.c: In function 'process_event': >> pec_listener.c:171: error: dereferencing pointer to incomplete type >> pec_listener.c:173: error: dereferencing pointer to incomplete type >> pec_listener.c:174: error: 'PROC_EVENT_NONE' undeclared (first use in >> this function) >> pec_listener.c:175: error: dereferencing pointer to incomplete type >> pec_listener.c:177: error: 'PROC_EVENT_FORK' undeclared (first use in >> this function) >> pec_listener.c:179: error: dereferencing pointer to incomplete type >> pec_listener.c:180: error: dereferencing pointer to incomplete type >> pec_listener.c:182: error: 'PROC_EVENT_EXEC' undeclared (first use in >> this function) >> pec_listener.c:184: error: dereferencing pointer to incomplete type >> pec_listener.c:186: error: 'PROC_EVENT_UID' undeclared (first use in >> this function) >> pec_listener.c:188: error: dereferencing pointer to incomplete type >> pec_listener.c:189: error: dereferencing pointer to incomplete type >> pec_listener.c:190: error: dereferencing pointer to incomplete type >> pec_listener.c:192: error: 'PROC_EVENT_GID' undeclared (first use in >> this function) >> pec_listener.c:194: error: dereferencing pointer to incomplete type >> pec_listener.c:195: error: dereferencing pointer to incomplete type >> pec_listener.c:196: error: dereferencing pointer to incomplete type >> pec_listener.c:198: error: 'PROC_EVENT_EXIT' undeclared (first use in >> this function) >> pec_listener.c:200: error: dereferencing pointer to incomplete type >> pec_listener.c:201: error: dereferencing pointer to incomplete type >> pec_listener.c:202: error: dereferencing pointer to incomplete type >> pec_listener.c: In function 'main': >> pec_listener.c:224: error: 'NETLINK_CONNECTOR' undeclared (first use in >> this function) >> pec_listener.c:238: error: 'CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:248: error: 'PROC_CN_MCAST_LISTEN' undeclared (first use >> in this function) >> pec_listener.c:248: error: type of formal parameter 3 is incomplete >> pec_listener.c:263: error: 'PROC_CN_MCAST_IGNORE' undeclared (first use >> in this function) >> pec_listener.c:263: error: type of formal parameter 3 is incomplete >> pec_listener.c:276: error: type of formal parameter 3 is incomplete >> pec_listener.c:299: error: type of formal parameter 3 is incomplete >> make[4]: *** [pec_listener] Error 1 >> >> Post Patch: Build Failure as above >> ] >> ===================================================================== >> 6) Linux 2.6.7 #1 SMP Tue Aug 10 15:35:24 PDT 2004 i686 GNU/Linux >> [Process_Event_Connector: Build Failure, >> cc -Wall -I../../../../include -Wall event_generator.c >> -L../../../../lib -lltp -o event_generator >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> pec_listener.c:33:29: linux/connector.h: No such file or directory >> pec_listener.c:34:27: linux/cn_proc.h: No such file or directory >> pec_listener.c:63: warning: `struct cn_msg' declared inside parameter >> list >> pec_listener.c:63: warning: its scope is only this definition or >> declaration, which is probably not what you want >> pec_listener.c: In function `netlink_send': >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c: At top level: >> pec_listener.c:135: warning: `enum proc_cn_mcast_op' declared inside >> parameter list >> pec_listener.c:136: error: parameter `op' has incomplete type >> pec_listener.c: In function `control_pec': >> pec_listener.c:138: error: invalid application of `sizeof' to an >> incomplete type >> pec_listener.c:138: error: invalid application of `sizeof' to an >> incomplete type >> pec_listener.c:145: error: dereferencing pointer to incomplete type >> pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:145: error: (Each undeclared identifier is reported only >> once >> pec_listener.c:145: error: for each function it appears in.) >> pec_listener.c:146: error: dereferencing pointer to incomplete type >> pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this >> function) >> pec_listener.c:147: error: dereferencing pointer to incomplete type >> pec_listener.c:148: error: dereferencing pointer to incomplete type >> pec_listener.c:149: error: dereferencing pointer to incomplete type >> pec_listener.c:151: error: dereferencing pointer to incomplete type >> pec_listener.c:152: error: dereferencing pointer to incomplete type >> pec_listener.c:154: warning: passing arg 3 of `netlink_send' from >> incompatible pointer type >> pec_listener.c: In function `process_event': >> pec_listener.c:171: error: dereferencing pointer to incomplete type >> pec_listener.c:173: error: dereferencing pointer to incomplete type >> pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in >> this function) >> pec_listener.c:175: error: dereferencing pointer to incomplete type >> pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in >> this function) >> pec_listener.c:179: error: dereferencing pointer to incomplete type >> pec_listener.c:180: error: dereferencing pointer to incomplete type >> pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in >> this function) >> pec_listener.c:184: error: dereferencing pointer to incomplete type >> pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in >> this function) >> pec_listener.c:188: error: dereferencing pointer to incomplete type >> pec_listener.c:189: error: dereferencing pointer to incomplete type >> pec_listener.c:190: error: dereferencing pointer to incomplete type >> pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in >> this function) >> pec_listener.c:194: error: dereferencing pointer to incomplete type >> pec_listener.c:195: error: dereferencing pointer to incomplete type >> pec_listener.c:196: error: dereferencing pointer to incomplete type >> pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in >> this function) >> pec_listener.c:200: error: dereferencing pointer to incomplete type >> pec_listener.c:201: error: dereferencing pointer to incomplete type >> pec_listener.c:202: error: dereferencing pointer to incomplete type >> pec_listener.c: In function `main': >> pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in >> this function) >> pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use >> in this function) >> pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use >> in this function) >> make[4]: *** [pec_listener] Error 1 >> >> Post Patch: Install error: >> >> make[4]: Entering directory >> `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' >> ln: accessing `pec_listener': No such file or directory >> make[4]: *** [install] Error 1 >> ] >> ===================================================================== >> 7) Linux 2.6.9-42.EL #1 SMP Wed Jul 12 23:22:51 EDT 2006 ppc64 ppc64 >> ppc64 GNU/Linux >> [Process_Event_Connector: Build Failure, >> cc -Wall -I../../../../include -Wall pec_listener.c >> -L../../../../lib -lltp -o pec_listener >> In file included from pec_listener.c:32: >> /usr/include/linux/netlink.h:22: error: syntax error before "__u32" >> /usr/include/linux/netlink.h:28: error: syntax error before "__u32" >> /usr/include/linux/netlink.h:30: error: syntax error before >> "nlmsg_flags" >> /usr/include/linux/netlink.h:31: error: syntax error before "nlmsg_seq" >> /usr/include/linux/netlink.h:32: error: syntax error before "nlmsg_pid" >> /usr/include/linux/netlink.h:82: error: field `msg' has incomplete type >> pec_listener.c:33:29: linux/connector.h: No such file or directory >> pec_listener.c:34:27: linux/cn_proc.h: No such file or directory >> pec_listener.c:41: error: syntax error before "seq" >> pec_listener.c:41: warning: type defaults to `int' in declaration of >> `seq' >> pec_listener.c:41: warning: data definition has no type or storage class >> pec_listener.c:63: warning: "struct cn_msg" declared inside parameter >> list >> pec_listener.c:63: warning: its scope is only this definition or >> declaration, which is probably not what you want >> pec_listener.c: In function `netlink_send': >> pec_listener.c:75: error: dereferencing pointer to incomplete type >> pec_listener.c:76: error: dereferencing pointer to incomplete type >> pec_listener.c:77: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: dereferencing pointer to incomplete type >> pec_listener.c:78: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:79: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:80: error: dereferencing pointer to incomplete type >> pec_listener.c:84: error: dereferencing pointer to incomplete type >> pec_listener.c:88: error: dereferencing pointer to incomplete type >> pec_listener.c: In function `netlink_recv': >> pec_listener.c:111: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:116: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:119: error: dereferencing pointer to incomplete type >> pec_listener.c: At top level: >> pec_listener.c:135: warning: "enum proc_cn_mcast_op" declared inside >> parameter list >> pec_listener.c:136: error: parameter `op' has incomplete type >> pec_listener.c: In function `control_pec': >> pec_listener.c:138: error: invalid application of `sizeof' to incomplete >> type `cn_msg' >> pec_listener.c:138: error: invalid application of `sizeof' to incomplete >> type `proc_cn_mcast_op' >> pec_listener.c:145: error: dereferencing pointer to incomplete type >> pec_listener.c:145: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:145: error: (Each undeclared identifier is reported only >> once >> pec_listener.c:145: error: for each function it appears in.) >> pec_listener.c:146: error: dereferencing pointer to incomplete type >> pec_listener.c:146: error: `CN_VAL_PROC' undeclared (first use in this >> function) >> pec_listener.c:147: error: dereferencing pointer to incomplete type >> pec_listener.c:148: error: dereferencing pointer to incomplete type >> pec_listener.c:149: error: dereferencing pointer to incomplete type >> pec_listener.c:151: error: dereferencing pointer to incomplete type >> pec_listener.c:152: error: dereferencing pointer to incomplete type >> pec_listener.c:154: warning: passing arg 3 of `netlink_send' from >> incompatible pointer type >> pec_listener.c: In function `process_event': >> pec_listener.c:169: error: invalid application of `sizeof' to incomplete >> type `nlmsghdr' >> pec_listener.c:171: error: dereferencing pointer to incomplete type >> pec_listener.c:173: error: dereferencing pointer to incomplete type >> pec_listener.c:174: error: `PROC_EVENT_NONE' undeclared (first use in >> this function) >> pec_listener.c:175: error: dereferencing pointer to incomplete type >> pec_listener.c:177: error: `PROC_EVENT_FORK' undeclared (first use in >> this function) >> pec_listener.c:179: error: dereferencing pointer to incomplete type >> pec_listener.c:180: error: dereferencing pointer to incomplete type >> pec_listener.c:182: error: `PROC_EVENT_EXEC' undeclared (first use in >> this function) >> pec_listener.c:184: error: dereferencing pointer to incomplete type >> pec_listener.c:186: error: `PROC_EVENT_UID' undeclared (first use in >> this function) >> pec_listener.c:188: error: dereferencing pointer to incomplete type >> pec_listener.c:189: error: dereferencing pointer to incomplete type >> pec_listener.c:190: error: dereferencing pointer to incomplete type >> pec_listener.c:192: error: `PROC_EVENT_GID' undeclared (first use in >> this function) >> pec_listener.c:194: error: dereferencing pointer to incomplete type >> pec_listener.c:195: error: dereferencing pointer to incomplete type >> pec_listener.c:196: error: dereferencing pointer to incomplete type >> pec_listener.c:198: error: `PROC_EVENT_EXIT' undeclared (first use in >> this function) >> pec_listener.c:200: error: dereferencing pointer to incomplete type >> pec_listener.c:201: error: dereferencing pointer to incomplete type >> pec_listener.c:202: error: dereferencing pointer to incomplete type >> pec_listener.c: In function `main': >> pec_listener.c:214: error: storage size of 'l_local' isn't known >> pec_listener.c:215: error: storage size of 'src_addr' isn't known >> pec_listener.c:224: error: `NETLINK_CONNECTOR' undeclared (first use in >> this function) >> pec_listener.c:238: error: `CN_IDX_PROC' undeclared (first use in this >> function) >> pec_listener.c:241: error: invalid application of `sizeof' to incomplete >> type `sockaddr_nl' >> pec_listener.c:248: error: `PROC_CN_MCAST_LISTEN' undeclared (first use >> in this function) >> pec_listener.c:263: error: `PROC_CN_MCAST_IGNORE' undeclared (first use >> in this function) >> pec_listener.c:282: error: dereferencing pointer to incomplete type >> pec_listener.c:289: error: dereferencing pointer to incomplete type >> pec_listener.c:214: warning: unused variable `l_local' >> pec_listener.c:215: warning: unused variable `src_addr' >> make[4]: *** [pec_listener] Error 1 >> >> Post Patch: Install Error: >> >> make[4]: Entering directory >> `/root/subrata/ltp/ltp/testcases/kernel/connectors/pec' >> ln: accessing `pec_listener': No such file or directory >> make[4]: *** [install] Error 1 >> ] >> ===================================================================== >> 8) Linux 2.6.18-92.el5 #1 SMP Tue Apr 29 13:21:29 EDT 2008 ppc64 ppc64 >> ppc64 GNU/Linux >> [Process_Event_Connector: Build Successful, Install Successful, Run >> Failed with weired results, >> <<<test_output>>> >> incrementing stop >> unknown option! >> Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] >> pec01 1 FAIL : failed to generate process events >> unknown option! >> Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] >> pec01 2 FAIL : failed to generate process events >> unknown option! >> Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] >> pec01 3 FAIL : failed to generate process events >> unknown option! >> Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] >> pec01 4 FAIL : failed to generate process events >> unknown option! >> Usage: event_generator -e fork|exit|exec|uid|gid [-n nr_event] >> pec01 5 FAIL : failed to generate process events >> <<<execution_status>>> >> ] >> ===================================================================== >> ===================================================================== >> >> Regards-- >> Subrata >> >> >>> --- >>> runtest/connectors | 2 >>> testcases/kernel/Makefile | 2 >>> testcases/kernel/connectors/Makefile | 13 >>> testcases/kernel/connectors/pec/Makefile | 13 >>> testcases/kernel/connectors/pec/README | 48 +++ >>> testcases/kernel/connectors/pec/event_generator.c | 229 +++++++++++++++ >>> testcases/kernel/connectors/pec/pec_listener.c | 316 ++++++++++++++++++++++ >>> testcases/kernel/connectors/pec/run_pec_test | 103 +++++++ >>> 8 files changed, 725 insertions(+), 1 deletion(-) >>> >>> 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-06-19 14:54:45.000000000 +0800 >>> @@ -0,0 +1,13 @@ >>> +SUBDIRS = pec >>> + >>> +all: >>> + @set -e; \ >>> + if tst_kvercmp 2 6 15; then \ >>> + echo "system does not support process event connector"; \ >>> + else $(MAKE) -C pec; true; fi >>> + >>> +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-06-17 15:49:55.000000000 +0800 >>> @@ -0,0 +1,229 @@ >>> +/******************************************************************************/ >>> +/* */ >>> +/* 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 <li...@cn...> */ >>> +/* */ >>> +/******************************************************************************/ >>> + >>> +#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; >>> + >>> + signal(SIGCHLD, SIG_IGN); >>> + >>> + /* 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-06-19 13:41:44.000000000 +0800 >>> @@ -0,0 +1,13 @@ >>> +CFLAGS += -I../../../../include -Wall >>> +LDLIBS += -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-06-17 15:59:41.000000000 +0800 >>> @@ -0,0 +1,316 @@ >>> +/******************************************************************************/ >>> +/* */ >>> +/* 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 <li...@cn...> */ >>> +/* */ >>> +/******************************************************************************/ >>> + >>> +#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); >>> + >>> + while (fsync(STDOUT_FILENO) == -1) { >>> + if (errno != EIO) >>> + break; >>> + /* retry once every 10 secodns */ >>> + sleep(10); >>> + } >>> + >>> + 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-06-19 13:54:06.000000000 +0800 >>> @@ -0,0 +1,48 @@ >>> + >>> +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. >>> + >>> +Note: the test can be run by root only. >>> + >>> +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-19 13:01:33.000000000 +0800 >>> @@ -0,0 +1,103 @@ >>> +#! /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 <li...@cn...> ## >>> +## ## >>> +################################################################################ >>> + >>> +NUM_EVENTS=1 >>> +EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) >>> +TST_TOTAL=${#EVENT_TEST_CASES[@]} >>> + >>> +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 >>> +export TST_COUNT=1 >>> + >>> +exit_status=0 >>> + >>> +if [ "$USER" != root ]; then >>> + tst_brkm TBROK ignored "Test must be run as root" >>> + exit 0; >>> +fi >>> + >>> +# 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=$! >>> + # Wait for pec_listener to start listening >>> + sleep $((1*NUM_EVENTS)) >>> + >>> + ./event_generator -e $2 > "$log/generator_$1.log" >>> + ret1=$? >>> + >>> + # Sleep until pec_listener has seen and handled all of >>> + # the generated events >>> + sleep $((1*NUM_EVENTS)) >>> + 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 >>> +} >>> + >>> +i=1; >>> +for CASE in "${EVENT_TEST_CASES[@]}" ; do >>> + run_case $i $CASE >>> + ((i++)) >>> +done >>> + >>> +exit $exit_status >>> + >>> diff -Nurp ltp-full-20080531.orig/testcases/kernel/Makefile ltp-full-20080531/testcases/kernel/Makefile >>> --- ltp-full-20080531.orig/testcases/kernel/Makefile 2008-02-28 22:06:16.000000000 +0800 >>> +++ ltp-full-20080531/testcases/kernel/Makefile 2008-06-19 11:46:50.000000000 +0800 >>> @@ -1,4 +1,4 @@ >>> -SUBDIRS = numa containers controllers include fs io ipc mem pty sched security syscalls timers >>> +SUBDIRS = connectors numa containers controllers include fs io ipc mem pty sched security syscalls timers >>> UCLINUX_SUBDIRS = syscalls >>> >>> all: >>> >> |
From: Matt H. <mat...@us...> - 2008-06-26 04:37:11
|
On Thu, 2008-06-19 at 15:35 +0800, Li Zefan wrote: > Hi, > > I've revised the patch according to your comments: > - get it integrated with LTP-build > - check if the user is root or not > - prevent building if kernel version is below 2.6.15 > > And also fixed issues which Matt pointed out. > > But still not run by default, as I explained in a previous mail. > > Signed-off-by: Li Zefan <li...@cn...> > --- > runtestconnectors | 2 > testcaseskernelMakefile | 2 > testcaseskernelconnectorsMakefile | 13 > testcaseskernelconnectorspecMakefile | 13 > testcaseskernelconnectorspecREADME | 48 +++ > testcaseskernelconnectorspecevent_generator.c | 229 +++++++++++++++ > testcaseskernelconnectorspecpec_listener.c | 316 ++++++++++++++++++++++ > testcaseskernelconnectorspecrun_pec_test | 103 +++++++ > 8 files changed, 725 insertions(+), 1 deletion(-) > <snip> (I cut out parts of the patch irrelevant to my commentquestion below) > diff -Nurp ltp-full-20080531.origtestcaseskernelconnectorspecpec_listener.c ltp-full-20080531testcaseskernelconnectorspecpec_listener.c > --- ltp-full-20080531.origtestcaseskernelconnectorspecpec_listener.c 1970-01-01 08:00:00.000000000 +0800 > +++ ltp-full-20080531testcaseskernelconnectorspecpec_listener.c 2008-06-17 15:59:41.000000000 +0800 > @@ -0,0 +1,316 @@ > +****************************************************************************** > +* * > +* Copyright (c) 2008 FUJITSU LIMITED * > +* * > +* This program is free software; you can redistribute it andor 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 <li...@cn...> * > +* * > +****************************************************************************** > + > +#include <unistd.h> > +#include <stdio.h> > +#include <stdlib.h> > +#include <string.h> > +#include <errno.h> > +#include <signal.h> > +#include <syssocket.h> > +#include <syspoll.h> > + > +#include <linuxnetlink.h> > +#include <linuxconnector.h> > +#include <linuxcn_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); > + } In subsequent email echanges Li and Subrata wrote: > Subrata Modak 写道: > > Li, > > > > Will you be resending me a renewed patch that fixes those issues, so > > that i can merge for the June 2008 LTP release ? > > > > Will it be better to hold this until David Miller accepts my patch or > Evgeniy Polyakov extends the connector core to allow querying of > connector > users ? I'm not sure exactly what you're referring to. Are you concerned that there's no way to test if the interfaces exist? If so, couldn't you consider using main() of pec_listener.c up to the point above as a test to determine if the kernel feature(s) needed for the LTP tests exist? Then you can determine whether or not to run the tests by default based on the result. You might need to check for specific errno values and you might also need to test to be sure netlink sockets have been configured into the kernel too, but I think that may be do-able. Either way, I think putting the tests in as they are would be nice. You can always update the tests to reflect your patch or extensions by Evgeniy, but in the meantime your useful tests would be available to LTP users (even if not run by default). That's just my 2 cents. Cheers, -Matt Helsley |
From: Li Z. <li...@cn...> - 2008-06-26 05:39:27
|
> In subsequent email echanges Li and Subrata wrote: > >> Subrata Modak wrote: >>> Li, >>> >>> Will you be resending me a renewed patch that fixes those issues, so >>> that i can merge for the June 2008 LTP release ? >>> >> Will it be better to hold this until David Miller accepts my patch or >> Evgeniy Polyakov extends the connector core to allow querying of >> connector >> users ? > > I'm not sure exactly what you're referring to. > Here: http:lkml.orglkml2008623465 I should have CCed you in that mail. > Are you concerned that there's no way to test if the interfaces exist? > If so, couldn't you consider using main() of pec_listener.c up to the > point above as a test to determine if the kernel feature(s) needed for > the LTP tests exist? Then you can determine whether or not to run the > tests by default based on the result. You might need to check for > specific errno values and you might also need to test to be sure netlink > sockets have been configured into the kernel too, but I think that may > be do-able. > The problem is, even if process event connector is not supported, socket() and bind() will return successfully. Just I can recv() nothing, but I can't determine it's not supported by this. I can check the existence of connector by looking into procnetnetlink, but this is not enough, one can set CONFIG_CONNECTOR but unse CONFIG_PROC_EVENTS. > Either way, I think putting the tests in as they are would be nice. You > can always update the tests to reflect your patch or extensions by > Evgeniy, but in the meantime your useful tests would be available to LTP > users (even if not run by default). > So how about put the tests into LTP but not run by default, and when my patch is accepted (but I'm not optimistic) or Evgeniy has done the extension, we can update the tests and make it run by default. > That's just my 2 cents. > Thanks for your comments. :) |
From: Subrata M. <su...@li...> - 2008-06-26 06:43:03
|
On Thu, 2008-06-26 at 13:37 +0800, Li Zefan wrote: > > In subsequent email echanges Li and Subrata wrote: > > > >> Subrata Modak wrote: > >>> Li, > >>> > >>> Will you be resending me a renewed patch that fixes those issues, so > >>> that i can merge for the June 2008 LTP release ? > >>> > >> Will it be better to hold this until David Miller accepts my patch or > >> Evgeniy Polyakov extends the connector core to allow querying of > >> connector > >> users ? > > > > I'm not sure exactly what you're referring to. > > > > Here: > http://lkml.org/lkml/2008/6/23/465 > > I should have CCed you in that mail. > > > Are you concerned that there's no way to test if the interfaces exist? > > If so, couldn't you consider using main() of pec_listener.c up to the > > point above as a test to determine if the kernel feature(s) needed for > > the LTP tests exist? Then you can determine whether or not to run the > > tests by default based on the result. You might need to check for > > specific errno values and you might also need to test to be sure netlink > > sockets have been configured into the kernel too, but I think that may > > be do-able. > > > > The problem is, even if process event connector is not supported, socket() > and bind() will return successfully. Just I can recv() nothing, but I can't > determine it's not supported by this. > > I can check the existence of connector by looking into /proc/net/netlink, > but this is not enough, one can set CONFIG_CONNECTOR but unse > CONFIG_PROC_EVENTS. > > > Either way, I think putting the tests in as they are would be nice. You > > can always update the tests to reflect your patch or extensions by > > Evgeniy, but in the meantime your useful tests would be available to LTP > > users (even if not run by default). > > > > So how about put the tests into LTP but not run by default, and when my patch > is accepted (but I'm not optimistic) or Evgeniy has done the extension, we > can update the tests and make it run by default. That would be really great, rather than holding it off from LTP inclusion. I would merge your last updated patch with little modifications from your side. I will make sure that it does not run by default until your kernel patch is through, and in that case, you can send me an updated patch. Regards-- Subrata > > > That's just my 2 cents. > > > > Thanks for your comments. :) > > |
From: Li Z. <li...@cn...> - 2008-06-26 08:05:06
|
>> So how about put the tests into LTP but not run by default, and when my patch >> is accepted (but I'm not optimistic) or Evgeniy has done the extension, we >> can update the tests and make it run by default. > > That would be really great, rather than holding it off from LTP > inclusion. I would merge your last updated patch with little > modifications from your side. I will make sure that it does not run by > default until your kernel patch is through, and in that case, you can > send me an updated patch. > Here it is. Based on my last patch. - building failure on 2.6.16 should be fixed - fix "make install" if kernel version < 2.6.15 - abort tests if kernel version < 2.6.15 Signed-off-by: Li Zefan <li...@cn...> --- runtest/connectors | 2 +- testcases/kernel/connectors/Makefile | 12 ++++++++---- testcases/kernel/connectors/connector_test.sh | 15 +++++++++++++++ testcases/kernel/connectors/pec/Makefile | 1 + testcases/kernel/connectors/pec/pec_listener.c | 1 + 5 files changed, 26 insertions(+), 5 deletions(-) diff -Nurp ltp-full-20080531.orig/runtest/connectors ltp-full-20080531/runtest/connectors --- ltp-full-20080531.orig/runtest/connectors 2008-06-26 15:03:31.000000000 +0800 +++ ltp-full-20080531/runtest/connectors 2008-06-26 15:15:24.000000000 +0800 @@ -1,2 +1,2 @@ #DESCRIPTION:Netlink Connector tests -Connectors run_pec_test +Connectors connector_test.sh diff -Nurp ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh ltp-full-20080531/testcases/kernel/connectors/connector_test.sh --- ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh 1970-01-01 08:00:00.000000000 +0800 +++ ltp-full-20080531/testcases/kernel/connectors/connector_test.sh 2008-06-26 15:55:42.000000000 +0800 @@ -0,0 +1,15 @@ +#! /bin/sh + +if [ -z $LTPROOT ]; then + export LTPROOT="`cd ../../.. && pwd`" + export PATH="$PATH:$LTPROOT/testcases/bin" +fi + +tst_kvercmp 2 6 15 +if [ $? -eq 0 ]; then + echo "Connectors 0 CONF : system doesn't support execution of the test" + exit 0 +fi + +$LTPROOT/testcases/bin/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 2008-06-26 15:03:31.000000000 +0800 +++ ltp-full-20080531/testcases/kernel/connectors/Makefile 2008-06-26 15:35:32.000000000 +0800 @@ -2,12 +2,16 @@ SUBDIRS = pec all: @set -e; \ - if ./tst_kvercmp 2 6 15; then \ + if ../../bin/tst_kvercmp 2 6 15; then \ echo "system does not support process event connector"; \ - else $(MAKE) -C pec; true; fi + else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done; true; fi install: - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done - + @set -e; \ + ln -f connector_test.sh ../../bin/connector_test.sh; \ + chmod ugo+x connector_test.sh; \ + if ../../bin/tst_kvercmp 2 6 15; then \ + echo "system does not support process event connector"; \ + else for i in $(SUBDIRS); do $(MAKE) -C $$i install; done; true; fi clean: @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done 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 2008-06-26 15:03:31.000000000 +0800 +++ ltp-full-20080531/testcases/kernel/connectors/pec/Makefile 2008-06-26 15:48:44.000000000 +0800 @@ -9,5 +9,6 @@ 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/ + chmod +x run_pec_test 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 2008-06-26 15:03:31.000000000 +0800 +++ ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c 2008-06-26 15:03:50.000000000 +0800 @@ -31,6 +31,7 @@ #include <linux/netlink.h> #include <linux/connector.h> +#define _LINUX_TIME_H #include <linux/cn_proc.h> #define PEC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event)) |
From: Subrata M. <tos...@gm...> - 2008-06-26 09:45:38
|
Thanks Li. But somehow i am not able to apply this Patch cleanly. I have just merged your last updated Patch which adds these tests. But i have removed it´s compilation from testcases/kernel/Makefile. Can you quickly take a diff of the latest(now) LTP CVS and send across this patch once again, which according to you will solve the below problems: - building failure on 2.6.16 should be fixed - fix "make install" if kernel version < 2.6.15 - abort tests if kernel version < 2.6.15 Regards-- Subrata On Thu, Jun 26, 2008 at 1:33 PM, Li Zefan <li...@cn...> wrote: > >> So how about put the tests into LTP but not run by default, and when my > patch > >> is accepted (but I'm not optimistic) or Evgeniy has done the extension, > we > >> can update the tests and make it run by default. > > > > That would be really great, rather than holding it off from LTP > > inclusion. I would merge your last updated patch with little > > modifications from your side. I will make sure that it does not run by > > default until your kernel patch is through, and in that case, you can > > send me an updated patch. > > > > Here it is. Based on my last patch. > > - building failure on 2.6.16 should be fixed > - fix "make install" if kernel version < 2.6.15 > - abort tests if kernel version < 2.6.15 > > Signed-off-by: Li Zefan <li...@cn...> > --- > runtest/connectors | 2 +- > testcases/kernel/connectors/Makefile | 12 ++++++++---- > testcases/kernel/connectors/connector_test.sh | 15 +++++++++++++++ > testcases/kernel/connectors/pec/Makefile | 1 + > testcases/kernel/connectors/pec/pec_listener.c | 1 + > 5 files changed, 26 insertions(+), 5 deletions(-) > > diff -Nurp ltp-full-20080531.orig/runtest/connectors > ltp-full-20080531/runtest/connectors > --- ltp-full-20080531.orig/runtest/connectors 2008-06-26 > 15:03:31.000000000 +0800 > +++ ltp-full-20080531/runtest/connectors 2008-06-26 > 15:15:24.000000000 +0800 > @@ -1,2 +1,2 @@ > #DESCRIPTION:Netlink Connector tests > -Connectors run_pec_test > +Connectors connector_test.sh > diff -Nurp > ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > --- ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > 1970-01-01 08:00:00.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > 2008-06-26 15:55:42.000000000 +0800 > @@ -0,0 +1,15 @@ > +#! /bin/sh > + > +if [ -z $LTPROOT ]; then > + export LTPROOT="`cd ../../.. && pwd`" > + export PATH="$PATH:$LTPROOT/testcases/bin" > +fi > + > +tst_kvercmp 2 6 15 > +if [ $? -eq 0 ]; then > + echo "Connectors 0 CONF : system doesn't support execution of the > test" > + exit 0 > +fi > + > +$LTPROOT/testcases/bin/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 2008-06-26 > 15:03:31.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/connectors/Makefile 2008-06-26 > 15:35:32.000000000 +0800 > @@ -2,12 +2,16 @@ SUBDIRS = pec > > all: > @set -e; \ > - if ./tst_kvercmp 2 6 15; then \ > + if ../../bin/tst_kvercmp 2 6 15; then \ > echo "system does not support process event connector"; \ > - else $(MAKE) -C pec; true; fi > + else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done; true; fi > > install: > - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done > - > + @set -e; \ > + ln -f connector_test.sh ../../bin/connector_test.sh; \ > + chmod ugo+x connector_test.sh; \ > + if ../../bin/tst_kvercmp 2 6 15; then \ > + echo "system does not support process event connector"; \ > + else for i in $(SUBDIRS); do $(MAKE) -C $$i install; done; true; fi > clean: > @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done > 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 > 2008-06-26 15:03:31.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/connectors/pec/Makefile 2008-06-26 > 15:48:44.000000000 +0800 > @@ -9,5 +9,6 @@ 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/ > + chmod +x run_pec_test > 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 > 2008-06-26 15:03:31.000000000 +0800 > +++ ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c > 2008-06-26 15:03:50.000000000 +0800 > @@ -31,6 +31,7 @@ > > #include <linux/netlink.h> > #include <linux/connector.h> > +#define _LINUX_TIME_H > #include <linux/cn_proc.h> > > #define PEC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event)) > > > > ------------------------------------------------------------------------- > 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 > Ltp...@li... > https://lists.sourceforge.net/lists/listinfo/ltp-list > > -- Regards & Thanks-- Subrata |
From: Li Z. <li...@cn...> - 2008-06-26 09:52:00
|
Subrata Modak wrote: > Thanks Li. > > But somehow i am not able to apply this Patch cleanly. I have just merged > your last updated Patch which adds these tests. But i have removed it´s > compilation from testcases/kernel/Makefile. Can you quickly take a diff of > the latest(now) LTP CVS and send across this patch once again, which > according to you will solve the below problems: > Sorry, but I can't check out LTP CVS in my company. :( And note that this patch doesn't touch testcases/kernel/Makefile at all. > - building failure on 2.6.16 should be fixed > - fix "make install" if kernel version < 2.6.15 > - abort tests if kernel version < 2.6.15 > > Regards-- > Subrata > > > > On Thu, Jun 26, 2008 at 1:33 PM, Li Zefan <li...@cn...> wrote: > >>>> So how about put the tests into LTP but not run by default, and when my >> patch >>>> is accepted (but I'm not optimistic) or Evgeniy has done the extension, >> we >>>> can update the tests and make it run by default. >>> That would be really great, rather than holding it off from LTP >>> inclusion. I would merge your last updated patch with little >>> modifications from your side. I will make sure that it does not run by >>> default until your kernel patch is through, and in that case, you can >>> send me an updated patch. >>> >> Here it is. Based on my last patch. >> >> - building failure on 2.6.16 should be fixed >> - fix "make install" if kernel version < 2.6.15 >> - abort tests if kernel version < 2.6.15 >> >> Signed-off-by: Li Zefan <li...@cn...> >> --- >> runtest/connectors | 2 +- >> testcases/kernel/connectors/Makefile | 12 ++++++++---- >> testcases/kernel/connectors/connector_test.sh | 15 +++++++++++++++ >> testcases/kernel/connectors/pec/Makefile | 1 + >> testcases/kernel/connectors/pec/pec_listener.c | 1 + >> 5 files changed, 26 insertions(+), 5 deletions(-) >> >> diff -Nurp ltp-full-20080531.orig/runtest/connectors >> ltp-full-20080531/runtest/connectors >> --- ltp-full-20080531.orig/runtest/connectors 2008-06-26 >> 15:03:31.000000000 +0800 >> +++ ltp-full-20080531/runtest/connectors 2008-06-26 >> 15:15:24.000000000 +0800 >> @@ -1,2 +1,2 @@ >> #DESCRIPTION:Netlink Connector tests >> -Connectors run_pec_test >> +Connectors connector_test.sh >> diff -Nurp >> ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh >> ltp-full-20080531/testcases/kernel/connectors/connector_test.sh >> --- ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh >> 1970-01-01 08:00:00.000000000 +0800 >> +++ ltp-full-20080531/testcases/kernel/connectors/connector_test.sh >> 2008-06-26 15:55:42.000000000 +0800 >> @@ -0,0 +1,15 @@ >> +#! /bin/sh >> + >> +if [ -z $LTPROOT ]; then >> + export LTPROOT="`cd ../../.. && pwd`" >> + export PATH="$PATH:$LTPROOT/testcases/bin" >> +fi >> + >> +tst_kvercmp 2 6 15 >> +if [ $? -eq 0 ]; then >> + echo "Connectors 0 CONF : system doesn't support execution of the >> test" >> + exit 0 >> +fi >> + >> +$LTPROOT/testcases/bin/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 2008-06-26 >> 15:03:31.000000000 +0800 >> +++ ltp-full-20080531/testcases/kernel/connectors/Makefile 2008-06-26 >> 15:35:32.000000000 +0800 >> @@ -2,12 +2,16 @@ SUBDIRS = pec >> >> all: >> @set -e; \ >> - if ./tst_kvercmp 2 6 15; then \ >> + if ../../bin/tst_kvercmp 2 6 15; then \ >> echo "system does not support process event connector"; \ >> - else $(MAKE) -C pec; true; fi >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done; true; fi >> >> install: >> - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done >> - >> + @set -e; \ >> + ln -f connector_test.sh ../../bin/connector_test.sh; \ >> + chmod ugo+x connector_test.sh; \ >> + if ../../bin/tst_kvercmp 2 6 15; then \ >> + echo "system does not support process event connector"; \ >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i install; done; true; fi >> clean: >> @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done >> 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 >> 2008-06-26 15:03:31.000000000 +0800 >> +++ ltp-full-20080531/testcases/kernel/connectors/pec/Makefile 2008-06-26 >> 15:48:44.000000000 +0800 >> @@ -9,5 +9,6 @@ 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/ >> + chmod +x run_pec_test >> 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 >> 2008-06-26 15:03:31.000000000 +0800 >> +++ ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c >> 2008-06-26 15:03:50.000000000 +0800 >> @@ -31,6 +31,7 @@ >> >> #include <linux/netlink.h> >> #include <linux/connector.h> >> +#define _LINUX_TIME_H >> #include <linux/cn_proc.h> >> >> #define PEC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct proc_event)) >> >> >> >> ------------------------------------------------------------------------- >> 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 >> Ltp...@li... >> https://lists.sourceforge.net/lists/listinfo/ltp-list >> >> > > |
From: Subrata M. <tos...@gm...> - 2008-06-26 11:55:07
|
Well, I just discovered something else instead. The statement: if ../../bin/tst_kvercmp 2 6 15; then \ in testcases/kernel/connectors/Makefile, will not work as the directory: testcases/bin and itś corresponding contents (which also includes tst_kvercmp) will not be available until: make install is done. So, although the logic for 1) make install 2) ./runltp -f connectors, make work out for kernels below 2.6.15, But 1) make, will not work for kernels below 2.6.15 I have however merged your topup patch. Since it is not included in default build/install/run, so it will not pose any problem presently. People who are sure that the corresponding libraries and the kernel version supports PEC, can easily go and do the build and run for the same. Meanwhile i also noticed some build failures even on machines which has kernel above 2.6.15. I hope you will also fix the same when your kernel patch is accepted. Till then we will test PEC as standalone tests. Thanks for providing such wonderful tests. This patch is also merged. Regards-- Subrata On Thu, Jun 26, 2008 at 3:20 PM, Li Zefan <li...@cn...> wrote: > Subrata Modak wrote: > > Thanks Li. > > > > But somehow i am not able to apply this Patch cleanly. I have just merged > > your last updated Patch which adds these tests. But i have removed it´s > > compilation from testcases/kernel/Makefile. Can you quickly take a diff > of > > the latest(now) LTP CVS and send across this patch once again, which > > according to you will solve the below problems: > > > > Sorry, but I can't check out LTP CVS in my company. :( > > And note that this patch doesn't touch testcases/kernel/Makefile at all. > > > - building failure on 2.6.16 should be fixed > > - fix "make install" if kernel version < 2.6.15 > > - abort tests if kernel version < 2.6.15 > > > > Regards-- > > Subrata > > > > > > > > On Thu, Jun 26, 2008 at 1:33 PM, Li Zefan <li...@cn...> wrote: > > > >>>> So how about put the tests into LTP but not run by default, and when > my > >> patch > >>>> is accepted (but I'm not optimistic) or Evgeniy has done the > extension, > >> we > >>>> can update the tests and make it run by default. > >>> That would be really great, rather than holding it off from LTP > >>> inclusion. I would merge your last updated patch with little > >>> modifications from your side. I will make sure that it does not run by > >>> default until your kernel patch is through, and in that case, you can > >>> send me an updated patch. > >>> > >> Here it is. Based on my last patch. > >> > >> - building failure on 2.6.16 should be fixed > >> - fix "make install" if kernel version < 2.6.15 > >> - abort tests if kernel version < 2.6.15 > >> > >> Signed-off-by: Li Zefan <li...@cn...> > >> --- > >> runtest/connectors | 2 +- > >> testcases/kernel/connectors/Makefile | 12 ++++++++---- > >> testcases/kernel/connectors/connector_test.sh | 15 +++++++++++++++ > >> testcases/kernel/connectors/pec/Makefile | 1 + > >> testcases/kernel/connectors/pec/pec_listener.c | 1 + > >> 5 files changed, 26 insertions(+), 5 deletions(-) > >> > >> diff -Nurp ltp-full-20080531.orig/runtest/connectors > >> ltp-full-20080531/runtest/connectors > >> --- ltp-full-20080531.orig/runtest/connectors 2008-06-26 > >> 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/runtest/connectors 2008-06-26 > >> 15:15:24.000000000 +0800 > >> @@ -1,2 +1,2 @@ > >> #DESCRIPTION:Netlink Connector tests > >> -Connectors run_pec_test > >> +Connectors connector_test.sh > >> diff -Nurp > >> ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > >> ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > >> --- ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > >> 1970-01-01 08:00:00.000000000 +0800 > >> +++ ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > >> 2008-06-26 15:55:42.000000000 +0800 > >> @@ -0,0 +1,15 @@ > >> +#! /bin/sh > >> + > >> +if [ -z $LTPROOT ]; then > >> + export LTPROOT="`cd ../../.. && pwd`" > >> + export PATH="$PATH:$LTPROOT/testcases/bin" > >> +fi > >> + > >> +tst_kvercmp 2 6 15 > >> +if [ $? -eq 0 ]; then > >> + echo "Connectors 0 CONF : system doesn't support execution of > the > >> test" > >> + exit 0 > >> +fi > >> + > >> +$LTPROOT/testcases/bin/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 > 2008-06-26 > >> 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/testcases/kernel/connectors/Makefile > 2008-06-26 > >> 15:35:32.000000000 +0800 > >> @@ -2,12 +2,16 @@ SUBDIRS = pec > >> > >> all: > >> @set -e; \ > >> - if ./tst_kvercmp 2 6 15; then \ > >> + if ../../bin/tst_kvercmp 2 6 15; then \ > >> echo "system does not support process event connector"; > \ > >> - else $(MAKE) -C pec; true; fi > >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done; true; fi > >> > >> install: > >> - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i install ; done > >> - > >> + @set -e; \ > >> + ln -f connector_test.sh ../../bin/connector_test.sh; \ > >> + chmod ugo+x connector_test.sh; \ > >> + if ../../bin/tst_kvercmp 2 6 15; then \ > >> + echo "system does not support process event connector"; > \ > >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i install; done; true; > fi > >> clean: > >> @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done > >> 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 > >> 2008-06-26 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/testcases/kernel/connectors/pec/Makefile > 2008-06-26 > >> 15:48:44.000000000 +0800 > >> @@ -9,5 +9,6 @@ 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/ > >> + chmod +x run_pec_test > >> 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 > >> 2008-06-26 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c > >> 2008-06-26 15:03:50.000000000 +0800 > >> @@ -31,6 +31,7 @@ > >> > >> #include <linux/netlink.h> > >> #include <linux/connector.h> > >> +#define _LINUX_TIME_H > >> #include <linux/cn_proc.h> > >> > >> #define PEC_MSG_SIZE (sizeof(struct cn_msg) + sizeof(struct > proc_event)) > >> > >> > >> > >> > ------------------------------------------------------------------------- > >> 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 > >> Ltp...@li... > >> https://lists.sourceforge.net/lists/listinfo/ltp-list > >> > >> > > > > > -- Regards & Thanks-- Subrata |
From: Rishikesh K. R. <ris...@li...> - 2008-09-02 14:41:34
|
Hi Subrata, I am not sure someone has reported this problem or not, but i am getting this error while running connectors. Below i am providing the result for different kernel version and for different machine with last three month LTP released. =====================================With June release ================================== Test Start Time: Tue Sep 2 21:12:02 2008 ----------------------------------------- Testcase Result Exit Value -------- ------ ---------- Test Start Time: Tue Sep 2 21:12:02 2008 ----------------------------------------- Testcase Result Exit Value -------- ------ ---------- ----------------------------------------------- Total Tests: 1 Total Failures: 0 Kernel Version: 2.6.27-rc3-ext4-1 Machine Architecture: i686 Hostname: x330e =========== LOG File: /root/ltp-full-20080630/results/LTP_RUN_ON-2008_Sep_02-21h_12m_02s.log FAILED COMMAND File: /root/ltp-full-20080630/output/LTP_RUN_ON-2008_Sep_02-21h_12m_02s.failed Running tests....... <<<test_start>>> tag=Connectors stime=1220370122 cmdline="connector_test.sh" contacts="" analysis=exit initiation_status="pan(17234): execvp of 'connector_test.sh' (tag Connectors) failed. errno:2 No such file or directory" <<<test_output>>> <<<execution_status>>> duration=0 termination_type=exited termination_id=2 corefile=no cutime=0 cstime=0 <<<test_end>>> incrementing stop INFO: pan reported all tests PASS LTP Version: LTP-20080630 =================================================================== Here is the second kernel =============================With July Release====================================== Test Start Time: Tue Sep 2 18:58:19 2008 ----------------------------------------- Testcase Result Exit Value -------- ------ ---------- Test Start Time: Tue Sep 2 18:58:19 2008 ----------------------------------------- Testcase Result Exit Value -------- ------ ---------- ----------------------------------------------- Total Tests: 1 Total Failures: 0 Kernel Version: 2.6.27-rc3 Machine Architecture: i686 Hostname: hs40 LOG File: /root/ltp-full-20080731/results/LTP_RUN_ON-2008_Sep_02-18h_58m_19s.log FAILED COMMAND File: /root/ltp-full-20080731/output/LTP_RUN_ON-2008_Sep_02-18h_58m_19s.failed Running tests....... <<<test_start>>> tag=Connectors stime=1220362099 cmdline="connector_test.sh" contacts="" analysis=exit initiation_status="pan(27263): execvp of 'connector_test.sh' (tag Connectors) failed. errno:2 No such file or directory" <<<test_output>>> <<<execution_status>>> duration=0 termination_type=exited termination_id=2 corefile=no cutime=0 cstime=0 <<<test_end>>> incrementing stop INFO: pan reported all tests PASS LTP Version: LTP-20080731 ==========================With Latest Release========================================= LOG File: /root/ltp-full-20080831/results/LTP_RUN_ON-2008_Sep_02-14h_23m_09s.log FAILED COMMAND File: /root/ltp-full-20080831/output/LTP_RUN_ON-2008_Sep_02-14h_23m_09s.failed Running tests....... <<<test_start>>> tag=Connectors stime=1220345590 cmdline="connector_test.sh" contacts="" analysis=exit initiation_status="pan(13770): execvp of 'connector_test.sh' (tag Connectors) failed. errno:2 No such file or directory" <<<test_output>>> <<<execution_status>>> duration=0 termination_type=exited termination_id=2 corefile=no cutime=0 cstime=0 <<<test_end>>> incrementing stop INFO: pan reported all tests PASS LTP Version: LTP-20080831 ======================================================================= Thanks Rishi On Thu, 2008-06-26 at 17:25 +0530, Subrata Modak wrote: > Well, > > I just discovered something else instead. The statement: > > if ../../bin/tst_kvercmp 2 6 15; then \ > > in testcases/kernel/connectors/Makefile, will not work as the > directory: > testcases/bin and itś corresponding contents (which also includes > tst_kvercmp) will not be available until: > > make install > > is done. > > So, although the logic for > 1) make install > 2) ./runltp -f connectors, > > make work out for kernels below 2.6.15, But 1) make, will not work for > kernels below 2.6.15 > > I have however merged your topup patch. Since it is not included in > default build/install/run, so it will not pose any problem presently. > People who are sure that the corresponding libraries and the kernel > version supports PEC, can easily go and do the build and run for the > same. > > Meanwhile i also noticed some build failures even on machines which > has kernel above 2.6.15. I hope you will also fix the same when your > kernel patch is accepted. Till then we will test PEC as standalone > tests. Thanks for providing such wonderful tests. This patch is also > merged. > > Regards-- > Subrata > > > On Thu, Jun 26, 2008 at 3:20 PM, Li Zefan <li...@cn...> wrote: > > Subrata Modak wrote: > > Thanks Li. > > > > But somehow i am not able to apply this Patch cleanly. I > have just merged > > your last updated Patch which adds these tests. But i have > removed it´s > > compilation from testcases/kernel/Makefile. Can you quickly > take a diff of > > the latest(now) LTP CVS and send across this patch once > again, which > > according to you will solve the below problems: > > > > > > Sorry, but I can't check out LTP CVS in my company. :( > > And note that this patch doesn't touch > testcases/kernel/Makefile at all. > > > > > - building failure on 2.6.16 should be fixed > > - fix "make install" if kernel version < 2.6.15 > > - abort tests if kernel version < 2.6.15 > > > > Regards-- > > Subrata > > > > > > > > On Thu, Jun 26, 2008 at 1:33 PM, Li Zefan > <li...@cn...> wrote: > > > >>>> So how about put the tests into LTP but not run by > default, and when my > >> patch > >>>> is accepted (but I'm not optimistic) or Evgeniy has done > the extension, > >> we > >>>> can update the tests and make it run by default. > >>> That would be really great, rather than holding it off > from LTP > >>> inclusion. I would merge your last updated patch with > little > >>> modifications from your side. I will make sure that it > does not run by > >>> default until your kernel patch is through, and in that > case, you can > >>> send me an updated patch. > >>> > >> Here it is. Based on my last patch. > >> > >> - building failure on 2.6.16 should be fixed > >> - fix "make install" if kernel version < 2.6.15 > >> - abort tests if kernel version < 2.6.15 > >> > >> Signed-off-by: Li Zefan <li...@cn...> > >> --- > >> runtest/connectors | 2 +- > >> testcases/kernel/connectors/Makefile | 12 > ++++++++---- > >> testcases/kernel/connectors/connector_test.sh | 15 > +++++++++++++++ > >> testcases/kernel/connectors/pec/Makefile | 1 + > >> testcases/kernel/connectors/pec/pec_listener.c | 1 + > >> 5 files changed, 26 insertions(+), 5 deletions(-) > >> > >> diff -Nurp ltp-full-20080531.orig/runtest/connectors > >> ltp-full-20080531/runtest/connectors > >> --- ltp-full-20080531.orig/runtest/connectors 2008-06-26 > >> 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/runtest/connectors 2008-06-26 > >> 15:15:24.000000000 +0800 > >> @@ -1,2 +1,2 @@ > >> #DESCRIPTION:Netlink Connector tests > >> -Connectors run_pec_test > >> +Connectors connector_test.sh > >> diff -Nurp > >> > ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > >> > ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > >> --- > ltp-full-20080531.orig/testcases/kernel/connectors/connector_test.sh > >> 1970-01-01 08:00:00.000000000 +0800 > >> +++ > ltp-full-20080531/testcases/kernel/connectors/connector_test.sh > >> 2008-06-26 15:55:42.000000000 +0800 > >> @@ -0,0 +1,15 @@ > >> +#! /bin/sh > >> + > >> +if [ -z $LTPROOT ]; then > >> + export LTPROOT="`cd ../../.. && pwd`" > >> + export PATH="$PATH:$LTPROOT/testcases/bin" > >> +fi > >> + > >> +tst_kvercmp 2 6 15 > >> +if [ $? -eq 0 ]; then > >> + echo "Connectors 0 CONF : system doesn't support > execution of the > >> test" > >> + exit 0 > >> +fi > >> + > >> +$LTPROOT/testcases/bin/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 > 2008-06-26 > >> 15:03:31.000000000 +0800 > >> +++ ltp-full-20080531/testcases/kernel/connectors/Makefile > 2008-06-26 > >> 15:35:32.000000000 +0800 > >> @@ -2,12 +2,16 @@ SUBDIRS = pec > >> > >> all: > >> @set -e; \ > >> - if ./tst_kvercmp 2 6 15; then \ > >> + if ../../bin/tst_kvercmp 2 6 15; then \ > >> echo "system does not support process event > connector"; \ > >> - else $(MAKE) -C pec; true; fi > >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; > done; true; fi > >> > >> install: > >> - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i > install ; done > >> - > >> + @set -e; \ > >> + ln -f > connector_test.sh ../../bin/connector_test.sh; \ > >> + chmod ugo+x connector_test.sh; \ > >> + if ../../bin/tst_kvercmp 2 6 15; then \ > >> + echo "system does not support process event > connector"; \ > >> + else for i in $(SUBDIRS); do $(MAKE) -C $$i > install; done; true; fi > >> clean: > >> @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i > clean ; done > >> 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 > >> 2008-06-26 15:03:31.000000000 +0800 > >> +++ > ltp-full-20080531/testcases/kernel/connectors/pec/Makefile > 2008-06-26 > >> 15:48:44.000000000 +0800 > >> @@ -9,5 +9,6 @@ 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/ > >> + chmod +x run_pec_test > >> 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 > >> 2008-06-26 15:03:31.000000000 +0800 > >> +++ > ltp-full-20080531/testcases/kernel/connectors/pec/pec_listener.c > >> 2008-06-26 15:03:50.000000000 +0800 > >> @@ -31,6 +31,7 @@ > >> > >> #include <linux/netlink.h> > >> #include <linux/connector.h> > >> +#define _LINUX_TIME_H > >> #include <linux/cn_proc.h> > >> > >> #define PEC_MSG_SIZE (sizeof(struct cn_msg) + > sizeof(struct proc_event)) > >> > >> > >> > >> > ------------------------------------------------------------------------- > >> 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 > >> Ltp...@li... > >> https://lists.sourceforge.net/lists/listinfo/ltp-list > >> > >> > > > > > > > > > > -- > Regards & Thanks-- > Subrata > > ------------------------------------------------------------------------- > 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 Ltp...@li... https://lists.sourceforge.net/lists/listinfo/ltp-list |
From: Li Z. <li...@cn...> - 2008-09-03 01:07:16
|
Rishikesh K. Rajak wrote: > Hi Subrata, > > I am not sure someone has reported this problem or not, but i am getting > this error while running connectors. > > Below i am providing the result for different kernel version and for > different machine with last three month LTP released. > It's not run by default, so you have to build and install before running the tests. I think I'm going to make it run by default. |
From: Matt H. <mat...@us...> - 2008-09-03 02:51:03
|
On Tue, 2008-09-02 at 20:09 +0530, Rishikesh K. Rajak wrote: > Hi Subrata, > > I am not sure someone has reported this problem or not, but i am > getting this error while running connectors. > > Below i am providing the result for different kernel version and for > different machine with last three month LTP released. <snip> > ==========================With Latest > Release========================================= > > > LOG > File: /root/ltp-full-20080831/results/LTP_RUN_ON-2008_Sep_02-14h_23m_09s.log > FAILED COMMAND > File: /root/ltp-full-20080831/output/LTP_RUN_ON-2008_Sep_02-14h_23m_09s.failed > Running tests....... > <<<test_start>>> > tag=Connectors stime=1220345590 > cmdline="connector_test.sh" > contacts="" > analysis=exit > initiation_status="pan(13770): execvp of 'connector_test.sh' (tag > Connectors) failed. errno:2 No such file or directory" > <<<test_output>>> > <<<execution_status>>> > duration=0 termination_type=exited termination_id=2 corefile=no > cutime=0 cstime=0 > <<<test_end>>> > incrementing stop > INFO: pan reported all tests PASS > LTP Version: LTP-20080831 > > ======================================================================= > > Thanks > > Rishi I'd guess LTPROOT is being setup by the connectors test scripts improperly. Please give this patch a try -- I haven't tested it myself yet. The patch does some additional unrelated cleanup which should be ok for testing purposes. It will need to be split up for submission... Signed-off-by: Matt Helsley <mat...@us...> --- testcases/kernel/connectors/Makefile | 11 +++-------- testcases/kernel/connectors/connector_test.sh | 5 ----- testcases/kernel/connectors/pec/run_pec_test | 15 ++++----------- 3 files changed, 7 insertions(+), 24 deletions(-) Index: ltp-intermediate-20080820/testcases/kernel/connectors/pec/run_pec_test =================================================================== --- ltp-intermediate-20080820.orig/testcases/kernel/connectors/pec/run_pec_test +++ ltp-intermediate-20080820/testcases/kernel/connectors/pec/run_pec_test @@ -1,4 +1,4 @@ -#! /bin/bash +#!/bin/bash ################################################################################ ## ## @@ -26,12 +26,6 @@ NUM_EVENTS=1 EVENT_TEST_CASES=( "fork" "exec" "exit" "uid" "gid" ) TST_TOTAL=${#EVENT_TEST_CASES[@]} -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" @@ -54,14 +48,14 @@ run_case() export TST_COUNT=$1 log="$LTPROOT/output/log" - mkdir $log 2> /dev/null + mkdir -p $log 2> /dev/null - ./pec_listener > "$log/listener_$1.log" 2>&1 & + pec_listener > "$log/listener_$1.log" 2>&1 & pid=$! # Wait for pec_listener to start listening sleep $((1*NUM_EVENTS)) - ./event_generator -e $2 > "$log/generator_$1.log" + event_generator -e $2 > "$log/generator_$1.log" ret1=$? # Sleep until pec_listener has seen and handled all of @@ -100,4 +94,3 @@ for CASE in "${EVENT_TEST_CASES[@]}" ; d done exit $exit_status - Index: ltp-intermediate-20080820/testcases/kernel/connectors/connector_test.sh =================================================================== --- ltp-intermediate-20080820.orig/testcases/kernel/connectors/connector_test.sh +++ ltp-intermediate-20080820/testcases/kernel/connectors/connector_test.sh @@ -1,10 +1,5 @@ #!/bin/bash -if [ -z $LTPROOT ]; then - export LTPROOT="`cd ../../.. && pwd`" - export PATH="$PATH:$LTPROOT/testcases/bin" -fi - tst_kvercmp 2 6 15 if [ $? -eq 0 ]; then echo "Connectors 0 CONF : system doesn't support execution of the test" Index: ltp-intermediate-20080820/testcases/kernel/connectors/Makefile =================================================================== --- ltp-intermediate-20080820.orig/testcases/kernel/connectors/Makefile +++ ltp-intermediate-20080820/testcases/kernel/connectors/Makefile @@ -1,18 +1,13 @@ SUBDIRS = pec all: - @set -e; \ - if ../../bin/tst_kvercmp 2 6 15; then \ - echo "system does not support process event connector"; \ - else for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done; true; fi + @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i $@; done install: @set -e; \ ln -f connector_test.sh ../../bin/connector_test.sh; \ chmod ugo+x connector_test.sh; \ - if ../../bin/tst_kvercmp 2 6 15; then \ - echo "system does not support process event connector"; \ - else for i in $(SUBDIRS); do $(MAKE) -C $$i install; done; true; fi + for i in $(SUBDIRS); do $(MAKE) -C $$i $@ ; done clean: - @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i clean ; done + @set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i $@ ; done |
From: Matt H. <mat...@us...> - 2008-09-03 02:55:40
|
On Tue, 2008-09-02 at 19:50 -0700, Matt Helsley wrote: <snip> > > Rishi > > I'd guess LTPROOT is being setup by the connectors test scripts > improperly. Please give this patch a try -- I haven't tested it myself > yet. > > The patch does some additional unrelated cleanup which should be ok for > testing purposes. It will need to be split up for submission... > > Signed-off-by: Matt Helsley <mat...@us...> <snip> I just noticed Li's email. Li has an excellent point. You need to add 'connectors' to the end of the SUBDIRS variable in testcases/kernel/Makefile before doing: make ; make install ; runltp -s Connectors If that fixes it for you feel free to completely ignore my patch :). Cheers, -Matt |
From: Subrata M. <su...@li...> - 2008-09-03 07:47:40
|
On Tue, 2008-09-02 at 19:55 -0700, Matt Helsley wrote: > On Tue, 2008-09-02 at 19:50 -0700, Matt Helsley wrote: > > <snip> > > > > Rishi > > > > I'd guess LTPROOT is being setup by the connectors test scripts > > improperly. Please give this patch a try -- I haven't tested it myself > > yet. > > > > The patch does some additional unrelated cleanup which should be ok for > > testing purposes. It will need to be split up for submission... > > > > Signed-off-by: Matt Helsley <mat...@us...> > > <snip> > > I just noticed Li's email. Li has an excellent point. You need to add > 'connectors' to the end of the SUBDIRS variable in > testcases/kernel/Makefile before doing: > Yes, Both Matt and Li are correct. When i checked in Process Event Connectors test cases in LTP, they were not made to run by default. Not only that, they will neither be built nor installed with make. So, the runltp script doesn´t contain to include runtest/connectors. You must have executed: ./runltp -f connectors, which will always give you execve() fail as there are no binaries to execute as they were not built or installed in the first place. Now, the reason for Connectors not being part of default LTP run was because a suitable mechanism to detect whether the underlying kernel supports PEC was not arrived upon. Recently Li has submitted a patch in the regard to LKML, which i suppose has already gone in. Li will be re-visiting the PEC test cases infrastructure to make it build/install/run by default and also take care of underlying support stuff. Hope that clarifies your doubt. Regards-- Subrata. > make ; make install ; runltp -s Connectors > > If that fixes it for you feel free to completely ignore my patch :). > > Cheers, > -Matt > |