Replace linux-style getmntent and co. with solaris-style functions
authorDavid Bartley <dtbartle@glibc.(none)>
Sun, 8 Feb 2009 09:58:53 +0000 (09:58 +0000)
committerDavid Bartley <dtbartle@glibc.(none)>
Sun, 8 Feb 2009 09:58:53 +0000 (09:58 +0000)
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/Makefile
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstab.h [deleted file]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mnttab.c [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mntio.h [new file with mode: 0644]
sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mnttab.h [new file with mode: 0644]

index bbcfada..f4f6fc5 100644 (file)
@@ -38,7 +38,7 @@ sysdep_routines +=  gethrtime mount umount umount2 systeminfo resolvepath \
     _getuserattr _getauuserent _getauusernam _getexecattr vfstab fdwalk \
     closefrom ipsecalg gethostent sigsendset sigsend stack_getbounds \
     thr_sighndlrinfo _getexecprof _fgetuserattr priv_str _sbrk_grow_aligned \
-    cftime ascftime inet_ntoa_r
+    cftime ascftime inet_ntoa_r mnttab
 sysdep_routines += sys_fdsync sys_brk sys_fcntl sys_utssys sys_lwp_private \
     sys_uname sys_getloadavg sys_utimes sys_getpeerucred sys_ucred_get \
     sys_privsys sys_putmsg sys_putpmsg sys_meminfo sys_pset_getloadavg \
@@ -55,10 +55,11 @@ sysdep_headers += sys/feature_tests.h sys/dirent.h sys/utime.h sys/machelf.h \
     sys/klog.h sys/zone.h sys/processor.h sys/pset.h sys/task.h sys/exacct.h \
     sys/acct.h sys/acctctl.h sys/utssys.h sys/corectl.h sys/loadavg.h \
     sys/port.h sys/port_impl.h sys/acl.h sys/tsol/label.h sys/fsid.h \
-    sys/fstyp.h sys/rctl.h sys/rctl_impl.h sys/sid.h
+    sys/fstyp.h sys/rctl.h sys/rctl_impl.h sys/sid.h sys/mnttab.h sys/mntio.h
 sysdep_headers += rtld_db.h pcsample.h atomic.h bits/machtypes.h door.h \
     ucred.h priv.h zone.h port.h deflt.h procfs.h rctl.h
 headers := $(filter-out sys/sysinfo.h sys/xattr.h, $(headers))
+headers := $(filter-out fstab.h mntent.h, $(headers))
 endif
 
 ifeq ($(subdir),dirent)
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstab.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/fstab.h
deleted file mode 100644 (file)
index ccf49ec..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Copyright (C) 2008 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#error The glibc/linux fstab.h functions are incompatible with OpenSolaris
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent.c
new file mode 100644 (file)
index 0000000..ed7e5c7
--- /dev/null
@@ -0,0 +1 @@
+/* OpenSolaris supports sys/mnttab.h instead of mntent.h.  */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mntent_r.c
new file mode 100644 (file)
index 0000000..ed7e5c7
--- /dev/null
@@ -0,0 +1 @@
+/* OpenSolaris supports sys/mnttab.h instead of mntent.h.  */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mnttab.c b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/mnttab.c
new file mode 100644 (file)
index 0000000..2ce9727
--- /dev/null
@@ -0,0 +1,121 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/ioctl.h>
+#include <sys/mnttab.h>
+#include <sys/mntio.h>
+
+/* Docs: http://docs.sun.com/app/docs/doc/816-5168/resetmnttab-3c  */
+
+#define _MNT_CMP(x, y, f) \
+       (!y->f || (y->f && strcmp (x->f, y->f) == 0))
+
+
+int getmntent (FILE *fp, struct mnttab *mt)
+{
+  struct extmnttab emt;
+  int res = ioctl (fileno (fp), MNTIOC_GETMNTENT, &emt);
+  if (res != 0)
+    return -1;
+
+  mt->mnt_special = emt.mnt_special;
+  mt->mnt_mountp = emt.mnt_mountp;
+  mt->mnt_fstype = emt.mnt_fstype;
+  mt->mnt_mntopts = emt.mnt_mntopts;
+  mt->mnt_time = emt.mnt_time;
+
+  return 0;
+}
+
+
+int getmntany (FILE *fp, struct mnttab *mt, struct mnttab *mtpref)
+{
+  int res;
+  while ((res = getmntent (fp, mt)) == 0)
+    {
+      if (_MNT_CMP (mt, mtpref, mnt_special) &&
+          _MNT_CMP (mt, mtpref, mnt_mountp) &&
+          _MNT_CMP (mt, mtpref, mnt_fstype) &&
+          _MNT_CMP (mt, mtpref, mnt_mntopts) &&
+          _MNT_CMP (mt, mtpref, mnt_time))
+        return 0;
+    }
+
+  return res;
+}
+
+
+int getextmntent (FILE *fp, struct extmnttab *emt, size_t len)
+{
+  int res = ioctl (fileno (fp), MNTIOC_GETMNTENT, emt);
+  if (res != 0)
+    return -1;
+  return 0;
+}
+
+
+char *mntopt (char **opts)
+{
+  char *optsp = *opts;
+
+  /* Strip leading spaces.  */
+  while (*optsp == ' ')
+    optsp++;
+
+  /* Find comma.  */
+  char *ret = optsp;
+  while (*optsp != ',' && *optsp != '\0')
+    optsp++;
+
+  /* Replace comma with null terminator.  */
+  if (*optsp == ',')
+    optsp++;
+  *opts = optsp;
+
+  return ret;
+}
+
+
+char * hasmntopt (struct mnttab *mt, char *opt)
+{
+  /* We make a copy of mnt_mntopts since we modify it.  */
+  char buf[MNT_LINE_MAX + 1];
+  strncpy (buf, mt->mnt_mntopts, sizeof (buf))[MNT_LINE_MAX] = '\0';
+
+  char *opts = buf;
+  char *optp;
+  size_t len = strlen (opt);
+  while (*(optp = mntopt (&opts)))
+    {
+      /* Check if opt matched, taking into account delimiters (e.g. '=').  */
+      if (strncmp (optp, opt, len) == 0 && !isalnum (optp[len]))
+        return mt->mnt_mntopts + (optp - buf);
+    }
+
+  return NULL;
+}
+
+
+void resetmnttab (FILE *fp)
+{
+  rewind (fp);
+}
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mntio.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mntio.h
new file mode 100644 (file)
index 0000000..f8a6c97
--- /dev/null
@@ -0,0 +1,52 @@
+/* Copyright (C) 2009 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2009.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _SYS_MNTIO_H
+#define _SYS_MNTIO_H
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#define MNTIOC                 ('m' << 8)
+#define MNTIOC_NMNTS           (MNTIOC|1)
+#define MNTIOC_GETDEVLIST      (MNTIOC|2)
+#define MNTIOC_SETTAG          (MNTIOC|3)
+#define MNTIOC_CLRTAG          (MNTIOC|4)
+#define MNTIOC_SHOWHIDDEN      (MNTIOC|6)
+#define MNTIOC_GETMNTENT       (MNTIOC|7)
+
+struct mnttagdesc
+  {
+       unsigned int mtd_major;
+       unsigned int mtd_minor;
+       char *mtd_mntpt;
+       char *mtd_tag;
+  };
+
+struct mntlookup
+  {
+       size_t mtl_mntpt_off;
+       char *mtl_mntpt;
+       major_t mtl_major;
+       minor_t mtl_minor;
+       __ino64_t mtl_ino;
+       char mtl_fstype[_ST_FSTYPSZ];
+  };
+
+#endif /* _SYS_MNTIO_H */
diff --git a/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mnttab.h b/sysdeps/unix/sysv/solaris2/kopensolaris-gnu/sys/mnttab.h
new file mode 100644 (file)
index 0000000..c81ef3a
--- /dev/null
@@ -0,0 +1,70 @@
+/* Copyright (C) 2008 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by David Bartley <dtbartle@csclub.uwaterloo.ca>, 2008.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#ifndef _SYS_MNTTAB_H
+#define _SYS_MNTTAB_H
+
+#include <features.h>
+#include <stdio.h>
+#include <stddef.h>
+#include <paths.h>
+
+#define MNTTAB _PATH_MOUNTED
+#define MNT_LINE_MAX   1024
+
+#define MNT_TOOLONG    1
+#define MNT_TOOMANY    2
+#define MNT_TOOFEW     3
+
+#define mntnull(mp)    ((mp)->mnt_special = (mp)->mnt_mountp = \
+       (mp)->mnt_fstype = (mp)->mnt_mntopts = (mp)->mnt_time = NULL)
+#define putmntent(fd, mp)      (-1)
+
+struct mnttab
+  {
+       char *mnt_special;
+       char *mnt_mountp;
+       char *mnt_fstype;
+       char *mnt_mntopts;
+       char *mnt_time;
+  };
+
+struct extmnttab
+  {
+       char *mnt_special;
+       char *mnt_mountp;
+       char *mnt_fstype;
+       char *mnt_mntopts;
+       char *mnt_time;
+       unsigned int mnt_major;
+       unsigned int mnt_minor;
+  };
+
+__BEGIN_DECLS
+
+extern void resetmnttab (FILE *);
+extern int getmntent (FILE *, struct mnttab *);
+extern int getextmntent (FILE *, struct extmnttab *, size_t);
+extern int getmntany (FILE *, struct mnttab *, struct mnttab *);
+extern char * hasmntopt (struct mnttab *, char *);
+extern char * mntopt (char **);
+
+__END_DECLS
+
+#endif /* _SYS_MNTTAB_H */