summaryrefslogtreecommitdiff
path: root/devel/fam
diff options
context:
space:
mode:
authorWill Andrews <will@FreeBSD.org>2001-03-31 02:45:55 +0000
committerWill Andrews <will@FreeBSD.org>2001-03-31 02:45:55 +0000
commitd81cf027d1d10d86d23173c2cc3880256409385f (patch)
treeddb91467f6f5ce0d95954c411466456463b5ac6a /devel/fam
parentAdd ffcall 1.8, a set of foreign function call libraries. (diff)
Add fam 2.6.4, a file alteration monitor.
PR: 25926 Submitted by: Jeremy Norris <ishmael27@home.com>
Notes
Notes: svn path=/head/; revision=40625
Diffstat (limited to 'devel/fam')
-rw-r--r--devel/fam/Makefile29
-rw-r--r--devel/fam/distinfo1
-rw-r--r--devel/fam/files/fam.sh.sample20
-rw-r--r--devel/fam/files/patch-Makefile.am33
-rw-r--r--devel/fam/files/patch-freebsd490
-rw-r--r--devel/fam/pkg-comment1
-rw-r--r--devel/fam/pkg-descr4
-rw-r--r--devel/fam/pkg-message8
-rw-r--r--devel/fam/pkg-plist8
9 files changed, 594 insertions, 0 deletions
diff --git a/devel/fam/Makefile b/devel/fam/Makefile
new file mode 100644
index 000000000000..d2aca9a81817
--- /dev/null
+++ b/devel/fam/Makefile
@@ -0,0 +1,29 @@
+# ports collection makefile for: fam
+# Date created: 20 February 2001
+# Whom: Jeremy Norris <ishmael27@home.com>
+#
+# $FreeBSD$
+#
+
+PORTNAME= fam
+PORTVERSION= 2.6.4
+CATEGORIES= devel
+MASTER_SITES= ftp://oss.sgi.com/projects/fam/download/
+DISTNAME= ${PORTNAME}-oss-${PORTVERSION}
+
+MAINTAINER= ishmael27@home.com
+
+USE_AUTOMAKE= yes
+USE_LIBTOOL= yes
+USE_GMAKE= yes
+PATCH_STRIP= -p1
+INSTALLS_SHLIB= yes
+
+MAN1= fam.1m
+MAN3= fam.3x
+
+post-install:
+ @${INSTALL_SCRIPT} -m 751 ${FILESDIR}/fam.sh.sample ${PREFIX}/etc/rc.d/fam.sh.sample
+ @${CAT} ${PKGMESSAGE}
+
+.include <bsd.port.mk>
diff --git a/devel/fam/distinfo b/devel/fam/distinfo
new file mode 100644
index 000000000000..f58f12f7033b
--- /dev/null
+++ b/devel/fam/distinfo
@@ -0,0 +1 @@
+MD5 (fam-oss-2.6.4.tar.gz) = d060919b3d9ede61a8b68eae1ded53ce
diff --git a/devel/fam/files/fam.sh.sample b/devel/fam/files/fam.sh.sample
new file mode 100644
index 000000000000..e1c252bdb2a0
--- /dev/null
+++ b/devel/fam/files/fam.sh.sample
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+if ! PREFIX=$(expr $0 : "\(/.*\)/etc/rc\.d/$(basename $0)\$"); then
+ echo "$0: Cannot determine the PREFIX" >&2
+ exit 1
+fi
+
+case "$1" in
+start)
+ [ -x ${PREFIX}/bin/fam ] && ( ${PREFIX}/bin/fam & ) && echo -n ' fam'
+ ;;
+stop)
+ killall fam && echo -n ' fam'
+ ;;
+*)
+ echo "Usage: `basename $0` {start|stop}" >&2
+ ;;
+esac
+
+exit 0
diff --git a/devel/fam/files/patch-Makefile.am b/devel/fam/files/patch-Makefile.am
new file mode 100644
index 000000000000..f5657e4d6f37
--- /dev/null
+++ b/devel/fam/files/patch-Makefile.am
@@ -0,0 +1,33 @@
+--- Makefile.am.orig Fri May 19 23:46:31 2000
++++ Makefile.am Mon Mar 19 11:51:05 2001
+@@ -7,30 +7,3 @@
+ rpm: dist
+ @cd build && $(MAKE) $(AM_MAKEFLAGS) rpm
+
+-# We proceed even if these commands fail because this might be an install
+-# into $DESTDIR by a non-root user.
+-install-exec-hook:
+- -@if test "no$(LDCONFIG)" != "no"; then \
+-## echo "Adding $(libdir) to ld.so.conf..."; \
+- $(EDITCONF) ld.so.conf add $(DESTDIR)$(libdir) $(DESTDIR)$(libdir); \
+- exec $(LDCONFIG); \
+- fi
+-## @echo "Adding fam to rpc..."
+- -@$(EDITCONF) rpc add 391002 "sgi_fam 391002"
+-## @echo "Adding fam to inetd.conf..."
+- -@$(EDITCONF) inetd.conf add '\b(fam|FAM)\b' \
+- "# fam, the File Alteration Monitor, http://oss.sgi.com/projects/fam/" \
+- "sgi_fam/1-2 stream rpc/tcp wait root $(DESTDIR)$(bindir)/fam fam"
+- @echo "Restarting inetd..."
+- -@killall -HUP inetd
+-
+-# We don't remove $(libdir) from ld.so.conf here because we don't have
+-# a way to tell whether we're the ones who added it, and other things
+-# probably use it as well.
+-uninstall-local:
+-## @echo "Removing fam from rpc..."
+- -@$(EDITCONF) rpc remove 391002
+-## @echo "Removing fam from inetd.conf..."
+- -@$(EDITCONF) inetd.conf remove '\b(fam|FAM)\b'
+- @echo "Restarting inetd..."
+- -@killall -HUP inetd
diff --git a/devel/fam/files/patch-freebsd b/devel/fam/files/patch-freebsd
new file mode 100644
index 000000000000..3cdbe55c225d
--- /dev/null
+++ b/devel/fam/files/patch-freebsd
@@ -0,0 +1,490 @@
+diff -urN fam-oss-2.6.4/config.h.in fam-oss-2.6.4-freebsd/config.h.in
+--- fam-oss-2.6.4/config.h.in Sat May 20 05:50:17 2000
++++ fam-oss-2.6.4-freebsd/config.h.in Sun Mar 18 00:02:38 2001
+@@ -12,6 +12,8 @@
+ /* Define if the system has imon and IMONIOC_ ioctl flags. */
+ #undef HAVE_IMON
+
++#undef HAVE_MNTENT_H
++
+ /* Define if the system has the struct revokdi and the IMONIOC_REVOKDI
+ ** ioctl flag. (IRIX 5.3 doesn't.)
+ */
+diff -urN fam-oss-2.6.4/configure.in fam-oss-2.6.4-freebsd/configure.in
+--- fam-oss-2.6.4/configure.in Sat May 20 06:23:17 2000
++++ fam-oss-2.6.4-freebsd/configure.in Sun Mar 18 00:36:29 2001
+@@ -95,6 +95,8 @@
+ dnl AC_HEADER_SYS_WAIT
+ dnl AC_CHECK_HEADERS(fcntl.h limits.h sys/time.h syslog.h unistd.h)
+
++AC_CHECK_HEADER(mntent.h, AC_DEFINE(HAVE_MNTENT_H))
++
+ dnl
+ dnl See if imon is available; if so, is it IRIX or Linux?
+ dnl
+@@ -299,10 +301,10 @@
+ dnl If we don't have MNTTYPE_NFS , we croak.
+ dnl
+
+-FAM_DECL_IN_MNTENT(MNTTYPE_NFS, ,AC_MSG_ERROR(Didn't find MNTTYPE_NFS in mntent.h))
+-FAM_DECL_IN_MNTENT(MNTTYPE_NFS2, AC_DEFINE(HAVE_MNTTYPE_NFS2))
+-FAM_DECL_IN_MNTENT(MNTTYPE_NFS3, AC_DEFINE(HAVE_MNTTYPE_NFS3))
+-FAM_DECL_IN_MNTENT(MNTTYPE_CACHEFS, AC_DEFINE(HAVE_MNTTYPE_CACHEFS))
++dnl FAM_DECL_IN_MNTENT(MNTTYPE_NFS, ,AC_MSG_ERROR(Didn't find MNTTYPE_NFS in mntent.h))
++dnl FAM_DECL_IN_MNTENT(MNTTYPE_NFS2, AC_DEFINE(HAVE_MNTTYPE_NFS2))
++dnl FAM_DECL_IN_MNTENT(MNTTYPE_NFS3, AC_DEFINE(HAVE_MNTTYPE_NFS3))
++dnl FAM_DECL_IN_MNTENT(MNTTYPE_CACHEFS, AC_DEFINE(HAVE_MNTTYPE_CACHEFS))
+
+ dnl
+ dnl Test for bindresvport() prototype.
+diff -urN fam-oss-2.6.4/fam/Client.h fam-oss-2.6.4-freebsd/fam/Client.h
+--- fam-oss-2.6.4/fam/Client.h Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/Client.h Sat Mar 17 00:14:35 2001
+@@ -23,6 +23,7 @@
+ #ifndef Client_included
+ #define Client_included
+
++#include <sys/types.h>
+ #include <netinet/in.h> // for in_addr
+
+ #include "Activity.h"
+diff -urN fam-oss-2.6.4/fam/FileSystem.c++ fam-oss-2.6.4-freebsd/fam/FileSystem.c++
+--- fam-oss-2.6.4/fam/FileSystem.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/FileSystem.c++ Sat Mar 17 13:18:10 2001
+@@ -22,7 +22,7 @@
+
+ #include "FileSystem.h"
+
+-#include <mntent.h>
++#include "mntent.h"
+ #include <string.h>
+
+ #include "Event.h"
+diff -urN fam-oss-2.6.4/fam/FileSystemTable.c++ fam-oss-2.6.4-freebsd/fam/FileSystemTable.c++
+--- fam-oss-2.6.4/fam/FileSystemTable.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/FileSystemTable.c++ Sat Mar 17 23:44:17 2001
+@@ -21,9 +21,10 @@
+ // Temple Place - Suite 330, Boston MA 02111-1307, USA.
+
+ #include <stddef.h>
++#include <stdio.h>
+ #include "FileSystemTable.h"
+
+-#include <mntent.h>
++#include "mntent.h"
+ #include <stdlib.h>
+ #include <string.h>
+
+@@ -255,7 +256,10 @@
+ // create_fs_by_name initializes our "root" member variable.
+ if (!fs_by_name)
+ { create_fs_by_name();
++#if !defined(__FreeBSD__)
++ /* there is no mtab "file" in freebsd! */
+ mtab_watcher = new InternalClient(mtab_name, mtab_event_handler, NULL);
++#endif
+ }
+
+ cr.become_user();
+diff -urN fam-oss-2.6.4/fam/IMon.c++ fam-oss-2.6.4-freebsd/fam/IMon.c++
+--- fam-oss-2.6.4/fam/IMon.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/IMon.c++ Sat Mar 17 14:06:17 2001
+@@ -34,7 +34,9 @@
+ #endif
+ #endif
+
+-#include <sys/sysmacros.h>
++#if !defined(__FreeBSD__)
++# include <sys/sysmacros.h>
++#endif
+ #include <unistd.h>
+
+ #include "Interest.h"
+diff -urN fam-oss-2.6.4/fam/Interest.c++ fam-oss-2.6.4-freebsd/fam/Interest.c++
+--- fam-oss-2.6.4/fam/Interest.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/Interest.c++ Sat Mar 17 14:06:37 2001
+@@ -25,7 +25,9 @@
+ #include <string.h>
+ #include <errno.h>
+ #include <sys/param.h>
+-#include <sys/sysmacros.h>
++#if !defined(__FreeBSD__)
++# include <sys/sysmacros.h>
++#endif
+
+ #ifdef HAVE_IRIX_XTAB_VERIFICATION
+ #include <stdio.h>
+diff -urN fam-oss-2.6.4/fam/InternalClient.c++ fam-oss-2.6.4-freebsd/fam/InternalClient.c++
+--- fam-oss-2.6.4/fam/InternalClient.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/InternalClient.c++ Sat Mar 17 23:20:15 2001
+@@ -35,8 +35,8 @@
+ {
+ assert(filename);
+ assert(h);
+- assert(filename[0] == '/');
+ Log::debug("%s watching %s", name(), filename);
++ assert(filename[0] == '/');
+ interest = new File(filename, this, Request(0), Cred::SuperUser);
+ }
+
+diff -urN fam-oss-2.6.4/fam/Listener.c++ fam-oss-2.6.4-freebsd/fam/Listener.c++
+--- fam-oss-2.6.4/fam/Listener.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/Listener.c++ Sat Mar 17 14:12:57 2001
+@@ -22,6 +22,8 @@
+
+ #include "Listener.h"
+
++#include <stdio.h>
++#include <stdlib.h>
+ #include <assert.h>
+ #include <fcntl.h>
+ #include <sys/types.h>
+@@ -202,7 +204,11 @@
+ // requested user and pass the name back to the client.
+
+ char *tmpfile = tempnam("/tmp", ".fam");
++#if defined(__FreeBSD__)
++ sockaddr_un sun = { sizeof(sockaddr_un), AF_UNIX, "" };
++#else
+ sockaddr_un sun = { AF_UNIX, "" };
++#endif
+ if(strlen(tmpfile) >= (sizeof(sun.sun_path) - 1))
+ {
+ Log::error("tmpnam() too long for sun_path (%d >= %d)!",
+@@ -235,7 +241,7 @@
+ return;
+ }
+
+- if (chown(sun.sun_path, uid, -1) != 0)
++ if (chown(sun.sun_path, uid, (gid_t)-1) != 0)
+ { Log::perror("localclient chown");
+ close(client_sock);
+ return;
+@@ -271,7 +277,11 @@
+
+ // Get the new socket.
+
++#if defined(__FreeBSD__)
++ struct sockaddr_un sun = { sizeof(sockaddr_un), AF_UNIX, "" };
++#else
+ struct sockaddr_un sun = { AF_UNIX, "" };
++#endif
+ CONFIG_SOCKLEN_T sunlen = sizeof(sun);
+ int client_fd = accept(ofd, (struct sockaddr *) &sun, &sunlen);
+ if (client_fd < 0)
+@@ -333,7 +343,11 @@
+ void
+ Listener::dirty_ugly_hack()
+ {
++#if defined(__FreeBSD__)
++ static sockaddr_un sun = { sizeof (sockaddr_un), AF_UNIX, "/tmp/.fam_socket" };
++#else
+ static sockaddr_un sun = { AF_UNIX, "/tmp/.fam_socket" };
++#endif
+
+ int sock = socket(PF_UNIX, SOCK_STREAM, 0);
+ if (sock < 0)
+diff -urN fam-oss-2.6.4/fam/Log.c++ fam-oss-2.6.4-freebsd/fam/Log.c++
+--- fam-oss-2.6.4/fam/Log.c++ Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/Log.c++ Sat Mar 17 14:14:31 2001
+@@ -28,6 +28,8 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <syslog.h>
++#include <sys/time.h>
++#include <sys/types.h>
+ #include <sys/resource.h>
+ #include <sys/stat.h>
+ #include <unistd.h>
+diff -urN fam-oss-2.6.4/fam/Makefile.am fam-oss-2.6.4-freebsd/fam/Makefile.am
+--- fam-oss-2.6.4/fam/Makefile.am Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/fam/Makefile.am Sat Mar 17 18:12:17 2001
+@@ -72,6 +72,7 @@
+ main.c++ \
+ timeval.c++ \
+ timeval.h \
++ mntent_compat.c++ \
+ @IMON_FUNCS@.c++
+
+ EXTRA_fam_SOURCES = IMonIrix.c++ IMonLinux.c++ IMonNone.c++
+diff -urN fam-oss-2.6.4/fam/Scheduler.h fam-oss-2.6.4-freebsd/fam/Scheduler.h
+--- fam-oss-2.6.4/fam/Scheduler.h Sat May 20 05:46:32 2000
++++ fam-oss-2.6.4-freebsd/fam/Scheduler.h Sat Mar 17 00:14:04 2001
+@@ -24,6 +24,7 @@
+ #define Scheduler_included
+
+ #include <sys/time.h>
++#include <string.h>
+
+ #include "Boolean.h"
+
+diff -urN fam-oss-2.6.4/fam/StringTable.h fam-oss-2.6.4-freebsd/fam/StringTable.h
+--- fam-oss-2.6.4/fam/StringTable.h Sat May 20 05:46:32 2000
++++ fam-oss-2.6.4-freebsd/fam/StringTable.h Sat Mar 17 18:05:38 2001
+@@ -25,6 +25,7 @@
+
+ #include <assert.h>
+ #include <string.h>
++#include "mntent.h"
+
+ // A StringTable maps C strings onto values. It is a cheap O(n)
+ // implementation, suitable only for small tables that are
+diff -urN fam-oss-2.6.4/fam/mntent.h fam-oss-2.6.4-freebsd/fam/mntent.h
+--- fam-oss-2.6.4/fam/mntent.h Thu Jan 1 01:00:00 1970
++++ fam-oss-2.6.4-freebsd/fam/mntent.h Sat Mar 17 18:11:08 2001
+@@ -0,0 +1,56 @@
++/*
++ * mntent
++ * mntent.h - compatability header for FreeBSD
++ *
++ * Copyright (c) 2001 David Rufino <daverufino@btinternet.com>
++ * 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 REGENTS 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 REGENTS 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.
++ */
++
++#if defined(HAVE_MNTENT_H)
++#include <mntent.h>
++#else
++#ifndef _MNTENT_H
++#define _MNTENT_H
++#include <stdio.h>
++
++#define MOUNTED "dummy"
++
++#define MNTTYPE_NFS "nfs"
++
++struct mntent {
++ char *mnt_fsname;
++ char *mnt_dir;
++ char *mnt_type;
++ char *mnt_opts;
++ int mnt_freq;
++ int mnt_passno;
++};
++
++#define setmntent(x,y) ((FILE *)0x1)
++struct mntent *getmntent __P ((FILE *fp));
++char *hasmntopt __P ((const struct mntent *mnt, const char *option));
++#define endmntent(x) ((int)1)
++
++#endif /* _MNTENT_H */
++#endif /* HAVE_MNTENT_H */
+diff -urN fam-oss-2.6.4/fam/mntent_compat.c++ fam-oss-2.6.4-freebsd/fam/mntent_compat.c++
+--- fam-oss-2.6.4/fam/mntent_compat.c++ Thu Jan 1 01:00:00 1970
++++ fam-oss-2.6.4-freebsd/fam/mntent_compat.c++ Sat Mar 17 23:48:07 2001
+@@ -0,0 +1,151 @@
++/*
++ * Copyright (c) 1980, 1989, 1993, 1994
++ * The Regents of the University of California. All rights reserved.
++ * Copyright (c) 2001
++ * David Rufino <daverufino@btinternet.com>
++ *
++ * 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.
++ * 3. All advertising materials mentioning features or use of this software
++ * must display the following acknowledgement:
++ * This product includes software developed by the University of
++ * California, Berkeley and its contributors.
++ * 4. Neither the name of the University nor the names of its contributors
++ * may be used to endorse or promote products derived from this software
++ * without specific prior written permission.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
++ */
++
++/* most of this was ripped from the mount(3) source */
++
++#include "config.h"
++#include "mntent.h"
++#if !defined(HAVE_MNTENT_H)
++#include <stdlib.h>
++#include <string.h>
++#include <sys/param.h>
++#include <sys/ucred.h>
++#include <sys/mount.h>
++
++static int pos = -1;
++static int mntsize = -1;
++static struct mntent _mntent;
++
++char *
++hasmntopt (const struct mntent *mnt, const char *option)
++{
++ int found;
++ char *opt, *optbuf;
++
++ optbuf = strdup(mnt->mnt_opts);
++ found = 0;
++ for (opt = optbuf; (opt = strtok(opt, " ")) != NULL; opt = NULL) {
++ if (!strcasecmp(opt, option)) {
++ opt = opt - optbuf + mnt->mnt_opts;
++ free (optbuf);
++ return (opt);
++ }
++ }
++ free (optbuf);
++ return (NULL);
++}
++
++static char *
++catopt (char *s0, const char *s1)
++{
++ size_t i;
++ char *cp;
++
++ if (s1 == NULL || *s1 == '\0')
++ return s0;
++ if (s0 && *s0) {
++ i = strlen(s0) + strlen(s1) + 1 + 1;
++ if ((cp = (char *)malloc(i)) == NULL)
++ return (NULL);
++ (void)snprintf(cp, i, "%s %s", s0, s1);
++ } else
++ cp = strdup(s1);
++
++ if (s0)
++ free(s0);
++ return (cp);
++}
++
++
++static char *
++flags2opts (int flags)
++{
++ char *res;
++ res = NULL;
++ res = catopt(res, (flags & MNT_RDONLY) ? "ro" : "rw");
++ if (flags & MNT_SYNCHRONOUS) res = catopt(res, "sync");
++ if (flags & MNT_NOEXEC) res = catopt(res, "noexec");
++ if (flags & MNT_NOSUID) res = catopt(res, "nosuid");
++ if (flags & MNT_NODEV) res = catopt(res, "nodev");
++ if (flags & MNT_UNION) res = catopt(res, "union");
++ if (flags & MNT_ASYNC) res = catopt(res, "async");
++ if (flags & MNT_NOATIME) res = catopt(res, "noatime");
++ if (flags & MNT_NOCLUSTERR) res = catopt(res, "noclusterr");
++ if (flags & MNT_NOCLUSTERW) res = catopt(res, "noclusterw");
++ if (flags & MNT_NOSYMFOLLOW) res = catopt(res, "nosymfollow");
++ if (flags & MNT_SUIDDIR) res = catopt(res, "suiddir");
++
++ return res;
++}
++
++static struct mntent *
++statfs_to_mntent (struct statfs *mntbuf)
++{
++ static char opts_buf[40], *tmp;
++
++ _mntent.mnt_fsname = mntbuf->f_mntfromname;
++ _mntent.mnt_dir = mntbuf->f_mntonname;
++ _mntent.mnt_type = mntbuf->f_fstypename;
++ tmp = flags2opts (mntbuf->f_flags);
++ if (tmp) {
++ opts_buf[sizeof(opts_buf)-1] = '\0';
++ strncpy (opts_buf, tmp, sizeof(opts_buf)-1);
++ free (tmp);
++ } else {
++ *opts_buf = '\0';
++ }
++ _mntent.mnt_opts = opts_buf;
++ _mntent.mnt_freq = _mntent.mnt_passno = 0;
++ return (&_mntent);
++}
++
++struct mntent *
++getmntent (FILE *fp)
++{
++ struct statfs *mntbuf;
++
++ if (pos == -1 || mntsize == -1)
++ mntsize = getmntinfo (&mntbuf, MNT_NOWAIT);
++
++ ++pos;
++ if (pos == mntsize) {
++ pos = mntsize = -1;
++ return (NULL);
++ }
++
++ return (statfs_to_mntent (&mntbuf[pos]));
++}
++
++#endif /* HAVE_MNTENT_H */
+diff -urN fam-oss-2.6.4/libfam/Client.c++ fam-oss-2.6.4-freebsd/libfam/Client.c++
+--- fam-oss-2.6.4/libfam/Client.c++ Sat May 20 05:46:32 2000
++++ fam-oss-2.6.4-freebsd/libfam/Client.c++ Sat Mar 17 00:12:01 2001
+@@ -20,6 +20,7 @@
+ // with this program; if not, write the Free Software Foundation, Inc., 59
+ // Temple Place - Suite 330, Boston MA 02111-1307, USA.
+
++#include <stdio.h>
+ #include <stdlib.h>
+ #include <unistd.h>
+ #include <netinet/in.h>
+diff -urN fam-oss-2.6.4/libfam/fam.c++ fam-oss-2.6.4-freebsd/libfam/fam.c++
+--- fam-oss-2.6.4/libfam/fam.c++ Sat May 20 05:46:32 2000
++++ fam-oss-2.6.4-freebsd/libfam/fam.c++ Sat Mar 17 00:12:43 2001
+@@ -21,6 +21,7 @@
+ // Temple Place - Suite 330, Boston MA 02111-1307, USA.
+
+ #include <sys/types.h>
++#include <rpc/rpc.h>
+ #include <sys/time.h>
+ #include <unistd.h>
+ #include <stdlib.h>
+diff -urN fam-oss-2.6.4/test/test.c++ fam-oss-2.6.4-freebsd/test/test.c++
+--- fam-oss-2.6.4/test/test.c++ Sat May 20 05:46:32 2000
++++ fam-oss-2.6.4-freebsd/test/test.c++ Sat Mar 17 18:39:23 2001
+@@ -1,6 +1,7 @@
+ #include <sys/types.h>
+ #include <sys/time.h>
+ #include <stdio.h>
++#include <string.h>
+ #include <unistd.h>
+ #include <signal.h>
+ #include <errno.h>
+--- fam-oss-2.6.4/acconfig.h Sat May 20 05:46:31 2000
++++ fam-oss-2.6.4-freebsd/acconfig.h Sun Mar 18 00:40:47 2001
+@@ -44,6 +44,8 @@
+ ** Otherwise, we'll use MNTTYPE_NFS. */
+ #undef HAVE_FSID_NFS2
+
++#undef HAVE_MNTENT_H
++
+ /* Define if we have MNTTYPE_NFS2 */
+ #define HAVE_MNTTYPE_NFS2 0
+
diff --git a/devel/fam/pkg-comment b/devel/fam/pkg-comment
new file mode 100644
index 000000000000..1a5ede04fee3
--- /dev/null
+++ b/devel/fam/pkg-comment
@@ -0,0 +1 @@
+A file alteration monitor
diff --git a/devel/fam/pkg-descr b/devel/fam/pkg-descr
new file mode 100644
index 000000000000..4cc0120e6781
--- /dev/null
+++ b/devel/fam/pkg-descr
@@ -0,0 +1,4 @@
+FAM, the File Alteration Monitor, provides an API which applications can use
+to be notified when specific files or directories are changed.
+
+WWW: http://oss.sgi.com/projects/fam/
diff --git a/devel/fam/pkg-message b/devel/fam/pkg-message
new file mode 100644
index 000000000000..d28d68afc971
--- /dev/null
+++ b/devel/fam/pkg-message
@@ -0,0 +1,8 @@
+************************************************************************
+
+In order to run this port, please add the following line to /etc/rpc if
+it is not already there:
+
+sgi_fam 391002
+
+************************************************************************
diff --git a/devel/fam/pkg-plist b/devel/fam/pkg-plist
new file mode 100644
index 000000000000..a02f68433089
--- /dev/null
+++ b/devel/fam/pkg-plist
@@ -0,0 +1,8 @@
+bin/fam
+etc/fam.conf
+include/fam.h
+lib/fam/editconf.perl
+lib/libfam.a
+lib/libfam.so
+lib/libfam.so.0
+@dirrm lib/fam