aboutsummaryrefslogtreecommitdiffstats
path: root/devel/fam/files
diff options
context:
space:
mode:
authoralane <alane@FreeBSD.org>2002-09-10 17:49:31 +0800
committeralane <alane@FreeBSD.org>2002-09-10 17:49:31 +0800
commit082c652e9025f6438974cf3df4106ec50475e0c1 (patch)
treeb824f1e9a886e52c1f8f7dd775878917bb39da07 /devel/fam/files
parent4573809d1750e43eb078959f46e2980b2655e0ad (diff)
downloadfreebsd-ports-gnome-082c652e9025f6438974cf3df4106ec50475e0c1.tar.gz
freebsd-ports-gnome-082c652e9025f6438974cf3df4106ec50475e0c1.tar.zst
freebsd-ports-gnome-082c652e9025f6438974cf3df4106ec50475e0c1.zip
Replace the mntent emulation code with my own versions, which are GPL'd,
so that SGI can integrate them, along with the rest of the current patches, into its own tree. The BSD license on the old code was preventing that, as SGI's legal weasels will only allow them to accept GPL'd code. My stuff's more well written anyway; I know how to write C++, the old author didn't.
Diffstat (limited to 'devel/fam/files')
-rw-r--r--devel/fam/files/mntent.h67
-rw-r--r--devel/fam/files/mntent_compat.c++154
2 files changed, 221 insertions, 0 deletions
diff --git a/devel/fam/files/mntent.h b/devel/fam/files/mntent.h
new file mode 100644
index 000000000000..24a574c8a579
--- /dev/null
+++ b/devel/fam/files/mntent.h
@@ -0,0 +1,67 @@
+/* -*-C++-*-
+
+ mntent.h
+
+ Copyright (C) 2002 Alan Eldridge
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id$
+
+ 2002/09/08 alane@geeksrus.net
+*/
+
+#ifdef HAVE_MNTENT_H
+#include <mntent.h>
+#else
+
+#ifndef mntent_h_
+#define mntent_h_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/param.h>
+#include <sys/ucred.h>
+#include <sys/mount.h>
+
+#define MOUNTED "dummy"
+#define MNTTYPE_NFS "nfs"
+
+const int MOPTSLEN (256 - (MNAMELEN * 2 + MFSNAMELEN + 2 * sizeof(int)));
+
+struct mntent {
+public:
+ char mnt_fsname[ MNAMELEN ];
+ char mnt_dir[ MNAMELEN ];
+ char mnt_type[ MFSNAMELEN ];
+ char mnt_opts[ MOPTSLEN ];
+ int mnt_freq, mnt_passno;
+private:
+ void clear();
+public:
+ mntent() {
+ clear();
+ }
+ struct mntent *from_statfs(struct statfs *pst);
+};
+
+FILE *setmntent(const char *szfn, char *szrw);
+struct mntent *getmntent(FILE *pf);
+char *hasmntopt(const struct mntent *pmnt, const char *szopt);
+int endmntent(FILE *pf);
+
+#endif /* mntent_h_ */
+#endif /* not HAVE_MNTENT_H */
diff --git a/devel/fam/files/mntent_compat.c++ b/devel/fam/files/mntent_compat.c++
new file mode 100644
index 000000000000..947a1ed950e7
--- /dev/null
+++ b/devel/fam/files/mntent_compat.c++
@@ -0,0 +1,154 @@
+/* -*-C++-*-
+
+ mntentemu.c++
+
+ Copyright (C) 2002 Alan Eldridge
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ $Id: mntent_compat.cc,v 1.3 2002/09/08 18:42:20 alane Exp $
+
+ 2002/09/08 alane@geeksrus.net
+*/
+
+#ifndef HAVE_MNTENT_H
+
+#include "config.h"
+#include "mntent.h"
+
+#include <string>
+
+// globals (yuck, but easier for debugging)
+
+mntent G_mntent;
+int G_mntpos;
+int G_mntsize;
+bool G_mntfOpen = false;
+struct statfs *G_pmntstat = 0;
+
+// map option flags to names
+
+struct optmap {
+ int fl;
+ string st;
+};
+
+static struct optmap omap[] = {
+ { MNT_SYNCHRONOUS, "sync" },
+ { MNT_NOEXEC, "noexec" },
+ { MNT_NOSUID, "nosuid" },
+ { MNT_NODEV, "nodev" },
+ { MNT_UNION, "union" },
+ { MNT_ASYNC, "async" },
+ { MNT_NOATIME, "noatime" },
+ { MNT_NOCLUSTERR, "noclusterr" },
+ { MNT_NOCLUSTERW, "noclusterw" },
+ { MNT_NOSYMFOLLOW, "nosymfollow" },
+ { MNT_SUIDDIR, "suiddir" },
+ { 0, "noop" }
+};
+
+// zap everything for clarity
+
+void
+mntent::clear()
+{
+ memset(mnt_fsname, 0, sizeof(mnt_fsname));
+ memset(mnt_dir, 0, sizeof(mnt_dir));
+ memset(mnt_type, 0, sizeof(mnt_type));
+ memset(mnt_opts, 0, sizeof(mnt_opts));
+ mnt_freq = mnt_passno = 0;
+}
+
+// fake it from a statfs struct
+
+mntent *
+mntent::from_statfs(struct statfs *pst)
+{
+
+ clear();
+ strcpy(mnt_fsname, pst->f_mntfromname);
+ strcpy(mnt_dir, pst->f_mntonname);
+ strcpy(mnt_type, pst->f_fstypename);
+ mnt_freq = mnt_passno = 0;
+
+ string opts;
+ int fl = pst->f_flags;
+
+ opts += (fl & MNT_RDONLY) ? "ro" : "rw";
+ for (optmap *pmp = omap; pmp->fl != 0; pmp++) {
+ if ((fl & pmp->fl) != 0) {
+ opts += (" " + pmp->st);
+ }
+ }
+ strcpy(mnt_opts, opts.c_str());
+
+ return this;
+}
+
+// "rewind" the mtab file
+
+FILE *
+setmntent(const char *, char *)
+{
+ if (!G_mntfOpen) {
+ G_mntfOpen = true;
+ }
+
+ G_mntpos = 0;
+ G_mntsize = getmntinfo(&G_pmntstat, MNT_NOWAIT);
+
+ return reinterpret_cast<FILE *>(1);
+}
+
+// return ptr to opt string if present
+
+char *
+hasmntopt(const mntent *pmnt, const char *szopt)
+{
+ string opt(szopt);
+ string mntopts(pmnt->mnt_opts);
+
+ string::size_type pos = mntopts.find(opt);
+ const char *szret = (pos == string::npos) ? "" : pmnt->mnt_opts + pos;
+
+ return const_cast<char *>(szret);
+}
+
+// get next mntent until all gone, then return 0
+
+struct mntent *
+getmntent(FILE *)
+{
+ if (!G_mntfOpen) {
+ return 0;
+ } else if (G_mntpos < G_mntsize) {
+ return G_mntent.from_statfs(G_pmntstat + G_mntpos++);
+ } else {
+ G_mntfOpen = false;
+ return 0;
+ }
+}
+
+// "close" the mtab file
+
+int
+endmntent(FILE *)
+{
+ G_mntfOpen = false;
+ return 0;
+}
+
+#endif /* ifndef HAVE_MNTENT_H */