xref: /csrg-svn/lib/libc/gen/getmntinfo.c (revision 46597)
139317Smckusick /*
239317Smckusick  * Copyright (c) 1989 The Regents of the University of California.
339317Smckusick  * All rights reserved.
439317Smckusick  *
542624Sbostic  * %sccs.include.redist.c%
639317Smckusick  */
739317Smckusick 
839317Smckusick #if defined(LIBC_SCCS) && !defined(lint)
9*46597Sdonn static char sccsid[] = "@(#)getmntinfo.c	6.4 (Berkeley) 02/23/91";
1039317Smckusick #endif /* LIBC_SCCS and not lint */
1139317Smckusick 
1239317Smckusick #include <sys/types.h>
1339317Smckusick #include <sys/mount.h>
14*46597Sdonn #include <stdlib.h>
1539317Smckusick 
1639317Smckusick /*
1739317Smckusick  * Return information about mounted filesystems.
1839317Smckusick  */
1939317Smckusick int
2040336Smckusick getmntinfo(mntbufp, flags)
2139317Smckusick 	struct statfs **mntbufp;
2240336Smckusick 	int flags;
2339317Smckusick {
2439317Smckusick 	static struct statfs *mntbuf;
25*46597Sdonn 	static int mntsize;
26*46597Sdonn 	static long bufsize;
2739317Smckusick 
2840336Smckusick 	if (mntsize <= 0 && (mntsize = getfsstat(0, 0, MNT_NOWAIT)) < 0)
2939317Smckusick 		return (0);
3040336Smckusick 	if (bufsize > 0 && (mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
3139317Smckusick 		return (0);
3239317Smckusick 	while (bufsize <= mntsize * sizeof(struct statfs)) {
3339317Smckusick 		if (mntbuf)
3439317Smckusick 			free(mntbuf);
3539317Smckusick 		bufsize = (mntsize + 1) * sizeof(struct statfs);
3639317Smckusick 		if ((mntbuf = (struct statfs *)malloc(bufsize)) == 0)
3739317Smckusick 			return (0);
3840336Smckusick 		if ((mntsize = getfsstat(mntbuf, bufsize, flags)) < 0)
3939317Smckusick 			return (0);
4039317Smckusick 	}
4139317Smckusick 	*mntbufp = mntbuf;
4239317Smckusick 	return (mntsize);
4339317Smckusick }
44