/* * Iterates through each available disk on the system. For each free * dmgt_disk_t *, runs the given function with the dmgt_disk_t * as * the first arg and the given void * as the second arg. */ int dmgt_avail_disk_iter(dmgt_disk_iter_f func, void *data) { int error = 0; int filter[] = { DM_DT_FIXED, -1 }; /* Search for fixed disks */ dm_descriptor_t *disks = dm_get_descriptors(DM_DRIVE, filter, &error); if (error) { handle_error("unable to communicate with libdiskmgt"); } else { int i; /* For each disk... */ for (i = 0; disks != NULL && disks[i] != NULL; i++) { dm_descriptor_t disk = (dm_descriptor_t)disks[i]; int online; /* Reset error flag for each disk */ error = 0; /* Is this disk online? */ online = get_disk_online(disk, &error); if (!error && online) { /* Get a dmgt_disk_t for this dm_descriptor_t */ dmgt_disk_t *dp = get_disk(disk, &error); if (!error) { /* * If this disk or any of its * slices is usable... */ if (!dp->in_use || zjni_count_elements( (void **)dp->slices) != 0) { /* Run the given function */ if (func(dp, data)) { error = -1; } dmgt_free_disk(dp); #ifdef DEBUG } else { (void) fprintf(stderr, "disk " "has no available slices: " "%s\n", dp->name); #endif } } } } dm_free_descriptors(disks); } return (error); }
int main(int argc, char *argv[]) { di_opts_t opts = { B_FALSE, B_FALSE }; char c; dm_descriptor_t *media; int error, ii; int filter[] = { DM_DT_FIXED, -1 }; while ((c = getopt(argc, argv, "Hp")) != EOF) { switch (c) { case 'H': opts.di_scripted = B_TRUE; break; case 'p': opts.di_parseable = B_TRUE; break; default: return (1); } } error = 0; if ((media = dm_get_descriptors(DM_MEDIA, filter, &error)) == NULL) { fprintf(stderr, "Error from dm_get_descriptors: %d\n", error); return (1); } if (!opts.di_scripted) { printf("TYPE DISK VID PID" " SIZE REMV\n"); } for (ii = 0; media != NULL && media[ii] != NULL; ii++) print_disks(media[ii], &opts); dm_free_descriptors(media); return (0); }