#include <stdlib.h>
#include <errno.h>
#include <tsol/label.h>
#include <bsm/devices.h>
blrange_t *
getdevicerange(const char *dev)
{
int err;
char *lstr;
devalloc_t *da;
devmap_t *dm;
blrange_t *range;
errno = 0;
if ((range = malloc(sizeof (blrange_t))) == NULL)
return (NULL);
if ((range->lower_bound = blabel_alloc()) == NULL) {
free(range);
return (NULL);
}
if ((range->upper_bound = blabel_alloc()) == NULL) {
blabel_free(range->lower_bound);
free(range);
return (NULL);
}
setdaent();
if ((da = getdanam((char *)dev)) == NULL) {
setdmapent();
if ((dm = getdmapdev((char *)dev)) != NULL) {
da = getdanam(dm->dmap_devname);
freedmapent(dm);
}
enddmapent();
}
enddaent();
if (da == NULL) {
bsllow(range->lower_bound);
bslhigh(range->upper_bound);
} else {
lstr = kva_match(da->da_devopts, DAOPT_MINLABEL);
if (lstr == NULL) {
bsllow(range->lower_bound);
} else if (stobsl(lstr, range->lower_bound, NO_CORRECTION,
&err) == 0) {
blabel_free(range->lower_bound);
blabel_free(range->upper_bound);
free(range);
errno = ENOTSUP;
return (NULL);
}
lstr = kva_match(da->da_devopts, DAOPT_MAXLABEL);
if (lstr == NULL) {
bslhigh(range->upper_bound);
} else if (stobsl(lstr, range->upper_bound, NO_CORRECTION,
&err) == 0) {
blabel_free(range->lower_bound);
blabel_free(range->upper_bound);
free(range);
errno = ENOTSUP;
return (NULL);
}
freedaent(da);
}
return (range);
}