da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1985-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mounted filesystem scan support
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * where are the standards when you really need them
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the original interface just had mode
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define FIXARGS(p,m,s) do { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((p)&&*(p)!='/') { \
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset(register Header_t* hp, const char* fs, const char* dir, const char* type, const char* options)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*++x && *x != '\\')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*x == '(')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(hp->buf, sizeof(hp->buf) - 1, "%s:%*.*s", x + 1, x - fs, x - fs, fs);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (GetVolumeInformation(drive, 0, 0, &vser, &len, &flags, hp->typ, sizeof(hp->typ) - 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = ',';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * what a crappy interface
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * data returned in static buffer -- ok
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * big chunk of allocated memory that cannot be freed -- come on
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * *and* netbsd changed the interface somewhere along the line
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * private interface? my bad -- public interface? par for the bsd course
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <sys/param.h> /* expect some macro redefinitions here */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define TYPE(f) (strchr((f)->f_mntfromname,':')?"nfs":"ufs")
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin unsigned long flag;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin const char* name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin 0, "unknown",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int i;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register unsigned long flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n += sfsprintf(mp->opt + n, sizeof(mp->opt) - n - 1, ",%s", options[i].name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->next->f_mntfromname, mp->next->f_mntonname, TYPE(mp->next), n ? (mp->opt + 1) : (char*)0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic const char* type[] =
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = mntctl(MCTL_QUERY, sizeof(Handle_t) + SIZE, &mp->info)) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* o;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (vmt2datasize(mp->next, VMT_HOST) && (s = vmt2dataptr(mp->next, VMT_HOST)) && !streq(s, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(mp->remote, sizeof(mp->remote) - 1, "%s:%s", s, vmt2dataptr(mp->next, VMT_OBJECT));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "aix";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "nfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "jfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "cdrom";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "sfs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "cachefs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "nfs3";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = "autofs";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsprintf(t = mp->type, sizeof(mp->type), "aix%+d", mp->next->vmt_gfstype);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, s, vmt2dataptr(mp->next, VMT_STUB), t, o);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->next = (struct vmount*)((char*)mp->next + mp->next->vmt_length);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if _lib_getmntent && ( _hdr_mntent || _sys_mntent && !_sys_mnttab )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__STDPP__directive) && defined(__STDPP__hide)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if defined(__STDPP__directive) && defined(__STDPP__hide)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mnt->mnt_fsname, mnt->mnt_dir, mnt->mnt_type, OPTIONS(mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define MNTBUFSIZE (sizeof(struct w_mnth)+16*sizeof(struct w_mntent))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintypedef struct
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = w_getmntent(mp->buf, sizeof(mp->buf))) > 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt = (struct mntent*)(((struct w_mnth*)mp->buf) + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return (void*)mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((mp->count = w_getmntent(mp->buf, sizeof(mp->buf))) <= 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->mnt = (struct mntent*)(((struct w_mnth*)mp->buf) + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (sfread(mp->fp, &mp->buf, sizeof(mp->buf)) == sizeof(mp->buf))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, stat(mp->mnt->mnt_dir, &st) ? FS_default : strncpy(typ, fmtfs(&st), sizeof(typ) - 1), OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* m;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int q;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int x;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\'':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (q == c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!q)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\t':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s != b && !q) switch (++x)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = s = m = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (x >= 3)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&mp->hdr, mp->mnt->mnt_fsname, mp->mnt->mnt_dir, mp->mnt->mnt_type, OPTIONS(mp->mnt));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s < m)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * currently no write
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;