diff options
Diffstat (limited to 'lib/libgeom/geom_getxml.c')
| -rw-r--r-- | lib/libgeom/geom_getxml.c | 32 | 
1 files changed, 13 insertions, 19 deletions
diff --git a/lib/libgeom/geom_getxml.c b/lib/libgeom/geom_getxml.c index 68ff91bcf14f..b27696d21657 100644 --- a/lib/libgeom/geom_getxml.c +++ b/lib/libgeom/geom_getxml.c @@ -39,28 +39,22 @@ char *  geom_getxml()  {  	char *p; -	size_t l; -	int i; +	size_t l = 0; +	int mib[3]; +	size_t sizep; -	l = 1024 * 1024;	/* Start big, realloc back */ +	sizep = sizeof(mib) / sizeof(*mib); +	if (sysctlnametomib("kern.geom.confxml", mib, &sizep) != 0) +		return (NULL); +	if (sysctl(mib, sizep, NULL, &l, NULL, 0) != 0) +		return (NULL); +	l += 4096;  	p = malloc(l); -	if (p) { -		i = sysctlbyname("kern.geom.confxml", p, &l, NULL, 0); -		if (i == 0) { -			p = realloc(p, strlen(p) + 1); -			return (p); -		} +	if (p == NULL) +		return (NULL); +	if (sysctl(mib, sizep, p, &l, NULL, 0) != 0) {  		free(p); -	} -	l = 0; -	i = sysctlbyname("kern.geom.confxml", NULL, &l, NULL, 0); -	if (i != 0)  		return (NULL); -	p = malloc(l + 4096); -	i = sysctlbyname("kern.geom.confxml", p, &l, NULL, 0); -	if (i == 0) { -		p = realloc(p, strlen(p) + 1); -		return (p);  	} -	return (NULL); +	return (reallocf(p, strlen(p) + 1));  }  | 
