Beispiel #1
0
/*
 * 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);
}
Beispiel #2
0
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);
}