diff options
author | alane <alane@FreeBSD.org> | 2002-09-10 09:49:31 +0000 |
---|---|---|
committer | alane <alane@FreeBSD.org> | 2002-09-10 09:49:31 +0000 |
commit | 082c652e9025f6438974cf3df4106ec50475e0c1 (patch) | |
tree | b824f1e9a886e52c1f8f7dd775878917bb39da07 /devel/fam/files | |
parent | 4573809d1750e43eb078959f46e2980b2655e0ad (diff) | |
download | FreeBSD-ports-082c652e9025f6438974cf3df4106ec50475e0c1.zip FreeBSD-ports-082c652e9025f6438974cf3df4106ec50475e0c1.tar.gz |
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.h | 67 | ||||
-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 0000000..24a574c --- /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 0000000..947a1ed --- /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 */ |