X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fmountlist.c;h=ac25ee1892834ff5387cf5b0cd6e0c76ac79931d;hb=refs%2Ftags%2FFILEUTILS-3_16x;hp=044a77055b0b4f38cc20b80aa3c58ceaba1e0ce3;hpb=2bc1fe2a9eef366da542141ab88de3b90460b53b;p=gnulib.git diff --git a/lib/mountlist.c b/lib/mountlist.c index 044a77055..ac25ee189 100644 --- a/lib/mountlist.c +++ b/lib/mountlist.c @@ -129,10 +129,10 @@ extern int errno; /* Return the value of the hexadecimal number represented by CP. No prefix (like '0x') or suffix (like 'h') is expected to be part of CP. */ +/* FIXME: this can overflow */ static int -xatoi (cp) - char *cp; +xatoi (char *cp) { int val; @@ -256,7 +256,7 @@ static char * fsp_to_string (const struct statfs *fsp) { # if defined HAVE_F_FSTYPENAME_IN_STATFS - return xstrdup (fsp->f_fstypename); + return fsp->f_fstypename; # else return fstype_to_string (fsp->f_type); # endif @@ -266,8 +266,7 @@ fsp_to_string (const struct statfs *fsp) #ifdef MOUNTED_VMOUNT /* AIX. */ static char * -fstype_to_string (t) - int t; +fstype_to_string (int t) { struct vfs_ent *e; @@ -282,13 +281,10 @@ fstype_to_string (t) /* Return a list of the currently mounted filesystems, or NULL on error. Add each entry to the tail of the list so that they stay in order. If NEED_FS_TYPE is nonzero, ensure that the filesystem type fields in - the returned list are valid. Otherwise, they might not be. - If ALL_FS is zero, do not return entries for filesystems that - are automounter (dummy) entries. */ + the returned list are valid. Otherwise, they might not be. */ struct mount_entry * -read_filesystem_list (need_fs_type, all_fs) - int need_fs_type, all_fs; +read_filesystem_list (int need_fs_type) { struct mount_entry *mount_list; struct mount_entry *me; @@ -307,17 +303,17 @@ read_filesystem_list (need_fs_type, all_fs) if(listmntent(&mntlist, KMTAB, NULL, NULL) < 0) return NULL; - p = mntlist; - while(p){ + for (p = mntlist; p; p = p->next) { 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_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = -1; *mtail = me; mtail = &me->me_next; - p = p->next; } freemntlist(mntlist); } @@ -336,14 +332,12 @@ read_filesystem_list (need_fs_type, all_fs) while ((mnt = getmntent (fp))) { - if (!all_fs && (!strcmp (mnt->mnt_type, "ignore") - || !strcmp (mnt->mnt_type, "auto"))) - continue; - 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_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); devopt = strstr (mnt->mnt_opts, "dev="); if (devopt) { @@ -373,18 +367,21 @@ read_filesystem_list (need_fs_type, all_fs) entries = getmntinfo (&fsp, MNT_NOWAIT); if (entries < 0) return NULL; - while (entries-- > 0) + for (; entries-- > 0; fsp++) { + char *fs_type = fsp_to_string (fsp); + me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); me->me_devname = xstrdup (fsp->f_mntfromname); me->me_mountdir = xstrdup (fsp->f_mntonname); - me->me_type = fsp_to_string (fsp); + me->me_type = fs_type; + me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ /* Add to the linked list. */ *mtail = me; mtail = &me->me_next; - fsp++; } } #endif /* MOUNTED_GETMNTINFO */ @@ -396,13 +393,15 @@ read_filesystem_list (need_fs_type, all_fs) struct fs_data fsd; while (errno = 0, - 0 <= (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, - (char *) 0))) + 0 < (val = getmnt (&offset, &fsd, sizeof (fsd), NOSTAT_MANY, + (char *) 0))) { me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); me->me_devname = xstrdup (fsd.fd_req.devname); me->me_mountdir = xstrdup (fsd.fd_req.path); me->me_type = gt_names[fsd.fd_req.fstype]; + me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = fsd.fd_req.dev; /* Add to the linked list. */ @@ -439,6 +438,8 @@ read_filesystem_list (need_fs_type, all_fs) 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_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ /* Add to the linked list. */ @@ -484,6 +485,8 @@ read_filesystem_list (need_fs_type, all_fs) me->me_type = xstrdup (typebuf); } # endif + me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); /* Add to the linked list. */ *mtail = me; @@ -512,6 +515,8 @@ read_filesystem_list (need_fs_type, all_fs) me->me_devname = xstrdup ( (*ent)->mt_resource); me->me_mountdir = xstrdup( (*ent)->mt_directory); me->me_type = xstrdup ((*ent)->mt_fstype); + me->me_dummy = ME_DUMMY (me->me_devname, me->me_type); + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ /* Add to the linked list. */ @@ -567,14 +572,12 @@ read_filesystem_list (need_fs_type, all_fs) { while ((ret = getmntent (fp, &mnt)) == 0) { - /* Don't show automounted filesystems twice on e.g., Solaris. */ - if (!all_fs && MNT_IGNORE (&mnt)) - continue; - me = (struct mount_entry *) xmalloc (sizeof (struct mount_entry)); me->me_devname = xstrdup (mnt.mnt_special); me->me_mountdir = xstrdup (mnt.mnt_mountp); me->me_type = xstrdup (mnt.mnt_fstype); + me->me_dummy = MNT_IGNORE (&mnt) != 0; + me->me_remote = ME_REMOTE (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* Magic; means not known yet. */ /* Add to the linked list. */ @@ -618,6 +621,7 @@ read_filesystem_list (need_fs_type, all_fs) { char *host, *path; + me->me_remote = 1; /* Prepend the remote pathname. */ host = thisent + vmp->vmt_data[VMT_HOSTNAME].vmt_off; path = thisent + vmp->vmt_data[VMT_OBJECT].vmt_off; @@ -628,11 +632,13 @@ read_filesystem_list (need_fs_type, all_fs) } else { + me->me_remote = 0; 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_dummy = ME_DUMMY (me->me_devname, me->me_type); me->me_dev = (dev_t) -1; /* vmt_fsid might be the info we want. */ /* Add to the linked list. */ @@ -651,10 +657,13 @@ read_filesystem_list (need_fs_type, all_fs) { int saved_errno = errno; *mtail = NULL; - + while (mount_list) { me = mount_list->me_next; + free (mount_list->me_devname); + free (mount_list->me_mountdir); + /* FIXME: me_type is not always malloced. */ free (mount_list); mount_list = me; }