1272343Sngie/* $NetBSD: getmntinfo.c,v 1.1 2010/07/26 15:53:00 pooka Exp $ */ 2272343Sngie 3272343Sngie/* 4272343Sngie * Copyright (c) 1989, 1993 5272343Sngie * The Regents of the University of California. All rights reserved. 6272343Sngie * 7272343Sngie * Redistribution and use in source and binary forms, with or without 8272343Sngie * modification, are permitted provided that the following conditions 9272343Sngie * are met: 10272343Sngie * 1. Redistributions of source code must retain the above copyright 11272343Sngie * notice, this list of conditions and the following disclaimer. 12272343Sngie * 2. Redistributions in binary form must reproduce the above copyright 13272343Sngie * notice, this list of conditions and the following disclaimer in the 14272343Sngie * documentation and/or other materials provided with the distribution. 15272343Sngie * 3. Neither the name of the University nor the names of its contributors 16272343Sngie * may be used to endorse or promote products derived from this software 17272343Sngie * without specific prior written permission. 18272343Sngie * 19272343Sngie * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20272343Sngie * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21272343Sngie * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22272343Sngie * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23272343Sngie * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24272343Sngie * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25272343Sngie * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26272343Sngie * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27272343Sngie * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28272343Sngie * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29272343Sngie * SUCH DAMAGE. 30272343Sngie */ 31272343Sngie 32272343Sngie#include <sys/cdefs.h> 33272343Sngie#if defined(LIBC_SCCS) && !defined(lint) 34272343Sngie#if 0 35272343Sngiestatic char sccsid[] = "@(#)getmntinfo.c 8.1 (Berkeley) 6/4/93"; 36272343Sngie#else 37272343Sngie__RCSID("$NetBSD: getmntinfo.c,v 1.1 2010/07/26 15:53:00 pooka Exp $"); 38272343Sngie#endif 39272343Sngie#endif /* LIBC_SCCS and not lint */ 40272343Sngie 41272343Sngie#include <sys/param.h> 42272343Sngie#include <sys/ucred.h> 43272343Sngie#include <sys/mount.h> 44272343Sngie 45272343Sngie#include <rump/rump.h> 46272343Sngie#include <rump/rump_syscalls.h> 47272343Sngie 48272343Sngie#include <assert.h> 49272343Sngie#include <errno.h> 50272343Sngie#include <stdlib.h> 51272343Sngie 52272343Sngie#define getvfsstat(a,b,c) rump_sys_getvfsstat(a,b,c) 53272343Sngie 54272343Sngie/* 55272343Sngie * Return information about mounted filesystems. 56272343Sngie */ 57272343Sngieint 58272343Sngiegetmntinfo(mntbufp, flags) 59272343Sngie struct statvfs **mntbufp; 60272343Sngie int flags; 61272343Sngie{ 62272343Sngie static struct statvfs *mntbuf; 63272343Sngie static int mntsize; 64272343Sngie static size_t bufsize; 65272343Sngie 66272343Sngie _DIAGASSERT(mntbufp != NULL); 67272343Sngie 68272343Sngie if (mntsize <= 0 && 69272343Sngie (mntsize = getvfsstat(NULL, (size_t)0, MNT_NOWAIT)) == -1) 70272343Sngie return (0); 71272343Sngie if (bufsize > 0 && 72272343Sngie (mntsize = getvfsstat(mntbuf, bufsize, flags)) == -1) 73272343Sngie return (0); 74272343Sngie while (bufsize <= mntsize * sizeof(struct statvfs)) { 75272343Sngie if (mntbuf) 76272343Sngie free(mntbuf); 77272343Sngie bufsize = (mntsize + 1) * sizeof(struct statvfs); 78272343Sngie if ((mntbuf = malloc(bufsize)) == NULL) 79272343Sngie return (0); 80272343Sngie if ((mntsize = getvfsstat(mntbuf, bufsize, flags)) == -1) 81272343Sngie return (0); 82272343Sngie } 83272343Sngie *mntbufp = mntbuf; 84272343Sngie return (mntsize); 85272343Sngie} 86