xref: /netbsd-src/regress/sys/kern/kqueue/vnode/vnode.c (revision 466a16a118933bd295a8a104f095714fadf9cf68)
1*466a16a1Schristos /*	$NetBSD: vnode.c,v 1.5 2008/12/29 05:56:02 christos Exp $	*/
228c37e67Sjdolecek 
328c37e67Sjdolecek /*-
428c37e67Sjdolecek  * Copyright (c) 2002 The NetBSD Foundation, Inc.
528c37e67Sjdolecek  * All rights reserved.
628c37e67Sjdolecek  *
728c37e67Sjdolecek  * This code is derived from software contributed to The NetBSD Foundation
828c37e67Sjdolecek  * by Luke Mewburn.
928c37e67Sjdolecek  *
1028c37e67Sjdolecek  * Redistribution and use in source and binary forms, with or without
1128c37e67Sjdolecek  * modification, are permitted provided that the following conditions
1228c37e67Sjdolecek  * are met:
1328c37e67Sjdolecek  * 1. Redistributions of source code must retain the above copyright
1428c37e67Sjdolecek  *    notice, this list of conditions and the following disclaimer.
1528c37e67Sjdolecek  * 2. Redistributions in binary form must reproduce the above copyright
1628c37e67Sjdolecek  *    notice, this list of conditions and the following disclaimer in the
1728c37e67Sjdolecek  *    documentation and/or other materials provided with the distribution.
1828c37e67Sjdolecek  *
1928c37e67Sjdolecek  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2028c37e67Sjdolecek  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2128c37e67Sjdolecek  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2228c37e67Sjdolecek  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2328c37e67Sjdolecek  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2428c37e67Sjdolecek  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2528c37e67Sjdolecek  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2628c37e67Sjdolecek  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2728c37e67Sjdolecek  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2828c37e67Sjdolecek  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2928c37e67Sjdolecek  * POSSIBILITY OF SUCH DAMAGE.
3028c37e67Sjdolecek  */
3128c37e67Sjdolecek 
3228c37e67Sjdolecek #include <sys/param.h>
3328c37e67Sjdolecek #include <sys/event.h>
3428c37e67Sjdolecek #include <sys/time.h>
3528c37e67Sjdolecek 
3628c37e67Sjdolecek #include <err.h>
3728c37e67Sjdolecek #include <errno.h>
3828c37e67Sjdolecek #include <fcntl.h>
3928c37e67Sjdolecek #include <stdio.h>
4028c37e67Sjdolecek #include <stdlib.h>
4128c37e67Sjdolecek #include <unistd.h>
4228c37e67Sjdolecek #include <inttypes.h>
4328c37e67Sjdolecek 
4428c37e67Sjdolecek int
main(int argc,char ** argv)4528c37e67Sjdolecek main(int argc, char **argv)
4628c37e67Sjdolecek {
4728c37e67Sjdolecek 	struct timespec	timeout;
4828c37e67Sjdolecek 	struct timeval	then, now, diff;
4928c37e67Sjdolecek 	struct kevent	event[2];
5028c37e67Sjdolecek 	char		buffer[128], *pref;
5128c37e67Sjdolecek 	int		fd, kq, n, i;
5228c37e67Sjdolecek 
5328c37e67Sjdolecek 	if (argc != 2)
5428c37e67Sjdolecek 		errx(1, "Usage: %s file", argv[0]);
5528c37e67Sjdolecek 
5628c37e67Sjdolecek 	fd = open(argv[1], O_RDONLY|O_CREAT, 0644);
5728c37e67Sjdolecek 	if (fd == -1)
5828c37e67Sjdolecek 		err(1, "open: %s", argv[1]);
5928c37e67Sjdolecek 
6028c37e67Sjdolecek #if 0
6128c37e67Sjdolecek 	sprintf(buffer, "/mnt/fd/%d", fd);
6228c37e67Sjdolecek 	if ((fd = open(buffer, O_RDONLY)) < 0)
6328c37e67Sjdolecek 		err(1, "open fdesc: %s", buffer);
6428c37e67Sjdolecek #endif
6528c37e67Sjdolecek 
6628c37e67Sjdolecek #ifdef READ_TEST
6728c37e67Sjdolecek 	lseek(fd, 0, SEEK_END);
6828c37e67Sjdolecek #endif
6928c37e67Sjdolecek 
7028c37e67Sjdolecek         kq = kqueue();
7128c37e67Sjdolecek         if (kq == -1)
7228c37e67Sjdolecek                 err(1, "kqueue");
7328c37e67Sjdolecek 
7428c37e67Sjdolecek 	i=0;
7528c37e67Sjdolecek 	EV_SET(&event[i], fd, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR,
7628c37e67Sjdolecek 		NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
7773704c4cSitojun 		NOTE_LINK | NOTE_RENAME | NOTE_REVOKE, 0, 0);
7828c37e67Sjdolecek 	i++;
7928c37e67Sjdolecek 
8028c37e67Sjdolecek #ifdef READ_TEST
8128c37e67Sjdolecek 	EV_SET(&event[i], fd, EVFILT_READ, EV_ADD | EV_ENABLE, 0, NULL, NULL);
8228c37e67Sjdolecek 	i++;
8328c37e67Sjdolecek 	printf("i is %d\n", i);
8428c37e67Sjdolecek #endif
8528c37e67Sjdolecek 
8628c37e67Sjdolecek 	n = kevent(kq, event, i, NULL, 0, NULL);
8728c37e67Sjdolecek 	if (n == -1)
8828c37e67Sjdolecek 		err(1, "kevent(1)");
8928c37e67Sjdolecek 
9028c37e67Sjdolecek 	timeout.tv_sec = 60;
9128c37e67Sjdolecek 	timeout.tv_nsec = 0;
9228c37e67Sjdolecek 
9328c37e67Sjdolecek 	for (;;) {
9428c37e67Sjdolecek 		pref="";
9528c37e67Sjdolecek 		if (gettimeofday(&then, NULL) == -1)
9628c37e67Sjdolecek 			err(1, "gettimeofday then");
9728c37e67Sjdolecek 		n = kevent(kq, NULL, 0, event, 1, &timeout);
9828c37e67Sjdolecek 		if (gettimeofday(&now, NULL) == -1)
9928c37e67Sjdolecek 			err(1, "gettimeofday now");
10028c37e67Sjdolecek 		timersub(&now, &then, &diff);
101*466a16a1Schristos 		printf("vnode '%s': kevent returned %d in %lld.%06ld\n",
10228c37e67Sjdolecek 			argv[1],
103*466a16a1Schristos 			n, (long long)diff.tv_sec, (long)diff.tv_usec);
10428c37e67Sjdolecek 
10528c37e67Sjdolecek 		if (n == -1)
10628c37e67Sjdolecek 			err(1, "kevent");
10728c37e67Sjdolecek 		else if (n == 0)
10828c37e67Sjdolecek 			continue;
10928c37e67Sjdolecek 
11028c37e67Sjdolecek 		printf("vnode '%s': kevent: filter %d flags: 0x%02x, fflags: 0x%02x [",
11128c37e67Sjdolecek 		    argv[1],
11228c37e67Sjdolecek 		    event[0].filter, event[0].flags, event[0].fflags);
11328c37e67Sjdolecek 
11428c37e67Sjdolecek #define DUMPFLAG(x) \
11528c37e67Sjdolecek 	do \
11628c37e67Sjdolecek 		if (event[0].fflags & x) { \
11728c37e67Sjdolecek 			printf ("%s%s", pref, #x); \
11828c37e67Sjdolecek 			pref=", "; \
11928c37e67Sjdolecek 		} \
12028c37e67Sjdolecek 	while (0)
12128c37e67Sjdolecek 
12228c37e67Sjdolecek 		DUMPFLAG(NOTE_DELETE);
12328c37e67Sjdolecek 		DUMPFLAG(NOTE_WRITE);
12428c37e67Sjdolecek 		DUMPFLAG(NOTE_EXTEND);
12528c37e67Sjdolecek 		DUMPFLAG(NOTE_ATTRIB);
12628c37e67Sjdolecek 		DUMPFLAG(NOTE_LINK);
12728c37e67Sjdolecek 		DUMPFLAG(NOTE_RENAME);
12828c37e67Sjdolecek 		DUMPFLAG(NOTE_REVOKE);
12928c37e67Sjdolecek 		printf("], data %" PRId64 "\n", event[0].data);
13028c37e67Sjdolecek 
13128c37e67Sjdolecek 		if (event[0].filter == EVFILT_READ) {
13228c37e67Sjdolecek 			if (event[0].data < 0)
13328c37e67Sjdolecek 				lseek(fd, 0, SEEK_END);
13428c37e67Sjdolecek 			n = read(fd, buffer, 128);
135b7ae68fdSchristos 			if (n < 0)
136b7ae68fdSchristos 				err(1, "read");
13728c37e67Sjdolecek 			buffer[n] = '\0';
13828c37e67Sjdolecek 			printf("[%d] %s", n, buffer);
13928c37e67Sjdolecek 		}
14028c37e67Sjdolecek 
14128c37e67Sjdolecek 		if (event[0].fflags & NOTE_REVOKE) {
14228c37e67Sjdolecek 			printf("%s revoked\n", argv[1]);
14328c37e67Sjdolecek 			break;
14428c37e67Sjdolecek 		}
14528c37e67Sjdolecek 	}
14628c37e67Sjdolecek 	return (0);
14728c37e67Sjdolecek }
148