/* * Copyright (c) 2003-2004 Daichi GOTO * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF * THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #define kevent_add(kq, ev) kevent((kq), (ev), 1, NULL, 0, NULL) #define kevent_poll(kq, ev) kevent((kq), NULL, 0, (ev), 1, NULL) static void usage(void); static void addwatchfile(int, int); static void watchfile(int); int main(int argc, char *argv[]) { int kq; int filedesc; int count; if (2 > argc) { usage(); exit(EX_USAGE); } kq = kqueue(); for (count = 1; count < argc; count++) { filedesc = open(argv[count], O_RDONLY); if (-1 == filedesc) { fprintf(stderr, "error: cannot open file: %d\n", errno); exit(EX_NOINPUT); } addwatchfile(kq, filedesc); } watchfile(kq); exit(EX_OK); } static void usage(void) { fprintf(stderr, "usage: fwatch files...\n"); } static void addwatchfile(int kq, int filedesc) { struct kevent event; EV_SET(&event, filedesc, EVFILT_VNODE, EV_ADD | EV_ENABLE | EV_CLEAR, NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB | NOTE_RENAME, 0, 0); kevent_add(kq, &event); } static void watchfile(int kq) { struct kevent event; kevent_poll(kq, &event); }