X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fmountlist.c;h=37c3d1bddbe0c5748dc8d169780cbb662a95ee7a;hb=60d00c0cbda79b3c1715e38456a02656f6e6e707;hp=78955f709d3dfff4a2d5cc3f2bf0a564e1b1b122;hpb=d87c39464604e74f580c7fae835be31a4c125c36;p=gnulib.git diff --git a/lib/mountlist.c b/lib/mountlist.c index 78955f709..37c3d1bdd 100644 --- a/lib/mountlist.c +++ b/lib/mountlist.c @@ -12,8 +12,12 @@ 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif #include #include @@ -24,7 +28,7 @@ #else void free (); #endif -#if defined(USG) || defined(STDC_HEADERS) +#if defined(STDC_HEADERS) || defined(HAVE_STRING_H) #include #else #include @@ -36,6 +40,15 @@ char *xrealloc (); char *xstrdup (); void error (); +#ifdef HAVE_SYS_PARAM_H +#include +#endif + +#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */ +# include +# include +#endif /* MOUNTED_GETFSSTAT */ + #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ #include #if !defined(MOUNTED) @@ -53,7 +66,6 @@ void error (); #endif #ifdef MOUNTED_GETMNT /* Ultrix. */ -#include #include #include #endif @@ -68,6 +80,10 @@ void error (); #include #endif +#ifdef MOUNTED_LISTMNTENT +#include +#endif + #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ #include #endif @@ -77,6 +93,12 @@ void error (); #include #endif +#ifdef DOLPHIN +/* So special that it's not worth putting this in autoconf. */ +#undef MOUNTED_FREAD_FSTYP +#define MOUNTED_GETMNTTBL +#endif + #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ /* Return the value of the hexadecimal number represented by CP. No prefix (like '0x') or suffix (like 'h') is expected to be @@ -87,7 +109,7 @@ xatoi (cp) char *cp; { int val; - + val = 0; while (*cp) { @@ -105,19 +127,17 @@ xatoi (cp) } #endif /* MOUNTED_GETMNTENT1. */ -#ifdef MOUNTED_GETMNTINFO /* 4.4BSD. */ +#if defined (MOUNTED_GETMNTINFO) && !defined (__NetBSD__) static char * fstype_to_string (t) short t; { switch (t) { - case MOUNT_UFS: - return "ufs"; - case MOUNT_NFS: - return "nfs"; +#ifdef MOUNT_PC case MOUNT_PC: return "pc"; +#endif #ifdef MOUNT_MFS case MOUNT_MFS: return "mfs"; @@ -134,6 +154,70 @@ fstype_to_string (t) case MOUNT_TMP: return "tmp"; #endif +#ifdef MOUNT_UFS + case MOUNT_UFS: + return "ufs" ; +#endif +#ifdef MOUNT_NFS + case MOUNT_NFS: + return "nfs" ; +#endif +#ifdef MOUNT_MSDOS + case MOUNT_MSDOS: + return "msdos" ; +#endif +#ifdef MOUNT_LFS + case MOUNT_LFS: + return "lfs" ; +#endif +#ifdef MOUNT_LOFS + case MOUNT_LOFS: + return "lofs" ; +#endif +#ifdef MOUNT_FDESC + case MOUNT_FDESC: + return "fdesc" ; +#endif +#ifdef MOUNT_PORTAL + case MOUNT_PORTAL: + return "portal" ; +#endif +#ifdef MOUNT_NULL + case MOUNT_NULL: + return "null" ; +#endif +#ifdef MOUNT_UMAP + case MOUNT_UMAP: + return "umap" ; +#endif +#ifdef MOUNT_KERNFS + case MOUNT_KERNFS: + return "kernfs" ; +#endif +#ifdef MOUNT_PROCFS + case MOUNT_PROCFS: + return "procfs" ; +#endif +#ifdef MOUNT_AFS + case MOUNT_AFS: + return "afs" ; +#endif +#ifdef MOUNT_CD9660 + case MOUNT_CD9660: + return "cd9660" ; +#endif +#ifdef MOUNT_UNION + case MOUNT_UNION: + return "union" ; +#endif +#ifdef MOUNT_DEVFS + case MOUNT_DEVFS: + return "devfs" ; +#endif +#ifdef MOUNT_EXT2FS + case MOUNT_EXT2FS: + return "ext2fs" ; +#endif default: return "?"; } @@ -175,6 +259,36 @@ read_filesystem_list (need_fs_type, all_fs) me->me_next = NULL; mount_list = mtail = me; +#ifdef MOUNTED_LISTMNTENT + { + struct tabmntent *mntlist, *p; + struct mntent *mnt; + struct mount_entry *me; + + /* the third and fourth arguments could be used to filter mounts, + but Crays doesn't seem to have any mounts that we want to + remove. Specifically, automount create normal NFS mounts. + */ + + if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0) + return NULL; + p = mntlist; + while(p){ + mnt = p->ment; + me = (struct mount_entry*) xmalloc(sizeof (struct mount_entry)); + me->me_devname = xstrdup(mnt->mnt_fsname); + me->me_mountdir = xstrdup(mnt->mnt_dir); + me->me_type = xstrdup(mnt->mnt_type); + me->me_dev = -1; + me->me_next = NULL; + mtail->me_next = me; + mtail = me; + p = p->next; + } + freemntlist(mntlist); + } +#endif + #ifdef MOUNTED_GETMNTENT1 /* 4.3BSD, SunOS, HP-UX, Dynix, Irix. */ { struct mntent *mnt; @@ -205,7 +319,7 @@ read_filesystem_list (need_fs_type, all_fs) me->me_dev = xatoi (devopt + 4); } else - me->me_dev = -1; /* Magic; means not known yet. */ + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_next = NULL; /* Add to the linked list. */ @@ -231,8 +345,12 @@ read_filesystem_list (need_fs_type, all_fs) me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); me->me_devname = xstrdup (fsp->f_mntfromname); me->me_mountdir = xstrdup (fsp->f_mntonname); +#ifdef __NetBSD__ + me->me_type = xstrdup (fsp->f_fstypename); +#else me->me_type = fstype_to_string (fsp->f_type); - me->me_dev = -1; /* Magic; means not known yet. */ +#endif + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_next = NULL; /* Add to the linked list. */ @@ -268,6 +386,43 @@ read_filesystem_list (need_fs_type, all_fs) } #endif /* MOUNTED_GETMNT. */ +#if defined (MOUNTED_GETFSSTAT) /* __alpha running OSF_1 */ + { + int numsys, counter, bufsize; + struct statfs *stats; + + numsys = getfsstat ((struct statfs *)0, 0L, MNT_WAIT); + if (numsys < 0) + return (NULL); + + bufsize = (1 + numsys) * sizeof (struct statfs); + stats = (struct statfs *)xmalloc (bufsize); + numsys = getfsstat (stats, bufsize, MNT_WAIT); + + if (numsys < 0) + { + free (stats); + return (NULL); + } + + for (counter = 0; counter < numsys; counter++) + { + me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); + me->me_devname = xstrdup (stats[counter].f_mntfromname); + me->me_mountdir = xstrdup (stats[counter].f_mntonname); + me->me_type = mnt_names[stats[counter].f_type]; + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ + me->me_next = NULL; + + /* Add to the linked list. */ + mtail->me_next = me; + mtail = me; + } + + free (stats); + } +#endif /* MOUNTED_GETFSSTAT */ + #if defined (MOUNTED_FREAD) || defined (MOUNTED_FREAD_FSTYP) /* SVR[23]. */ { struct mnttab mnt; @@ -289,7 +444,7 @@ read_filesystem_list (need_fs_type, all_fs) strcpy (me->me_devname + 5, mnt.mt_dev); #endif me->me_mountdir = xstrdup (mnt.mt_filsys); - me->me_dev = -1; /* Magic; means not known yet. */ + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_type = ""; #ifdef GETFSTYP /* SVR3. */ if (need_fs_type) @@ -314,6 +469,26 @@ read_filesystem_list (need_fs_type, all_fs) } #endif /* MOUNTED_FREAD || MOUNTED_FREAD_FSTYP. */ +#ifdef MOUNTED_GETMNTTBL /* DolphinOS goes it's own way */ + { + struct mntent **mnttbl=getmnttbl(),**ent; + for (ent=mnttbl;*ent;ent++) + { + me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); + me->me_devname = xstrdup ( (*ent)->mt_resource); + me->me_mountdir = xstrdup( (*ent)->mt_directory); + me->me_type = xstrdup ((*ent)->mt_fstype); + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ + me->me_next = NULL; + + /* Add to the linked list. */ + mtail->me_next = me; + mtail = me; + } + endmnttbl(); + } +#endif + #ifdef MOUNTED_GETMNTENT2 /* SVR4. */ { struct mnttab mnt; @@ -331,7 +506,7 @@ read_filesystem_list (need_fs_type, all_fs) me->me_devname = xstrdup (mnt.mnt_special); me->me_mountdir = xstrdup (mnt.mnt_mountp); me->me_type = xstrdup (mnt.mnt_fstype); - me->me_dev = -1; /* Magic; means not known yet. */ + me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ me->me_next = NULL; /* Add to the linked list. */ @@ -378,12 +553,12 @@ read_filesystem_list (need_fs_type, all_fs) } else { - me->me_devname = xstrdup (thisent + + me->me_devname = xstrdup (thisent + vmp->vmt_data[VMT_OBJECT].vmt_off); } me->me_mountdir = xstrdup (thisent + vmp->vmt_data[VMT_STUB].vmt_off); me->me_type = xstrdup (fstype_to_string (vmp->vmt_gfstype)); - me->me_dev = -1; /* vmt_fsid might be the info we want. */ + me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ me->me_next = NULL; /* Add to the linked list. */