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