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 68ff91b..b27696d 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)); } |