View | Details | Raw Unified | Return to bug 221743
Collapse All | Expand All

(-)getmntinfo.c (-13 / +50 lines)
Lines 38-43 Link Here
38
#include <sys/mount.h>
38
#include <sys/mount.h>
39
#include <stdlib.h>
39
#include <stdlib.h>
40
40
41
#define MAX_ATTEMPTS 3
42
#define EXTRA_FS 16
43
41
/*
44
/*
42
 * Return information about mounted filesystems.
45
 * Return information about mounted filesystems.
43
 */
46
 */
Lines 45-66 Link Here
45
getmntinfo(struct statfs **mntbufp, int mode)
48
getmntinfo(struct statfs **mntbufp, int mode)
46
{
49
{
47
	static struct statfs *mntbuf;
50
	static struct statfs *mntbuf;
48
	static int mntsize;
49
	static long bufsize;
51
	static long bufsize;
52
	struct statfs *newbuf;
53
	long newsize;
54
	int n_fs;
55
	int n_try = 0;
56
	
50
57
51
	if (mntsize <= 0 && (mntsize = getfsstat(0, 0, MNT_NOWAIT)) < 0)
58
	/* Get the current list of available filesystems */
52
		return (0);
59
	n_fs = getfsstat(NULL, 0, MNT_NOWAIT);
53
	if (bufsize > 0 && (mntsize = getfsstat(mntbuf, bufsize, mode)) < 0)
60
	if (n_fs < 0)
54
		return (0);
61
		return (0);
55
	while (bufsize <= mntsize * sizeof(struct statfs)) {
62
56
		if (mntbuf)
63
	do {
57
			free(mntbuf);
64
		int rc;
58
		bufsize = (mntsize + 1) * sizeof(struct statfs);
65
59
		if ((mntbuf = malloc(bufsize)) == NULL)
66
		/* Need room for more statfs in order to detect a growing list */
60
			return (0);
67
		newsize = (n_fs+EXTRA_FS) * sizeof(struct statfs);
61
		if ((mntsize = getfsstat(mntbuf, bufsize, mode)) < 0)
68
	  
69
		if (!mntbuf || bufsize < newsize) {
70
			/* Current buffer is too small -> grow it */
71
		  
72
			if (mntbuf)
73
				newbuf = realloc(mntbuf, newsize);
74
	    		else
75
				newbuf = malloc(newsize);
76
			
77
	    		if (!newbuf) {
78
	      			return (0);
79
			}
80
81
			/* Update stored buf pointer(s) and current size */
82
	    		*mntbufp = mntbuf = newbuf;
83
			bufsize = newsize;
84
		}
85
86
		/* Load filesystem information into buffer */
87
		if ((rc = getfsstat(mntbuf, bufsize, mode)) < 0)
62
			return (0);
88
			return (0);
63
	}
89
		
90
		if (rc <= n_fs) {
91
			/* Got the list of filesystem information */
92
			*mntbufp = mntbuf;
93
			return (rc);
94
		}
95
96
		n_fs = rc;
97
		/* Retry the lookup (more filesystems found) */
98
	} while (n_try++ < MAX_ATTEMPTS);
99
100
	/* The list keeps on growing, give up and just return the ones we found so far */
64
	*mntbufp = mntbuf;
101
	*mntbufp = mntbuf;
65
	return (mntsize);
102
	return (n_fs);
66
}
103
}

Return to bug 221743