Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 22 Mar 2005 09:20:52 +0100 (CET)
From:      Jose M Rodriguez <josemi@freebsd.jazztel.es>
To:        ports@FreeBSD.org
Subject:   RE: in the way to fam 2.7.0
Message-ID:  <200503220820.j2M8KqwJ051751@redesjm.local>

next in thread | raw e-mail | index | archive | help
# This is a shell archive.  Save it in a file, remove anything before
# this line, and then unpack it by entering "sh file".  Note, it may
# create directories; files and directories will be owned by you and
# have default permissions.
#
# This archive contains:
#
#	.
#	./files
#	./files/IMonKQueue.c++
#	./files/imon-compat.h
#	./files/patch-src_Client.h
#	./files/patch-lib_Client.c++
#	./files/patch-src_NFSFileSystem.h
#	./files/patch-src_LocalFileSystem.h
#	./files/patch-src_Makefile.in
#	./files/patch-configure
#	./files/patch-src_NetConnection.c++
#	./files/patch-src_mntent_compat.c++
#	./files/patch-src_Scheduler.h
#	./files/patch-include_BTree.h
#	./files/patch-src_Listener.c++
#	./files/patch-src_Log.c++
#	./files/patch-src_IMon.c++
#	./files/patch-src_Interest.c++
#	./files/patch-src_FileSystem.c++
#	./files/patch-config.h.in
#	./files/patch-src_FileSystemTable.c++
#	./files/patch-lib_fam.c++
#	./files/patch-conf_Makefile.in
#	./files/patch-src_NFSFileSystem.c++
#	./files/patch-src_InternalClient.c++
#	./files/patch-src_fam-mntent.h
#	./files/patch-src_ServerHost.h
#	./files/patch-src_RPC_TCP_Connector.c++
#	./files/patch-src_FileSystem.h
#	./files/patch-src_LocalFileSystem.c++
#	./Makefile
#	./pkg-descr
#	./pkg-message
#	./distinfo
#	./pkg-plist
#
echo c - .
mkdir -p . > /dev/null 2>&1
echo c - ./files
mkdir -p ./files > /dev/null 2>&1
echo x - ./files/IMonKQueue.c++
sed 's/^X//' >./files/IMonKQueue.c++ << 'END-of-./files/IMonKQueue.c++'
X//  $NetBSD: IMonKQueue.c++,v 1.3 2005/01/05 16:21:06 jmmv Exp $
X//
X//  Copyright (c) 2004, 2005 Julio M. Merino Vidal.
X//  
X//  This program is free software; you can redistribute it and/or modify it
X//  under the terms of version 2 of the GNU General Public License as
X//  published by the Free Software Foundation.
X//
X//  This program is distributed in the hope that it would be useful, but
X//  WITHOUT ANY WARRANTY; without even the implied warranty of
X//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  Further, any
X//  license provided herein, whether implied or otherwise, is limited to
X//  this program in accordance with the express provisions of the GNU
X//  General Public License.  Patent licenses, if any, provided herein do not
X//  apply to combinations of this program with other product or programs, or
X//  any other product whatsoever.  This program is distributed without any
X//  warranty that the program is delivered free of the rightful claim of any
X//  third person by way of infringement or the like.  See the GNU General
X//  Public License for more details.
X//
X//  You should have received a copy of the GNU General Public License along
X//  with this program; if not, write the Free Software Foundation, Inc., 59
X//  Temple Place - Suite 330, Boston MA 02111-1307, USA.
X
X// ------------------------------------------------------------------------
X
X//  imon emulation through kqueue
X//  -----------------------------
X//
X//  The code in this file provides an imon-like interface to FAM using kqueue,
X//  the kernel event notification mechanism found in FreeBSD, NetBSD and
X//  OpenBSD.
X//
X//  The idea is the following: a thread, kqueue_monitor, simulates the kernel
X//  part of imon.  This thread can receive commands (ioctl(2)s) and produces
X//  notifications when there is something to notify.  The thread is constantly
X//  running in the background, calling kevent(2) to see if there are new
X//  events in the monitored files since the last call.
X//
X//  Communication with kqueue_monitor is accomplished by using two pipes.
X//  pipe_out is used by the monitor to provide notifications; i.e., it is the
X//  same as the read end of the regular /dev/imon device, and produces
X//  compatible messages.  On the other hand we have pipe_in, which is used
X//  to give commands to the monitor (express and revoke); we can't emulate
X//  ioctl(2)s from user space, so we have to go this route.
X//
X//  Why we use pipe_in to provide commands to the thread, instead of some
X//  mutexes?  If we used mutexes, we'd have to give kevent(2) a timeout, to
X//  let it "reload" the list of changes to be monitored in case it was
X//  externally modified.  By using a pipe, we can tell kqueue(2) to monitor
X//  it for us, and let kevent(2) immediately return when there is a command
X//  to process.
X//
X//  However, there is a little problem when using kqueue instead of imon or
X//  polling.  kqueue(2) works by monitoring open file descriptors, instead
X//  of inodes on the disk.  Therefore we must keep all files being monitored
X//  open, and the number of open files can quickly raise in some environments.
X//  This is why the code unlimits the number of open files in imon_open and
X//  sets a reasonable maximum based on kern.maxfiles (to avoid overflowing
X//  it quickly).  If we overflow this limit, the poller will enter the game
X//  (because we will return an error).
X//
X//  Known problem: if we receive *lots* of events quickly, famd may end up
X//  locked.  To reproduce, run the test program provided by fam against a
X//  local directory, say /tmp/foo, and do the following:
X//     cd /tmp/foo; for f in $(jot 1000); do touch $(jot 100); rm *; done
X//  You should receive some messages like:
X//     famd[21058]: kqueue can't revoke "75", dev = 0, ino = 1113421
X//  while the test is running (not a lot), and it will eventually lock up.
X//
X//  Having said all this, let's go to the code...
X
X// ------------------------------------------------------------------------
X
X#include "IMon.h"
X#include "Log.h"
X
X#include "config.h"
X#include "imon-compat.h"
X
X#include <sys/event.h>
X#include <sys/param.h>
X#include <sys/resource.h>
X#include <sys/sysctl.h>
X#include <sys/time.h>
X
X#include <assert.h>
X#include <fcntl.h>
X#include <pthread.h>
X#include <string.h>
X#include <unistd.h>
X
X#include <map>
X
X// ------------------------------------------------------------------------
X
X// devino is a structure that holds a device/inode pair.  It is used as an
X// indentifier of files managed by imon.
Xstruct devino {
X    dev_t di_dev;
X    ino_t di_ino;
X
X    bool operator<(const struct devino& di) const
X        { return (di_dev < di.di_dev) or
X                 (di_dev == di.di_dev and di_ino < di.di_ino); }
X};
X
X// imon_cmd simulates commands thrown to imon as ioctl(2)s (but remember
X// we use a pipe).
Xstruct imon_cmd {
X#define IMON_CMD_EXPRESS 0
X#define IMON_CMD_REVOKE 1
X    int ic_type;
X
X    // imon identifies files through a device/inode pair.
X    struct devino ic_di;
X
X    // A pipe that will be used to receive the result of the command
X    // (asynchronously).
X    int ic_stat[2];
X
X    // If this is an 'express' command, we need the descriptor to monitor.
X    int ic_fd;
X};
X
X// ------------------------------------------------------------------------
X
Xstatic int max_changes;
Xstatic int last_change;
Xstatic int kqueue_fd;
Xstatic int pipe_in[2], pipe_out[2];
Xstatic pthread_t kevent_thread;
Xstatic struct kevent *changes;
X
Xtypedef std::map<struct devino, int> DEVINOFD_MAP;
Xstatic DEVINOFD_MAP devino_to_fd;
Xtypedef std::map<int, struct devino> FDDEVINO_MAP;
Xstatic FDDEVINO_MAP fd_to_devino;
X
X// ------------------------------------------------------------------------
X
Xstatic void *kqueue_monitor(void *data);
Xstatic void process_command(void);
X
X// ------------------------------------------------------------------------
X
Xint
XIMon::imon_open(void)
X{
X    // Get the kernel event queue.  We only need one during all the life
X    // of famd.
X    kqueue_fd = kqueue();
X    if (kqueue_fd == -1)
X        return -1;
X
X    // Create "emulation" pipes.
X    if (pipe(pipe_in) == -1) {
X        close(kqueue_fd);
X        return -1;
X    }
X    if (pipe(pipe_out) == -1) {
X        close(kqueue_fd);
X        close(pipe_in[0]); close(pipe_in[1]);
X        return -1;
X    }
X
X    // Get the maximum number of files we can open and use it to set a
X    // limit of the files we can monitor.
X    size_t len = sizeof(max_changes);
X    if (sysctlbyname("kern.maxfiles", &max_changes, &len, NULL, 0) == -1)
X        max_changes = 128;
X    else
X        max_changes /= 2;
X
X    // Unlimit maximum number of open files.  We don't go to RLIM_INFINITY
X    // to avoid possible open descriptor leaks produce a system DoS.  75%
X    // of the system limit seems a good number (we request more than the
X    // number calculated previously to leave room for temporary pipes).
X    // We need to be root to do this.
X    uid_t olduid = geteuid();
X    seteuid(0);
X    struct rlimit rlp;
X    rlp.rlim_cur = rlp.rlim_max = max_changes * 3 / 2;
X    if (setrlimit(RLIMIT_NOFILE, &rlp) == -1)
X        Log::error("can't unlimit number of open files");
X    seteuid(olduid);
X
X    changes = new struct kevent[max_changes];
X
X    // We must monitor pipe_in for any commands that may alter the actual
X    // set of files being monitored.
X    EV_SET(&changes[0], pipe_in[0], EVFILT_READ,
X           EV_ADD | EV_ENABLE | EV_ONESHOT, 0, 0, 0);
X    last_change = 1;
X
X    // Create a thread that will run the kevent(2) function continuously.
X    if (pthread_create(&kevent_thread, NULL, kqueue_monitor, NULL) != 0) {
X        close(kqueue_fd);
X        close(pipe_in[0]); close(pipe_in[1]);
X        close(pipe_out[0]); close(pipe_out[1]);
X        return -1;
X    }
X
X    return pipe_out[0];
X}
X
X// ------------------------------------------------------------------------
X
XIMon::Status
XIMon::imon_express(const char *name, struct stat *status)
X{
X    // Get file information.
X    struct stat sb;
X    if (status == NULL)
X        status = &sb;
X    if (lstat(name, status) == -1)
X        return BAD;
X
X    // Open the file to be monitored; kqueue only works with open descriptors
X    // so we have to keep this descriptor during the life of this 'interest'.
X    int fd = open(name, O_RDONLY);
X    if (fd == -1)
X        return BAD;
X
X    // Construct a command to 'express' interest in a file.  This will be
X    // handled by the kqueue_monitor thread as soon as possible.
X    struct imon_cmd cmd;
X    cmd.ic_type = IMON_CMD_EXPRESS;
X    cmd.ic_di.di_dev = status->st_dev;
X    cmd.ic_di.di_ino = status->st_ino;
X    cmd.ic_fd = fd;
X    if (pipe(cmd.ic_stat) == -1) {
X        close(fd);
X        return BAD;
X    }
X    write(pipe_in[1], &cmd, sizeof(struct imon_cmd));
X
X    // Wait for a result form the previous operation.
X    bool result;
X    read(cmd.ic_stat[0], &result, sizeof(bool));
X    close(cmd.ic_stat[0]); close(cmd.ic_stat[1]);
X    if (!result) {
X        close(fd);
X        Log::error("kqueue can't monitor more than %d files", max_changes);
X        return BAD;
X    }
X
X    Log::debug("told kqueue to monitor \"%s\", descriptor = %d, dev = %d, "
X               "ino = %d", name, cmd.ic_fd, cmd.ic_di.di_dev,
X               cmd.ic_di.di_ino);
X
X    return OK;
X}
X
X// ------------------------------------------------------------------------
X
XIMon::Status
XIMon::imon_revoke(const char *name, dev_t dev, ino_t ino)
X{
X    // Construct a command to 'revoke' interest from a file.  This will be
X    // handled by the kqueue_monitor thread as soon as possible.
X    struct imon_cmd cmd;
X    cmd.ic_type = IMON_CMD_REVOKE;
X    cmd.ic_di.di_dev = dev;
X    cmd.ic_di.di_ino = ino;
X    if (pipe(cmd.ic_stat) == -1)
X        return BAD;
X    write(pipe_in[1], &cmd, sizeof(struct imon_cmd));
X
X    // Wait for a result form the previous operation.
X    bool result;
X    read(cmd.ic_stat[0], &result, sizeof(bool));
X    close(cmd.ic_stat[0]); close(cmd.ic_stat[1]);
X    if (!result) {
X        Log::error("kqueue can't revoke \"%s\", dev = %d, ino = %d", name,
X                   cmd.ic_di.di_dev, cmd.ic_di.di_ino);
X        return BAD;
X    }
X
X    Log::debug("told kqueue to forget \"%s\", dev = %d, ino = %d", name,
X               cmd.ic_di.di_dev, cmd.ic_di.di_ino);
X
X    return OK;
X}
X
X// ------------------------------------------------------------------------
X
Xstatic void *
Xkqueue_monitor(void *data)
X{
X    struct kevent event;
X
X    for (;;) {
X        int nev = kevent(kqueue_fd, changes, last_change, &event, 1, NULL);
X        if (nev == -1)
X            Log::perror("kevent");
X        else if (nev > 0) {
X            assert(nev == 1);
X
X            if (event.flags & EV_ERROR) {
X                int fd = event.ident;
X
X                FDDEVINO_MAP::const_iterator iter = fd_to_devino.find(fd);
X                assert(iter != fd_to_devino.end());
X                struct devino di = iter->second;
X
X                Log::error("kqueue returned error for fd = %d, dev = %d, "
X                           "ino = %d", fd, di.di_dev, di.di_ino);
X
X                // Remove offending entry from the mappings.
X                assert(devino_to_fd.find(di) != devino_to_fd.end());
X                devino_to_fd.erase(di);
X                assert(devino_to_fd.find(di) == devino_to_fd.end());
X                assert(fd_to_devino.find(fd) != fd_to_devino.end());
X                fd_to_devino.erase(fd);
X                assert(fd_to_devino.find(fd) == fd_to_devino.end());
X
X                // Remove the entry associated to the descriptor from the list
X                // of changes monitored by kqueue.
X                int i;
X                for (i = 1; i < last_change; i++)
X                    if (changes[i].ident == fd)
X                        break;
X                for (int j = i; j < last_change - 1; j++)
X                    changes[j] = changes[j + 1];
X                last_change--;
X
X                close(fd);
X
X                continue;
X            }
X
X            if (event.ident == pipe_in[0]) {
X                // We have got a control command, so process it.
X                process_command();
X            } else {
X                // One of the descriptors we are monitoring has got activity.
X                FDDEVINO_MAP::const_iterator iter =
X                    fd_to_devino.find(event.ident);
X                if (iter != fd_to_devino.end()) {
X                    qelem_t elem;
X
X                    // Set device/inode identifier on imon element.
X                    const struct devino &di = (*iter).second;
X                    elem.qe_dev = di.di_dev;
X                    elem.qe_inode = di.di_ino;
X
X                    // Convert the modification flags reported by kqueue to
X                    // flags understood by imon.
X                    elem.qe_what = 0;
X                    if (event.fflags & NOTE_DELETE)
X                        elem.qe_what |= IMON_DELETE;
X                    if (event.fflags & NOTE_RENAME)
X                        elem.qe_what |= IMON_RENAME;
X                    if (event.fflags & NOTE_ATTRIB or event.fflags & NOTE_LINK)
X                        elem.qe_what |= IMON_ATTRIBUTE;
X                    if (event.fflags & NOTE_WRITE or event.fflags & NOTE_EXTEND)
X                        elem.qe_what |= IMON_CONTENT;
X
X                    // Deliver the element.
X                    write(pipe_out[1], &elem, sizeof(qelem_t));
X                } else
X                    Log::error("got an event from an unhandled device/inode "
X                               "pair");
X            }
X        }
X    }
X}
X
X// ------------------------------------------------------------------------
X
Xstatic void
Xprocess_command(void)
X{
X    bool result = false;
X    struct imon_cmd cmd;
X
X    // Read the command from the control pipe.
X    read(pipe_in[0], &cmd, sizeof(struct imon_cmd));
X    if (cmd.ic_type == IMON_CMD_EXPRESS) {
X        Log::debug("process_command: express, dev = %d, ino = %d",
X                   cmd.ic_di.di_dev, cmd.ic_di.di_ino);
X        if (devino_to_fd.find(cmd.ic_di) != devino_to_fd.end()) {
X            // The file is already being monitored.
X            close(cmd.ic_fd);
X            result = true;
X        } else if (fd_to_devino.find(cmd.ic_fd) != fd_to_devino.end()) {
X            // We can't receive a new interest of a descriptor that is
X            // already being monitored.  If this happens, there is an
X            // inconsistency in the data somewhere.
X            assert(false);
X        } else if (last_change < max_changes) {
X            // Add the new descriptor to the list of changes to monitor.
X            // We watch for any change that happens on it.
X            EV_SET(&changes[last_change], cmd.ic_fd, EVFILT_VNODE,
X                   EV_ADD | EV_ENABLE | EV_ONESHOT,
X                   NOTE_DELETE | NOTE_WRITE | NOTE_EXTEND | NOTE_ATTRIB |
X                   NOTE_LINK | NOTE_RENAME | NOTE_REVOKE,
X                   0, 0);
X            last_change++;
X
X            // Map the device/inode pair to the file descriptor associated
X            // to it and viceversa.  We will need this information during
X            // 'revoke' and when we receive events.  We use two different
X            // maps to speed up searches in both directions later.
X            assert(devino_to_fd.find(cmd.ic_di) == devino_to_fd.end());
X            devino_to_fd.insert
X                (DEVINOFD_MAP::value_type(cmd.ic_di, cmd.ic_fd));
X            assert(devino_to_fd.find(cmd.ic_di) != devino_to_fd.end());
X            assert(fd_to_devino.find(cmd.ic_fd) == fd_to_devino.end());
X            fd_to_devino.insert
X                (FDDEVINO_MAP::value_type(cmd.ic_fd, cmd.ic_di));
X            assert(fd_to_devino.find(cmd.ic_fd) != fd_to_devino.end());
X
X            result = true;
X        }
X    } else if (cmd.ic_type == IMON_CMD_REVOKE) {
X        Log::debug("process_command: revoke, dev = %d, ino = %d",
X                   cmd.ic_di.di_dev, cmd.ic_di.di_ino);
X        DEVINOFD_MAP::const_iterator iter = devino_to_fd.find(cmd.ic_di);
X        if (iter != devino_to_fd.end()) {
X            // Get the descriptor associated to the given device/inode pair
X            // and remove the mapping from the required structure.
X            int fd = (*iter).second;
X            assert(devino_to_fd.find(cmd.ic_di) != devino_to_fd.end());
X            devino_to_fd.erase(cmd.ic_di);
X            assert(devino_to_fd.find(cmd.ic_di) == devino_to_fd.end());
X            assert(fd_to_devino.find(fd) != fd_to_devino.end());
X            fd_to_devino.erase(fd);
X            assert(fd_to_devino.find(fd) == fd_to_devino.end());
X
X            // Remove the entry associated to the descriptor from the list
X            // of changes monitored by kqueue.
X            int i;
X            for (i = 1; i < last_change; i++)
X                if (changes[i].ident == fd)
X                    break;
X            for (int j = i; j < last_change - 1; j++)
X                changes[j] = changes[j + 1];
X            last_change--;
X
X            close(fd);
X
X            result = true;
X        }
X    } else {
X        // Huh?  Unknown command received.
X        assert(false);
X    }
X
X    // Deliver the result of the operation.
X    write(cmd.ic_stat[1], &result, sizeof(bool));
X}
END-of-./files/IMonKQueue.c++
echo x - ./files/imon-compat.h
sed 's/^X//' >./files/imon-compat.h << 'END-of-./files/imon-compat.h'
X//  $NetBSD: imon-compat.h,v 1.1 2004/10/17 19:20:53 jmmv Exp $
X//
X//  Copyright (c) 2004 Julio M. Merino Vidal.
X//  
X//  This program is free software; you can redistribute it and/or modify it
X//  under the terms of version 2 of the GNU General Public License as
X//  published by the Free Software Foundation.
X//
X//  This program is distributed in the hope that it would be useful, but
X//  WITHOUT ANY WARRANTY; without even the implied warranty of
X//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  Further, any
X//  license provided herein, whether implied or otherwise, is limited to
X//  this program in accordance with the express provisions of the GNU
X//  General Public License.  Patent licenses, if any, provided herein do not
X//  apply to combinations of this program with other product or programs, or
X//  any other product whatsoever.  This program is distributed without any
X//  warranty that the program is delivered free of the rightful claim of any
X//  third person by way of infringement or the like.  See the GNU General
X//  Public License for more details.
X//
X//  You should have received a copy of the GNU General Public License along
X//  with this program; if not, write the Free Software Foundation, Inc., 59
X//  Temple Place - Suite 330, Boston MA 02111-1307, USA.
X
X#if !defined(IMON_COMPAT_H)
X#define IMON_COMPAT_H
X
X#if defined(HAVE_IMON)
X#  error "cannot include imon-compat.h if imon is really present"
X#endif
X
X#if defined(HAVE_KQUEUE)
X#define HAVE_IMON 1
X
Xtypedef int intmask_t;
X
Xtypedef struct {
X    dev_t qe_dev;
X    ino_t qe_inode;
X    intmask_t qe_what;
X} qelem_t;
X
X#define IMON_CONTENT    (1 << 0)
X#define IMON_ATTRIBUTE  (1 << 1)
X#define IMON_DELETE     (1 << 2)
X#define IMON_EXEC       (1 << 3)
X#define IMON_EXIT       (1 << 4)
X#define IMON_RENAME     (1 << 5)
X#define IMON_OVER       0xff
X
X#endif // defined(HAVE_KQUEUE)
X
X#endif // !defined(IMON_COMPAT_H)
END-of-./files/imon-compat.h
echo x - ./files/patch-src_Client.h
sed 's/^X//' >./files/patch-src_Client.h << 'END-of-./files/patch-src_Client.h'
X$NetBSD: patch-bb,v 1.1 2005/01/25 03:30:40 tv Exp $
X
X--- src/Client.h.orig	2003-01-18 09:18:12.000000000 -0500
X+++ src/Client.h
X@@ -25,6 +25,7 @@
X 
X #include <sys/types.h>
X #include <netinet/in.h>  // for in_addr
X+#include <arpa/inet.h>
X 
X #include "Activity.h"
X #include "Boolean.h"
END-of-./files/patch-src_Client.h
echo x - ./files/patch-lib_Client.c++
sed 's/^X//' >./files/patch-lib_Client.c++ << 'END-of-./files/patch-lib_Client.c++'
X$NetBSD: patch-ba,v 1.1 2005/01/25 03:30:40 tv Exp $
X
X--- lib/Client.c++.orig	2005-01-24 22:29:27.000000000 -0500
X+++ lib/Client.c++
X@@ -24,6 +24,7 @@
X #include <stdlib.h>
X #include <unistd.h>
X #include <netinet/in.h>
X+#include <arpa/inet.h>
X #include <sys/un.h>
X #include <sys/socket.h>
X #include <rpc/rpc.h>
END-of-./files/patch-lib_Client.c++
echo x - ./files/patch-src_NFSFileSystem.h
sed 's/^X//' >./files/patch-src_NFSFileSystem.h << 'END-of-./files/patch-src_NFSFileSystem.h'
X$NetBSD: patch-ay,v 1.1 2004/11/19 12:35:22 sketch Exp $
X
X--- src/NFSFileSystem.h.orig	2004-11-08 16:55:10.124688000 +0000
X+++ src/NFSFileSystem.h	2004-11-08 16:55:48.362013000 +0000
X@@ -39,7 +39,11 @@
X 
X public:
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    NFSFileSystem(const mnttab&);
X+#else
X     NFSFileSystem(const mntent&);
X+#endif
X     ~NFSFileSystem();
X 
X     virtual bool dir_entries_scanned() const;
END-of-./files/patch-src_NFSFileSystem.h
echo x - ./files/patch-src_LocalFileSystem.h
sed 's/^X//' >./files/patch-src_LocalFileSystem.h << 'END-of-./files/patch-src_LocalFileSystem.h'
X$NetBSD: patch-aw,v 1.5 2004/11/19 12:35:22 sketch Exp $
X
X--- src/LocalFileSystem.h.orig	2004-11-08 16:53:36.684849000 +0000
X+++ src/LocalFileSystem.h	2004-11-08 16:54:10.095510000 +0000
X@@ -38,7 +38,11 @@
X 
X public:
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    LocalFileSystem(const mnttab&);
X+#else
X     LocalFileSystem(const mntent&);
X+#endif
X 
X     virtual bool dir_entries_scanned() const;
X     virtual int get_attr_cache_timeout() const;
END-of-./files/patch-src_LocalFileSystem.h
echo x - ./files/patch-src_Makefile.in
sed 's/^X//' >./files/patch-src_Makefile.in << 'END-of-./files/patch-src_Makefile.in'
X$NetBSD: patch-au,v 1.5 2004/03/28 22:00:05 minskim Exp $
X
X--- src/Makefile.in.orig	2003-01-19 18:38:44.000000000 -0600
X+++ src/Makefile.in
X@@ -161,6 +161,7 @@ famd_SOURCES = \
X   main.c++ \
X   timeval.c++ \
X   timeval.h \
X+  mntent_compat.c++ \
X   @MONITOR_FUNCS@.c++
X 
X 
X@@ -185,6 +186,7 @@ am_famd_OBJECTS = Activity.$(OBJEXT) Cli
X 	Scheduler.$(OBJEXT) ServerConnection.$(OBJEXT) \
X 	ServerHost.$(OBJEXT) ServerHostRef.$(OBJEXT) \
X 	TCP_Client.$(OBJEXT) main.$(OBJEXT) timeval.$(OBJEXT) \
X+	mntent_compat.$(OBJEXT) \
X 	@MONITOR_FUNCS@.$(OBJEXT)
X famd_OBJECTS = $(am_famd_OBJECTS)
X famd_LDADD = $(LDADD)
END-of-./files/patch-src_Makefile.in
echo x - ./files/patch-configure
sed 's/^X//' >./files/patch-configure << 'END-of-./files/patch-configure'
X--- configure.orig	Wed Nov 26 20:47:26 2003
X+++ configure	Mon Mar 21 06:51:51 2005
X@@ -1,6 +1,6 @@
X #! /bin/sh
X # Guess values for system-dependent variables and create Makefiles.
X-# Generated by GNU Autoconf 2.57 for fam 2.7.0-pre1.
X+# Generated by GNU Autoconf 2.57 for fam 2.7.0.
X #
X # Report bugs to <fam@oss.sgi.com>.
X #
X@@ -1128,7 +1128,7 @@
X This file contains any messages produced by compilers while
X running configure, to aid debugging if configure makes a mistake.
X 
X-It was created by fam $as_me 2.7.0-pre1, which was
X+It was created by fam $as_me 2.7.0, which was
X generated by GNU Autoconf 2.57.  Invocation command line was
X 
X   $ $0 $@
X@@ -9053,7 +9053,9 @@
X 
X 
X 
X-for ac_header in fcntl.h limits.h linux/imon.h netinet/in.h rpc/rpc.h rpcsvc/mount.h stddef.h stdlib.h string.h syslog.h sys/imon.h sys/param.h sys/select.h sys/statvfs.h sys/syssgi.h sys/time.h sys/types.h sys/un.h unistd.h
X+
X+
X+for ac_header in fcntl.h limits.h linux/imon.h netinet/in.h rpc/rpc.h rpc/rpcent.h rpcsvc/mount.h stddef.h stdlib.h string.h syslog.h sys/filio.h sys/imon.h sys/param.h sys/select.h sys/syssgi.h sys/time.h sys/types.h sys/un.h unistd.h mntent.h sys/mnttab.h sys/sysmacros.h
X do
X as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
X if eval "test \"\${$as_ac_Header+set}\" = set"; then
X@@ -9833,7 +9835,8 @@
X cat confdefs.h >>conftest.$ac_ext
X cat >>conftest.$ac_ext <<_ACEOF
X /* end confdefs.h.  */
X-$ac_includes_default
X+#include <sys/socket.h>
X+
X int
X main ()
X {
X@@ -9868,7 +9871,8 @@
X cat confdefs.h >>conftest.$ac_ext
X cat >>conftest.$ac_ext <<_ACEOF
X /* end confdefs.h.  */
X-$ac_includes_default
X+#include <sys/socket.h>
X+
X int
X main ()
X {
X@@ -9910,7 +9914,103 @@
X #define HAVE_STRUCT_SOCKADDR_SA_LEN 1
X _ACEOF
X 
X-struct sockaddr_un.sun_len
X+
X+fi
X+
X+echo "$as_me:$LINENO: checking for struct sockaddr_un.sun_len" >&5
X+echo $ECHO_N "checking for struct sockaddr_un.sun_len... $ECHO_C" >&6
X+if test "${ac_cv_member_struct_sockaddr_un_sun_len+set}" = set; then
X+  echo $ECHO_N "(cached) $ECHO_C" >&6
X+else
X+  cat >conftest.$ac_ext <<_ACEOF
X+#line $LINENO "configure"
X+/* confdefs.h.  */
X+_ACEOF
X+cat confdefs.h >>conftest.$ac_ext
X+cat >>conftest.$ac_ext <<_ACEOF
X+/* end confdefs.h.  */
X+#include <sys/types.h>
X+#include <sys/un.h>
X+
X+int
X+main ()
X+{
X+static struct sockaddr_un ac_aggr;
X+if (ac_aggr.sun_len)
X+return 0;
X+  ;
X+  return 0;
X+}
X+_ACEOF
X+rm -f conftest.$ac_objext
X+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
X+  (eval $ac_compile) 2>&5
X+  ac_status=$?
X+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
X+  (exit $ac_status); } &&
X+         { ac_try='test -s conftest.$ac_objext'
X+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
X+  (eval $ac_try) 2>&5
X+  ac_status=$?
X+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
X+  (exit $ac_status); }; }; then
X+  ac_cv_member_struct_sockaddr_un_sun_len=yes
X+else
X+  echo "$as_me: failed program was:" >&5
X+sed 's/^/| /' conftest.$ac_ext >&5
X+
X+cat >conftest.$ac_ext <<_ACEOF
X+#line $LINENO "configure"
X+/* confdefs.h.  */
X+_ACEOF
X+cat confdefs.h >>conftest.$ac_ext
X+cat >>conftest.$ac_ext <<_ACEOF
X+/* end confdefs.h.  */
X+#include <sys/types.h>
X+#include <sys/un.h>
X+
X+int
X+main ()
X+{
X+static struct sockaddr_un ac_aggr;
X+if (sizeof ac_aggr.sun_len)
X+return 0;
X+  ;
X+  return 0;
X+}
X+_ACEOF
X+rm -f conftest.$ac_objext
X+if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5
X+  (eval $ac_compile) 2>&5
X+  ac_status=$?
X+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
X+  (exit $ac_status); } &&
X+         { ac_try='test -s conftest.$ac_objext'
X+  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
X+  (eval $ac_try) 2>&5
X+  ac_status=$?
X+  echo "$as_me:$LINENO: \$? = $ac_status" >&5
X+  (exit $ac_status); }; }; then
X+  ac_cv_member_struct_sockaddr_un_sun_len=yes
X+else
X+  echo "$as_me: failed program was:" >&5
X+sed 's/^/| /' conftest.$ac_ext >&5
X+
X+ac_cv_member_struct_sockaddr_un_sun_len=no
X+fi
X+rm -f conftest.$ac_objext conftest.$ac_ext
X+fi
X+rm -f conftest.$ac_objext conftest.$ac_ext
X+fi
X+echo "$as_me:$LINENO: result: $ac_cv_member_struct_sockaddr_un_sun_len" >&5
X+echo "${ECHO_T}$ac_cv_member_struct_sockaddr_un_sun_len" >&6
X+if test $ac_cv_member_struct_sockaddr_un_sun_len = yes; then
X+
X+cat >>confdefs.h <<_ACEOF
X+#define HAVE_STRUCT_SOCKADDR_UN_SUN_LEN 1
X+_ACEOF
X+
X+
X fi
X 
X 
X@@ -10193,7 +10293,7 @@
X 
X 
X 
X-for ac_func in bindresvport _daemonize daemon getgrmember select
X+for ac_func in bindresvport _daemonize daemon getgrmember select unsetenv
X do
X as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
X echo "$as_me:$LINENO: checking for $ac_func" >&5
X@@ -10646,7 +10746,7 @@
X } >&5
X cat >&5 <<_CSEOF
X 
X-This file was extended by fam $as_me 2.7.0-pre1, which was
X+This file was extended by fam $as_me 2.7.0, which was
X generated by GNU Autoconf 2.57.  Invocation command line was
X 
X   CONFIG_FILES    = $CONFIG_FILES
END-of-./files/patch-configure
echo x - ./files/patch-src_NetConnection.c++
sed 's/^X//' >./files/patch-src_NetConnection.c++ << 'END-of-./files/patch-src_NetConnection.c++'
X$NetBSD: patch-at,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/NetConnection.h.orig	2004-11-08 14:44:19.318981000 +0000
X+++ src/NetConnection.h	2004-11-08 14:44:42.403907000 +0000
X@@ -68,6 +68,8 @@
X     void ready_for_input(bool);
X     int get_fd() const { return fd; }
X 
X+    enum { MAXMSGSIZE = PATH_MAX + 40 };
X+
X protected:
X 
X     virtual bool input_msg(const char *data, unsigned nbytes) = 0;
X@@ -75,7 +77,6 @@
X 
X private:
X 
X-    enum { MAXMSGSIZE = PATH_MAX + 40 };
X     typedef u_int32_t Length;
X     typedef struct msgList_s {
X         char msg[MAXMSGSIZE+5];  //  + 4 for 32-bit length, + 1 for overflow
END-of-./files/patch-src_NetConnection.c++
echo x - ./files/patch-src_mntent_compat.c++
sed 's/^X//' >./files/patch-src_mntent_compat.c++ << 'END-of-./files/patch-src_mntent_compat.c++'
X$NetBSD: patch-ap,v 1.8 2004/11/19 12:35:22 sketch Exp $
X
X--- src/mntent_compat.c++.orig	2004-04-30 14:24:58.000000000 +0200
X+++ src/mntent_compat.c++	2004-04-30 14:28:45.000000000 +0200
X@@ -0,0 +1,191 @@
X+/*
X+ * Copyright (c) 1980, 1989, 1993, 1994
X+ *      The Regents of the University of California.  All rights reserved.
X+ * Copyright (c) 2001
X+ *      David Rufino <daverufino@btinternet.com>
X+ *
X+ * Redistribution and use in source and binary forms, with or without
X+ * modification, are permitted provided that the following conditions
X+ * are met:
X+ * 1. Redistributions of source code must retain the above copyright
X+ *    notice, this list of conditions and the following disclaimer.
X+ * 2. Redistributions in binary form must reproduce the above copyright
X+ *    notice, this list of conditions and the following disclaimer in the
X+ *    documentation and/or other materials provided with the distribution.
X+ * 3. All advertising materials mentioning features or use of this software
X+ *    must display the following acknowledgement:
X+ *      This product includes software developed by the University of
X+ *      California, Berkeley and its contributors.
X+ * 4. Neither the name of the University nor the names of its contributors
X+ *    may be used to endorse or promote products derived from this software
X+ *    without specific prior written permission.
X+ *
X+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X+ * SUCH DAMAGE.
X+ */
X+
X+/* most of this was ripped from the mount(3) source */
X+
X+#include "config.h"
X+#include "fam-mntent.h"
X+#if !defined(HAVE_MNTENT_H) && !defined(HAVE_SYS_MNTTAB_H)
X+#include <stdlib.h>
X+#include <string.h>
X+#include <sys/param.h>
X+#include <sys/ucred.h>
X+#include <sys/mount.h>
X+#ifdef HAVE_SYS_STATVFS_H
X+# include <sys/statvfs.h>
X+#endif
X+
X+static int pos = -1;
X+static int mntsize = -1;
X+static struct mntent _mntent;
X+
X+char *
X+hasmntopt (const struct mntent *mnt, const char *option)
X+{
X+        int found;
X+        char *opt, *optbuf;
X+
X+        optbuf = strdup(mnt->mnt_opts);
X+        found = 0;
X+        for (opt = optbuf; (opt = strtok(opt, " ")) != NULL; opt = NULL) {
X+                if (!strcasecmp(opt, option)) {
X+			opt = opt - optbuf + mnt->mnt_opts;
X+			free (optbuf);
X+			return (opt);
X+		}
X+        }
X+	free (optbuf);
X+        return (NULL);
X+}
X+
X+static char *
X+catopt (char *s0, const char *s1)
X+{
X+        size_t i;
X+        char *cp;
X+
X+        if (s1 == NULL || *s1 == '\0')
X+                return s0;
X+        if (s0 && *s0) {
X+                i = strlen(s0) + strlen(s1) + 1 + 1;
X+                if ((cp = (char *)malloc(i)) == NULL)
X+			return (NULL);
X+                (void)snprintf(cp, i, "%s %s", s0, s1);
X+        } else
X+                cp = strdup(s1);
X+
X+        if (s0)
X+                free(s0);
X+        return (cp);
X+}
X+
X+
X+static char *
X+flags2opts (int flags)
X+{
X+        char *res;
X+        res = NULL;
X+        res = catopt(res, (flags & MNT_RDONLY) ? "ro" : "rw");
X+        if (flags & MNT_SYNCHRONOUS)    res = catopt(res, "sync");
X+        if (flags & MNT_NOEXEC)         res = catopt(res, "noexec");
X+        if (flags & MNT_NOSUID)         res = catopt(res, "nosuid");
X+        if (flags & MNT_NODEV)          res = catopt(res, "nodev");
X+        if (flags & MNT_UNION)          res = catopt(res, "union");
X+        if (flags & MNT_ASYNC)          res = catopt(res, "async");
X+#ifdef MNT_NOATIME
X+        if (flags & MNT_NOATIME)        res = catopt(res, "noatime");
X+#endif
X+#ifdef MNT_NOCLUSTERR
X+        if (flags & MNT_NOCLUSTERR)     res = catopt(res, "noclusterr");
X+#endif
X+#ifdef MNT_NOCLUSTERW
X+        if (flags & MNT_NOCLUSTERW)     res = catopt(res, "noclusterw");
X+#endif
X+#ifdef MNT_NOSYMFOLLOW
X+        if (flags & MNT_NOSYMFOLLOW)    res = catopt(res, "nosymfollow");
X+#endif
X+#ifdef MNT_SUIDDIR
X+        if (flags & MNT_SUIDDIR)        res = catopt(res, "suiddir");
X+#endif
X+#ifdef MNT_NOCOREDUMP
X+        if (flags & MNT_NOCOREDUMP)	res = catopt(res, "nocoredump");
X+#endif
X+#ifdef MNT_IGNORE
X+        if (flags & MNT_IGNORE)		res = catopt(res, "hidden");
X+#endif
X+#ifdef MNT_SYMPERM
X+        if (flags & MNT_SYMPERM)	res = catopt(res, "symperm");
X+#endif
X+#ifdef MNT_NODEVMTIME
X+        if (flags & MNT_NODEVMTIME)	res = catopt(res, "nodevmtime");
X+#endif
X+#ifdef MNT_SOFTDEP
X+        if (flags & MNT_SOFTDEP)	res = catopt(res, "softdep");
X+#endif
X+
X+        return res;
X+}
X+
X+static struct mntent *
X+#ifdef HAVE_SYS_STATVFS_H
X+statfs_to_mntent (struct statvfs *mntbuf)
X+#else
X+statfs_to_mntent (struct statfs *mntbuf)
X+#endif
X+{
X+	static char opts_buf[40], *tmp;
X+	
X+	_mntent.mnt_fsname = mntbuf->f_mntfromname;
X+	_mntent.mnt_dir = mntbuf->f_mntonname;
X+	_mntent.mnt_type = mntbuf->f_fstypename;
X+#ifdef HAVE_SYS_STATVFS_H
X+	tmp = flags2opts (mntbuf->f_flag);
X+#else
X+	tmp = flags2opts (mntbuf->f_flags);
X+#endif
X+	if (tmp) {
X+		opts_buf[sizeof(opts_buf)-1] = '\0';
X+		strncpy (opts_buf, tmp, sizeof(opts_buf)-1);
X+		free (tmp);
X+	} else {
X+		*opts_buf = '\0';
X+	}
X+	_mntent.mnt_opts = opts_buf;	
X+	_mntent.mnt_freq = _mntent.mnt_passno = 0;
X+	return (&_mntent);
X+}
X+
X+struct mntent *
X+getmntent (FILE *fp)
X+{
X+#ifdef HAVE_SYS_STATVFS_H
X+	static struct statvfs *mntbuf;
X+#else
X+	static struct statfs *mntbuf;
X+#endif
X+
X+	if (pos == -1 || mntsize == -1)
X+		mntsize = getmntinfo (&mntbuf, MNT_NOWAIT);
X+
X+	++pos;
X+	if (pos == mntsize) {
X+		pos = mntsize = -1;
X+		return (NULL);
X+	}
X+
X+	return (statfs_to_mntent (&mntbuf[pos]));
X+}
X+
X+#endif /* HAVE_MNTENT_H */
END-of-./files/patch-src_mntent_compat.c++
echo x - ./files/patch-src_Scheduler.h
sed 's/^X//' >./files/patch-src_Scheduler.h << 'END-of-./files/patch-src_Scheduler.h'
X$NetBSD: patch-an,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/Scheduler.h.orig	2004-11-08 14:42:30.148229000 +0000
X+++ src/Scheduler.h	2004-11-08 14:43:04.014844000 +0000
X@@ -88,8 +88,6 @@
X     static void loop()			{ running = true;
X 					  while (running) select(); }
X 
X-private:
X-
X     //  Per-filedescriptor info is the set of three handlers and their
X     //  closures.
X 
END-of-./files/patch-src_Scheduler.h
echo x - ./files/patch-include_BTree.h
sed 's/^X//' >./files/patch-include_BTree.h << 'END-of-./files/patch-include_BTree.h'
X$NetBSD: patch-al,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- include/BTree.h.orig	2004-11-08 14:39:58.687960000 +0000
X+++ include/BTree.h	2004-11-08 14:40:32.481144000 +0000
X@@ -76,8 +76,6 @@
X 
X     static unsigned sizeofnode()	{ return sizeof (Node); }
X 
X-private:
X-
X     enum { fanout = 32 };
X     enum Status { OK, NO, OVER, UNDER };
X 
END-of-./files/patch-include_BTree.h
echo x - ./files/patch-src_Listener.c++
sed 's/^X//' >./files/patch-src_Listener.c++ << 'END-of-./files/patch-src_Listener.c++'
X$NetBSD: patch-aj,v 1.6 2004/04/18 17:11:08 jmmv Exp $
X
X--- src/Listener.c++.orig	2003-01-20 01:37:29.000000000 +0100
X+++ src/Listener.c++
X@@ -22,6 +22,8 @@
X 
X #include "Listener.h"
X 
X+#include <stdio.h>
X+#include <stdlib.h>
X #include <assert.h>
X #include <fcntl.h>
X #include <sys/types.h>
X@@ -32,6 +34,7 @@
X #include <rpc/clnt.h>
X #include <sys/ioctl.h>
X #include <sys/socket.h>
X+#include <sys/param.h>
X #include <sys/stat.h>
X #include <sys/un.h>
X #include <unistd.h>
X@@ -205,11 +208,11 @@ Listener::create_local_client(TCP_Client
X #ifdef HAVE_UNSETENV
X     unsetenv("TMPDIR");
X #else
X-    putenv("TMPDIR=");
X+    putenv("TMPDIR=/tmp");
X #endif
X 
X     char *tmpfile = tempnam("/tmp", ".fam");
X-#ifdef HAVE_SOCKADDR_SUN_LEN
X+#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
X     sockaddr_un sun = { sizeof(sockaddr_un), AF_UNIX, "" };
X #else
X     sockaddr_un sun = { AF_UNIX, "" };
X@@ -283,7 +286,7 @@ Listener::accept_localclient(int ofd, vo
X 
X     // Get the new socket.
X 
X-#ifdef HAVE_SOCKADDR_SUN_LEN
X+#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
X     struct sockaddr_un sun = { sizeof(sockaddr_un), AF_UNIX, "" };
X #else
X     struct sockaddr_un sun = { AF_UNIX, "" };
X@@ -349,7 +352,7 @@ Listener::accept_localclient(int ofd, vo
X void
X Listener::dirty_ugly_hack()
X {
X-#ifdef HAVE_SOCKADDR_SUN_LEN
X+#ifdef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
X     static sockaddr_un sun = { sizeof (sockaddr_un), AF_UNIX, "/tmp/.fam_socket" };
X #else
X     static sockaddr_un sun = { AF_UNIX, "/tmp/.fam_socket" };
END-of-./files/patch-src_Listener.c++
echo x - ./files/patch-src_Log.c++
sed 's/^X//' >./files/patch-src_Log.c++ << 'END-of-./files/patch-src_Log.c++'
X$NetBSD: patch-ak,v 1.5 2004/04/14 20:53:08 adam Exp $
X
X--- src/Log.c++.orig	Wed Apr 14 22:44:49 2004
X+++ src/Log.c++
X@@ -28,9 +28,9 @@
X #include <stdlib.h>
X #include <string.h>
X #include <syslog.h>
X+#include <sys/time.h>
X #include <sys/resource.h>
X #include <sys/stat.h>
X-#include <sys/time.h>
X #include <sys/types.h>
X #include <unistd.h>
X #ifdef HAVE_AUDIT
END-of-./files/patch-src_Log.c++
echo x - ./files/patch-src_IMon.c++
sed 's/^X//' >./files/patch-src_IMon.c++ << 'END-of-./files/patch-src_IMon.c++'
X$NetBSD: patch-ag,v 1.6 2004/11/19 12:35:22 sketch Exp $
X
X--- src/IMon.c++.orig	2003-01-18 14:18:12.000000000 +0000
X+++ src/IMon.c++	2004-11-08 14:00:46.523526000 +0000
X@@ -25,6 +25,7 @@
X #include <assert.h>
X #include <errno.h>
X #include <fcntl.h>
X+#include <sys/param.h>
X 
X #if HAVE_IMON
X #ifdef __sgi
X@@ -32,15 +33,18 @@
X #else
X #include <linux/imon.h>
X #endif
X+#else // HAVE_IMON
X+#include "imon-compat.h"
X #endif
X 
X+#if HAVE_SYS_SYSMACROS_H
X #include <sys/sysmacros.h>
X+#endif
X #include <unistd.h>
X 
X #include "Interest.h"
X #include "Log.h"
X #include "Scheduler.h"
X-#include "alloc.h"
X 
X int		   IMon::imonfd = -2;
X IMon::EventHandler IMon::ehandler = NULL;
END-of-./files/patch-src_IMon.c++
echo x - ./files/patch-src_Interest.c++
sed 's/^X//' >./files/patch-src_Interest.c++ << 'END-of-./files/patch-src_Interest.c++'
X$NetBSD: patch-ah,v 1.5 2004/11/19 12:35:22 sketch Exp $
X
X--- src/Interest.c++.orig	2003-01-18 08:18:12.000000000 -0600
X+++ src/Interest.c++
X@@ -23,7 +23,9 @@
X #include "Interest.h"
X 
X #include <sys/param.h>
X+#if HAVE_SYS_SYSMACROS_H
X #include <sys/sysmacros.h>
X+#endif
X 
X #include <errno.h>
X #include <string.h>
X@@ -46,7 +48,7 @@
X #include "Pollster.h"
X #include "timeval.h"
X 
X-Interest *Interest::hashtable[];
X+Interest *Interest::hashtable[HASHSIZE];
X IMon      Interest::imon(imon_handler);
X bool      Interest::xtab_verification = true;
X 
END-of-./files/patch-src_Interest.c++
echo x - ./files/patch-src_FileSystem.c++
sed 's/^X//' >./files/patch-src_FileSystem.c++ << 'END-of-./files/patch-src_FileSystem.c++'
X$NetBSD: patch-ae,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/FileSystem.c++.orig	2003-01-18 14:18:12.000000000 +0000
X+++ src/FileSystem.c++	2004-11-08 15:39:34.558377000 +0000
X@@ -22,14 +22,20 @@
X 
X #include "FileSystem.h"
X 
X-#include <mntent.h>
X+#include "fam-mntent.h"
X #include <string.h>
X 
X #include "Event.h"
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+FileSystem::FileSystem(const mnttab& mnt)
X+    : mydir   (strcpy(new char[strlen(mnt.mnt_mountp) + 1], mnt.mnt_mountp)),
X+      myfsname(strcpy(new char[strlen(mnt.mnt_special) + 1], mnt.mnt_special))
X+#else
X FileSystem::FileSystem(const mntent& mnt)
X     : mydir   (strcpy(new char[strlen(mnt.mnt_dir   ) + 1], mnt.mnt_dir   )),
X       myfsname(strcpy(new char[strlen(mnt.mnt_fsname) + 1], mnt.mnt_fsname))
X+#endif
X { }
X 
X FileSystem::~FileSystem()
X@@ -40,9 +46,15 @@
X }
X 
X bool
X+#if defined(HAVE_SYS_MNTTAB_H)
X+FileSystem::matches(const mnttab& mnt) const
X+{
X+    return !strcmp(mydir, mnt.mnt_mountp) && !strcmp(myfsname, mnt.mnt_special);
X+#else
X FileSystem::matches(const mntent& mnt) const
X {
X     return !strcmp(mydir, mnt.mnt_dir) && !strcmp(myfsname, mnt.mnt_fsname);
X+#endif
X }
X 
X void
END-of-./files/patch-src_FileSystem.c++
echo x - ./files/patch-config.h.in
sed 's/^X//' >./files/patch-config.h.in << 'END-of-./files/patch-config.h.in'
X$NetBSD: patch-ab,v 1.6 2005/03/14 22:40:09 tv Exp $
X
X--- config.h.in.orig	2003-01-19 18:40:15.000000000 -0600
X+++ config.h.in
X@@ -49,9 +49,15 @@
X /* Define to 1 if you have the <rpc/rpc.h> header file. */
X #undef HAVE_RPC_RPC_H
X 
X+/* Define to 1 if you have the <rpc/rpcent.h> header file. */
X+#undef HAVE_RPC_RPCENT_H
X+
X /* Define to 1 if you have the `select' function. */
X #undef HAVE_SELECT
X 
X+/* Define to 1 if you have the `unsetenv' function. */
X+#undef HAVE_UNSETENV
X+
X /* Define to 1 if the system has the type `socklen_t'. */
X #undef HAVE_SOCKLEN_T
X 
X@@ -76,6 +82,9 @@
X /* Define to 1 if `sa_len' is member of `struct sockaddr'. */
X #undef HAVE_STRUCT_SOCKADDR_SA_LEN
X 
X+/* Define to 1 if `sun_len' is member of `struct sockaddr_un'. */
X+#undef HAVE_STRUCT_SOCKADDR_UN_SUN_LEN
X+
X /* Define to 1 if you have the <syslog.h> header file. */
X #undef HAVE_SYSLOG_H
X 
X@@ -83,6 +92,9 @@
X    */
X #undef HAVE_SYS_DIR_H
X 
X+/* Define to 1 if you have the <sys/filio.h> header file. */
X+#undef HAVE_SYS_FILIO_H
X+
X /* Define to 1 if you have the <sys/imon.h> header file. */
X #undef HAVE_SYS_IMON_H
X 
X@@ -120,6 +132,15 @@
X /* Define to 1 if you have the <unistd.h> header file. */
X #undef HAVE_UNISTD_H
X 
X+/* Define to 1 if you have the <mntent.h> header file. */
X+#undef HAVE_MNTENT_H
X+
X+/* Define to 1 if you have the <sys/mnttab.h> header file. */
X+#undef HAVE_SYS_MNTTAB_H
X+
X+/* Define to 1 if you have the <sys/sysmacros.h> header file. */
X+#undef HAVE_SYS_SYSMACROS_H
X+
X /* Define to 1 if the system has the type `_Bool'. */
X #undef HAVE__BOOL
X 
X@@ -180,3 +201,9 @@
X 
X /* Define to `int' if <sys/types.h> doesn't define. */
X #undef uid_t
X+
X+/* Use standard POSIX type if BSD type is not available */
X+#if !defined(u_int32_t) && defined(HAVE_INTTYPES_H)
X+#include <inttypes.h>
X+typedef uint32_t u_int32_t;
X+#endif
END-of-./files/patch-config.h.in
echo x - ./files/patch-src_FileSystemTable.c++
sed 's/^X//' >./files/patch-src_FileSystemTable.c++ << 'END-of-./files/patch-src_FileSystemTable.c++'
X$NetBSD: patch-af,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/FileSystemTable.c++.orig	2003-01-18 14:18:12.000000000 +0000
X+++ src/FileSystemTable.c++	2004-11-08 17:08:21.655221000 +0000
X@@ -21,11 +21,13 @@
X //  Temple Place - Suite 330, Boston MA 02111-1307, USA.
X 
X #include <stddef.h>
X+#include <stdio.h>
X #include "FileSystemTable.h"
X 
X-#include <mntent.h>
X+#include "fam-mntent.h"
X #include <stdlib.h>
X #include <string.h>
X+#include <sys/param.h>
X 
X #if HAVE_STATVFS
X #include <sys/statvfs.h>
X@@ -106,7 +108,11 @@
X 
X     //  Read /etc/mtab.
X     Cred::SuperUser.become_user();
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    FILE *mtab = fopen(mtab_name, "r");
X+#else
X     FILE *mtab = setmntent(mtab_name, "r");
X+#endif
X     if(mtab == NULL)
X     {
X         Log::error("couldn't open %s for reading", mtab_name);
X@@ -114,40 +120,86 @@
X         return;
X     }
X     root = NULL;
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    resetmnttab(mtab);
X+    int ret = 0;
X+    do
X+#else
X     for (mntent *mp; ((mp = getmntent(mtab)) != NULL); )
X+#endif
X     {
X+#if defined(HAVE_SYS_MNTTAB_H)
X+	struct mnttab ment, *mp;
X+	mp = &ment;
X+	ret = getmntent(mtab, mp);
X+	FileSystem *fs = fs_by_name ? fs_by_name->find(mp->mnt_mountp) : NULL;
X+#else
X 	FileSystem *fs = fs_by_name ? fs_by_name->find(mp->mnt_dir) : NULL;
X+#endif
X 	if (fs && fs->matches(*mp))
X 	{
X 	    Log::debug("mtab: MATCH     \"%s\" on \"%s\" using type <%s>",
X+#if defined(HAVE_SYS_MNTTAB_H)
X+		       mp->mnt_special, mp->mnt_mountp, mp->mnt_fstype);
X+
X+	    new_fs_by_name->insert(mp->mnt_mountp, fs);
X+	    if (dismounted_fses.find(mp->mnt_mountp))
X+		dismounted_fses.remove(mp->mnt_mountp);
X+#else
X 		       mp->mnt_fsname, mp->mnt_dir, mp->mnt_type);
X 
X 	    new_fs_by_name->insert(mp->mnt_dir, fs);
X 	    if (dismounted_fses.find(mp->mnt_dir))
X 		dismounted_fses.remove(mp->mnt_dir);
X+#endif
X 	}
X 	else
X 	{
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+            if ((!strcmp(mp->mnt_fstype, MNTTYPE_NFS)
X+#else
X             if ((!strcmp(mp->mnt_type, MNTTYPE_NFS)
X+#endif
X #if HAVE_MNTTYPE_NFS2
X+#if defined(HAVE_SYS_MNTTAB_H)
X+                || !strcmp(mp->mnt_fstype, MNTTYPE_NFS2)
X+#else
X                 || !strcmp(mp->mnt_type, MNTTYPE_NFS2)
X #endif
X+#endif
X #if HAVE_MNTTYPE_NFS3
X+#if defined(HAVE_SYS_MNTTAB_H)
X+                || !strcmp(mp->mnt_fstype, MNTTYPE_NFS3)
X+#else
X                 || !strcmp(mp->mnt_type, MNTTYPE_NFS3)
X #endif
X+#endif
X #if HAVE_MNTTYPE_CACHEFS
X+#if defined(HAVE_SYS_MNTTAB_H)
X+                || !strcmp(mp->mnt_fstype, MNTTYPE_CACHEFS)
X+#else
X                 || !strcmp(mp->mnt_type, MNTTYPE_CACHEFS)
X #endif
X+#endif
X+#if defined(HAVE_SYS_MNTTAB_H)
X+                ) && strchr(mp->mnt_special, ':'))
X+#else
X                 ) && strchr(mp->mnt_fsname, ':'))
X+#endif
X             {
X                 if(Log::get_level() == Log::DEBUG)
X                 {
X                     const char *mntopt = hasmntopt(mp, "dev");
X                     if(mntopt == NULL) mntopt = "";
X 		    Log::debug("mtab: new NFS   \"%s\" on \"%s\" %s using <%s>",
X+#if defined(HAVE_SYS_MNTTAB_H)
X+			       mp->mnt_special, mp->mnt_mountp, mntopt,
X+                               mp->mnt_fstype);
X+#else
X 			       mp->mnt_fsname, mp->mnt_dir, mntopt,
X                                mp->mnt_type);
X+#endif
X                 }
X 
X 		fs = new NFSFileSystem(*mp);
X@@ -155,24 +207,45 @@
X 	    else
X 	    {
X 		Log::debug("mtab: new local \"%s\" on \"%s\"",
X+#if defined(HAVE_SYS_MNTTAB_H)
X+			   mp->mnt_special, mp->mnt_mountp);
X+#else
X 			   mp->mnt_fsname, mp->mnt_dir);
X+#endif
X 
X 		fs = new LocalFileSystem(*mp);
X 	    }
X+#if defined(HAVE_SYS_MNTTAB_H)
X+	    new_fs_by_name->insert(mp->mnt_mountp, fs);
X+#else
X 	    new_fs_by_name->insert(mp->mnt_dir, fs);
X+#endif
X 	    if (fs_by_name)
X 	    {
X 		// Find parent filesystem.
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+		FileSystem *parent = longest_prefix(mp->mnt_mountp);
X+#else
X 		FileSystem *parent = longest_prefix(mp->mnt_dir);
X+#endif
X 		assert(parent);
X 		mount_parents.insert(parent->dir(), parent);
X 	    }
X 	}
X+#if defined(HAVE_SYS_MNTTAB_H)
X+	if (!strcmp(mp->mnt_mountp, "/"))
X+#else
X 	if (!strcmp(mp->mnt_dir, "/"))
X+#endif
X 	    root = fs;
X     }
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    while (ret != -1);
X+    fclose(mtab);
X+#else
X     endmntent(mtab);
X+#endif
X 
X     if(root == NULL)
X     {
X@@ -255,7 +328,10 @@
X     //  create_fs_by_name initializes our "root" member variable.
X     if (!fs_by_name)
X     {   create_fs_by_name();
X+#if !defined(BSD)
X+        /* there is no mtab "file" in BSD */
X 	mtab_watcher = new InternalClient(mtab_name, mtab_event_handler, NULL);
X+#endif
X     }
X 
X     cr.become_user();
END-of-./files/patch-src_FileSystemTable.c++
echo x - ./files/patch-lib_fam.c++
sed 's/^X//' >./files/patch-lib_fam.c++ << 'END-of-./files/patch-lib_fam.c++'
X$NetBSD: patch-am,v 1.6 2005/03/01 23:06:55 dmcmahill Exp $
X
X--- lib/fam.c++.orig	2003-01-18 08:18:12.000000000 -0600
X+++ lib/fam.c++
X@@ -20,8 +20,12 @@
X //  with this program; if not, write the Free Software Foundation, Inc., 59
X //  Temple Place - Suite 330, Boston MA 02111-1307, USA.
X 
X+#include "config.h"
X #include <sys/types.h>
X #include <rpc/rpc.h>
X+#ifdef HAVE_RPC_RPCENT_H
X+#include <rpc/rpcent.h>
X+#endif
X #include <sys/time.h>
X #include <unistd.h>
X #include <stdlib.h>
END-of-./files/patch-lib_fam.c++
echo x - ./files/patch-conf_Makefile.in
sed 's/^X//' >./files/patch-conf_Makefile.in << 'END-of-./files/patch-conf_Makefile.in'
X$NetBSD: patch-ac,v 1.4 2004/03/28 22:01:54 minskim Exp $
X
X--- conf/Makefile.in.orig	2004-03-21 12:13:33.000000000 -0600
X+++ conf/Makefile.in
X@@ -25,7 +25,7 @@ bindir = @bindir@
X sbindir = @sbindir@
X libexecdir = @libexecdir@
X datadir = @datadir@
X-sysconfdir = @sysconfdir@
X+sysconfdir = @datadir@/examples/@PACKAGE@
X sharedstatedir = @sharedstatedir@
X localstatedir = @localstatedir@
X libdir = @libdir@
END-of-./files/patch-conf_Makefile.in
echo x - ./files/patch-src_NFSFileSystem.c++
sed 's/^X//' >./files/patch-src_NFSFileSystem.c++ << 'END-of-./files/patch-src_NFSFileSystem.c++'
X$NetBSD: patch-ad,v 1.5 2004/11/19 12:35:22 sketch Exp $
X
X--- src/NFSFileSystem.c++.orig	2003-01-18 14:18:12.000000000 +0000
X+++ src/NFSFileSystem.c++	2004-11-08 17:31:41.663685000 +0000
X@@ -24,7 +24,7 @@
X #include "NFSFileSystem.h"
X 
X #include <assert.h>
X-#include <mntent.h>
X+#include "fam-mntent.h"
X #include <stdlib.h>
X #include <stdio.h>
X #include <string.h>
X@@ -41,12 +41,20 @@
X #define ACREGMIN 3
X #endif
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+NFSFileSystem::NFSFileSystem(const mnttab& mnt)
X+#else
X NFSFileSystem::NFSFileSystem(const mntent& mnt)
X+#endif
X     : FileSystem(mnt)
X {
X     //  Extract the host name from the fs name.
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    const char *fsname = mnt.mnt_special;
X+#else
X     const char *fsname = mnt.mnt_fsname;
X+#endif
X     const char *colon = strchr(fsname, ':');
X     if(colon == NULL)
X     {
X@@ -55,12 +63,12 @@
X         assert(colon);
X         colon = fsname;
X     }
X-    char hostname[NAME_MAX + 1];
X+    char hostname[MAXPATHLEN + 1];
X     int hostnamelen = colon - fsname;
X-    if(hostnamelen > NAME_MAX)
X+    if(hostnamelen > MAXPATHLEN)
X     {
X-        assert(hostnamelen <= NAME_MAX);
X-        hostnamelen = NAME_MAX;
X+        assert(hostnamelen <= MAXPATHLEN);
X+        hostnamelen = MAXPATHLEN;
X     }
X     strncpy(hostname, fsname, hostnamelen);
X     hostname[hostnamelen] = '\0';
X@@ -84,7 +92,11 @@
X     // acregmin, acregmax, actimeo, and noac options in the mount
X     // options.  Otherwise, use defaults.
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    const char * opt = mnt.mnt_mntopts;
X+#else
X     const char * opt = mnt.mnt_opts;
X+#endif
X 
X     bool f_noac = false;
X     bool f_actimeo = false;
X@@ -102,20 +114,20 @@
X     if (strstr(opt, "noac")) {
X         f_noac = true;
X     }
X-    if ((p = strstr(opt, "actimeo"))) 
X+    if ((p = strstr((char *)opt, "actimeo"))) 
X     {
X         if (sscanf(p, "actimeo=%i", &actimeo) == 1) {
X             f_actimeo = true;
X         }
X     }
X     
X-    if ((p = strstr(opt, "acregmin"))) {
X+    if ((p = strstr((char *)opt, "acregmin"))) {
X         if (sscanf(p, "acregmin=%i", &acregmin) == 1) {
X             f_acregmin = true;
X         }
X     }
X     
X-    if ((p = strstr(opt, "acregmax"))) {
X+    if ((p = strstr((char *)opt, "acregmax"))) {
X         if (sscanf(p, "acregmax=%i", &acregmax) == 1) {
X             f_acregmax = true;
X         }
END-of-./files/patch-src_NFSFileSystem.c++
echo x - ./files/patch-src_InternalClient.c++
sed 's/^X//' >./files/patch-src_InternalClient.c++ << 'END-of-./files/patch-src_InternalClient.c++'
X$NetBSD: patch-ai,v 1.3 2004/03/28 22:00:05 minskim Exp $
X
X--- src/InternalClient.c++.orig	2003-01-18 08:18:12.000000000 -0600
X+++ src/InternalClient.c++
X@@ -35,8 +35,8 @@ InternalClient::InternalClient(const cha
X {
X     assert(filename);
X     assert(h);
X-    assert(filename[0] == '/');
X     Log::debug("%s watching %s", name(), filename);
X+    assert(filename[0] == '/');
X     interest = new File(filename, this, Request(0), Cred::SuperUser);
X }
X 
END-of-./files/patch-src_InternalClient.c++
echo x - ./files/patch-src_fam-mntent.h
sed 's/^X//' >./files/patch-src_fam-mntent.h << 'END-of-./files/patch-src_fam-mntent.h'
X$NetBSD: patch-ao,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/fam-mntent.h.orig	Sun May 12 19:15:01 2002
X+++ src/fam-mntent.h
X@@ -0,0 +1,62 @@
X+/*
X+ *  mntent
X+ *  fam-mntent.h - compatability header for BSD
X+ *
X+ *  Copyright (c) 2001 David Rufino <daverufino@btinternet.com>
X+ *  All rights reserved.
X+ *
X+ * Redistribution and use in source and binary forms, with or without
X+ * modification, are permitted provided that the following conditions
X+ * are met:
X+ * 1. Redistributions of source code must retain the above copyright
X+ *    notice, this list of conditions and the following disclaimer.
X+ * 2. Redistributions in binary form must reproduce the above copyright
X+ *    notice, this list of conditions and the following disclaimer in the
X+ *    documentation and/or other materials provided with the distribution.
X+ *
X+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
X+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
X+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
X+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
X+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
X+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
X+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
X+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
X+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
X+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
X+ * SUCH DAMAGE.
X+ */
X+
X+#if defined(HAVE_MNTENT_H)
X+#include <mntent.h>
X+#elif defined(HAVE_SYS_MNTTAB_H)
X+#include <stdio.h>
X+#include <unistd.h>
X+#include <sys/mntent.h>
X+#include <sys/mnttab.h>
X+#define MOUNTED MNTTAB
X+#else
X+#ifndef _MNTENT_H
X+#define _MNTENT_H
X+#include <stdio.h>
X+
X+#define MOUNTED "dummy"
X+
X+#define MNTTYPE_NFS "nfs"
X+
X+struct mntent {
X+	char *mnt_fsname;
X+	char *mnt_dir;
X+	char *mnt_type;
X+	char *mnt_opts;
X+	int mnt_freq;
X+	int mnt_passno;
X+};
X+
X+#define setmntent(x,y) ((FILE *)0x1)
X+struct mntent *getmntent __P ((FILE *fp));
X+char *hasmntopt __P ((const struct mntent *mnt, const char *option));
X+#define endmntent(x) ((int)1)
X+
X+#endif /* _MNTENT_H */
X+#endif /* HAVE_MNTENT_H */
END-of-./files/patch-src_fam-mntent.h
echo x - ./files/patch-src_ServerHost.h
sed 's/^X//' >./files/patch-src_ServerHost.h << 'END-of-./files/patch-src_ServerHost.h'
X$NetBSD: patch-aq,v 1.4 2004/11/19 12:35:22 sketch Exp $
X
X--- src/ServerHost.h.orig	2003-01-18 14:18:12.000000000 +0000
X+++ src/ServerHost.h	2004-11-08 13:45:49.261211000 +0000
X@@ -24,6 +24,7 @@
X #define ServerHost_included
X 
X #include <limits.h>
X+#include <stdio.h>
X #include "Boolean.h"
X #include "ClientInterest.h"
X #include "RequestMap.h"
X@@ -101,7 +102,7 @@
X     private:
X 
X 	Request myrequest;
X-	char mypath[NAME_MAX];
X+	char mypath[MAXPATHLEN];
X 
X     };
X 
END-of-./files/patch-src_ServerHost.h
echo x - ./files/patch-src_RPC_TCP_Connector.c++
sed 's/^X//' >./files/patch-src_RPC_TCP_Connector.c++ << 'END-of-./files/patch-src_RPC_TCP_Connector.c++'
X$NetBSD: patch-as,v 1.5 2004/12/09 18:45:32 minskim Exp $
X
X--- src/RPC_TCP_Connector.c++.orig	2003-01-18 08:18:12.000000000 -0600
X+++ src/RPC_TCP_Connector.c++
X@@ -21,11 +21,23 @@
X //  Temple Place - Suite 330, Boston MA 02111-1307, USA.
X 
X #include "RPC_TCP_Connector.h"
X+#include "config.h"
X+
X+#define PORTMAP
X 
X #include <errno.h>
X+#ifdef __SUNPRO_CC
X+extern "C" {
X+#endif
X #include <rpc/rpc.h>
X #include <rpc/pmap_prot.h>
X+#ifdef __SUNPRO_CC
X+}
X+#endif
X #include <sys/ioctl.h>
X+#ifdef HAVE_SYS_FILIO_H
X+#include <sys/filio.h>
X+#endif
X #include <sys/socket.h>
X #include <unistd.h>
X #include <string.h>
END-of-./files/patch-src_RPC_TCP_Connector.c++
echo x - ./files/patch-src_FileSystem.h
sed 's/^X//' >./files/patch-src_FileSystem.h << 'END-of-./files/patch-src_FileSystem.h'
X$NetBSD: patch-av,v 1.5 2004/11/19 12:35:22 sketch Exp $
X
X--- src/FileSystem.h.orig	2004-11-08 16:45:59.904416000 +0000
X+++ src/FileSystem.h	2004-11-08 16:48:24.970550000 +0000
X@@ -27,7 +27,13 @@
X #include "Request.h"
X #include "Set.h"
X 
X+#include "fam-mntent.h"
X+
X+#if defined(HAVE_SYS_MNTTAB_H)
X+struct mnttab;
X+#else
X struct mntent;
X+#endif
X struct stat;
X 
X //  FileSystem is the abstract base class for a per-filesystem object.
X@@ -91,12 +97,20 @@
X 
X     typedef Set<ClientInterest *> Interests;
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    FileSystem(const mnttab&);
X+#else
X     FileSystem(const mntent&);
X+#endif
X     virtual ~FileSystem();
X 
X     //  Miscellaneous routines
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+    bool matches(const mnttab& m) const;
X+#else
X     bool matches(const mntent& m) const;
X+#endif
X     const char *dir() const		{ return mydir; }
X     const char *fsname() const		{ return myfsname; }
X     const Interests& interests()	{ return myinterests; }
END-of-./files/patch-src_FileSystem.h
echo x - ./files/patch-src_LocalFileSystem.c++
sed 's/^X//' >./files/patch-src_LocalFileSystem.c++ << 'END-of-./files/patch-src_LocalFileSystem.c++'
X$NetBSD: patch-az,v 1.1 2004/11/19 12:35:22 sketch Exp $
X
X--- src/LocalFileSystem.c++.orig	2004-11-08 17:28:08.710285000 +0000
X+++ src/LocalFileSystem.c++	2004-11-08 17:28:53.492174000 +0000
X@@ -27,7 +27,11 @@
X #include "Log.h"
X #include "Pollster.h"
X 
X+#if defined(HAVE_SYS_MNTTAB_H)
X+LocalFileSystem::LocalFileSystem(const mnttab& mnt)
X+#else
X LocalFileSystem::LocalFileSystem(const mntent& mnt)
X+#endif
X     : FileSystem(mnt)
X { }
X 
END-of-./files/patch-src_LocalFileSystem.c++
echo x - ./Makefile
sed 's/^X//' >./Makefile << 'END-of-./Makefile'
X# ports collection makefile for:	fam
X# Date created:				20 February 2001
X# Whom:					Jeremy Norris <ishmael27@home.com>
X#
X# $FreeBSD: ports/devel/fam/Makefile,v 1.23 2004/08/03 15:49:35 lofi Exp $
X#
X
XPORTNAME=		fam
XPORTVERSION=		2.7.0
XCATEGORIES=		devel
XMASTER_SITES=		ftp://oss.sgi.com/projects/fam/download/stable/ \
X			ftp://ftp.tuwien.ac.at/opsys/linux/gentoo/distfiles/ \
X			http://gd.tuwien.ac.at/opsys/linux/gentoo/distfiles/
XDIST_SUBDIR=		${PORTNAME}
X
XMAINTAINER=	mbr@FreeBSD.org
XCOMMENT=	A file alteration monitor
X
X# TODO:
X# configure problems: use bash, but must work with sh
X# problems with kqueue (threading) segfaults after initial use
X# work a $prefix/etc/rc.d/famd rcNG script
X
XUSE_REINPLACE=		yes
XUSE_GMAKE=	yes
XGNU_CONFIGURE=	yes
XINSTALLS_SHLIB=	yes
X
XCONFIGURE_TARGET=	--build=${MACHINE_ARCH}-portbld-freebsd${OSREL}
XCONFIGURE_ENV+=	CPPFLAGS=${CPPFLAGS}
X
X.if defined(WITH_KQUEUE)
XCPPFLAGS+=	-DHAVE_KQUEUE ${PTHREAD_CFLAGS}
X.endif
X
XMAN3=	fam.3
XMAN5=	famd.conf.5
XMAN8=	famd.8
X
X
Xpost-extract:
X	@${CP} ${FILESDIR}/IMonKQueue.c++ ${WRKSRC}/src
X	@${CP} ${FILESDIR}/imon-compat.h ${WRKSRC}/src
X
Xpre-configure:
X.if defined(WITH_KQUEUE)
X	@${ECHO_MSG} ">> Enabling kqueue monitoring."
X	@${REINPLACE_CMD} -e 's|@MONITOR_FUNCS@|IMonKQueue|g ; \
X		s|@LIBS@|@LIBS@ ${PTHREAD_LIBS}|g' \
X		${WRKSRC}/src/Makefile.in
X.endif
X	@${ECHO_MSG} ">> Fixing hardcoded paths."
X	@${REINPLACE_CMD} -e 's|/usr/local/etc/|${PREFIX}/etc/|g' \
X		${WRKSRC}/man/famd.conf.5 ${WRKSRC}/man/famd.8
X
Xpost-install:
X	@${CAT} ${PKGMESSAGE}
X
X.include <bsd.port.mk>
END-of-./Makefile
echo x - ./pkg-descr
sed 's/^X//' >./pkg-descr << 'END-of-./pkg-descr'
XFAM, the File Alteration Monitor, provides an API which applications can use
Xto be notified when specific files or directories are changed.
X
XWWW: http://oss.sgi.com/projects/fam/
END-of-./pkg-descr
echo x - ./pkg-message
sed 's/^X//' >./pkg-message << 'END-of-./pkg-message'
X************************************************************************
X
X1. In order to run this port, please add the following line to /etc/rpc if
Xit is not already there:
X
X==8<====8<====8<====8<====8<====8<====8<====8<====8<====8<==
Xsgi_fam		391002
X==8<====8<====8<====8<====8<====8<====8<====8<====8<====8<==
X
X2. To run fam from inetd (the recommended method), then please add the
Xfollowing lines to /etc/inetd.conf if they are not already there:
X
X==8<====8<====8<====8<====8<====8<====8<====8<====8<====8<==
X# FAM: File Alteration Monitor [devel/fam]
X# Take of -l if you need nfs operation, see famd(8)
Xsgi_fam/1-2	stream rpc/tcp wait root /usr/local/sbin/famd	famd -l
X==8<====8<====8<====8<====8<====8<====8<====8<====8<====8<==
X
XAfter modifying /etc/inetd.conf, you must (as root) run:
X
X	killall -HUP inetd
X
XFam also requires that portmapper is running.  Add the appropriate
Xentry to /etc/rc.conf:
X
XFor 4.x:
XAdd portmap_enable="YES" and either reboot or run /usr/sbin/portmap.
X
XFor 5.x:
XAdd rpcbind_enable="YES" and either reboot or run /usr/sbin/rpcbind.
X
X************************************************************************
END-of-./pkg-message
echo x - ./distinfo
sed 's/^X//' >./distinfo << 'END-of-./distinfo'
XMD5 (fam/fam-2.7.0.tar.gz) = 1bf3ae6c0c58d3201afc97c6a4834e39
XSIZE (fam/fam-2.7.0.tar.gz) = 301974
END-of-./distinfo
echo x - ./pkg-plist
sed 's/^X//' >./pkg-plist << 'END-of-./pkg-plist'
Xinclude/fam.h
Xlib/libfam.a
Xlib/libfam.la
Xlib/libfam.so
Xlib/libfam.so.0
Xsbin/famd
Xshare/examples/fam/fam.conf
X@exec if test ! -s %D/etc/fam.conf; then install -o root -g wheel -m 644 %D/share/examples/fam/fam.conf %D/etc/; fi
X@unexec if cmp -s %D/share/examples/fam/fam.conf %D/etc/famd.conf; then rm -rf %D/etc/fam.conf; fi
X@dirrm share/examples/fam
X@unexec rm -f %D/etc/rc.d/fam.sh || true
END-of-./pkg-plist
exit



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200503220820.j2M8KqwJ051751>