probe-storage.c revision 18c2aff776a775d34a4c9893a4c72e0434d68e36
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * probe-storage.c : Probe for storage devices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#pragma ident "%Z%%M% %I% %E% SMI"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/** Check if a filesystem on a special device file is mounted
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @param device_file Special device file, e.g. /dev/cdrom
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * @return TRUE iff there is a filesystem system mounted
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * on the special device file
18c2aff776a775d34a4c9893a4c72e0434d68e36artemget_cdrom_properties_walker (void *arg, int profile, boolean_t is_current)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.cdr", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.cdrw", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvd", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdr", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdram", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdrw", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdrw", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusrw", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusr", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusrdl", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bd", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bdr", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bdre", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvd", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvdr", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvdrw", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.cdr", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.cdrw", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvd", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdr", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdrw", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdram", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusr", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusrw", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.dvdplusrdl", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bd", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bdr", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.bdre", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvd", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvdr", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.hddvdrw", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.cdrom.support_media_changed", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem get_read_write_speeds(fd, &read_speed, &write_speed, &write_speeds, &n_wspeeds, &write_speeds_mem);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_int (cs, "storage.cdrom.read_speed", read_speed);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_int (cs, "storage.cdrom.write_speed", write_speed);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_strlist (cs, "storage.cdrom.write_speeds", (const char **)&wspeeds_mem);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((wspeeds = (char **)calloc(n_wspeeds + 1, sizeof (char *))) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((wspeeds_mem = (char *)calloc(n_wspeeds, WSPLEN)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < n_wspeeds; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (sp = write_speeds, i = 0; sp != NULL; sp = sp->next, i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_strlist (cs, "storage.cdrom.write_speeds", (const char **)wspeeds);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Return a copy of a string without trailing spaces. If 'len' is non-zero,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * it specifies max length, otherwise the string must be null-terminated.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *dst, *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *p-- = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* INQUIRY */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) memset((void *) &cdb, 0, sizeof (union scsi_cdb));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s = rtrim_copy(inq.inq_vid, sizeof (inq.inq_vid))) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "storage.vendor", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s = rtrim_copy(inq.inq_pid, sizeof (inq.inq_pid))) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "storage.model", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s = rtrim_copy(inq.inq_revision, sizeof (inq.inq_revision))) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "storage.firmware_revision", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((s = rtrim_copy(inq.inq_serial, sizeof (inq.inq_serial))) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "storage.serial", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * returns TRUE if diskette is inserted.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * also returns write protection status.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((ioctl(fd, FDGETCHANGE, &chg) == 0) && !(chg & FDGC_CURRENT)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Start with the 'basic' privilege set and then remove any
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * of the 'basic' privileges that will not be needed.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((pPrivSet = priv_str_to_set("basic", ",", NULL)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Clear privileges we will not need from the 'basic' set */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* for uscsi */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* to open logindevperm'd devices */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Set the permitted privilege set. */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (setppriv(PRIV_SET, PRIV_PERMITTED, pPrivSet) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Clear the limit set. */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((device_file = getenv ("HAL_PROP_BLOCK_DEVICE")) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((raw_device_file = getenv ("HAL_PROP_BLOCK_SOLARIS_RAW_DEVICE")) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive_type = getenv ("HAL_PROP_STORAGE_DRIVE_TYPE")) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (argc == 2 && strcmp (argv[1], "--only-check-for-media") == 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((cs = libhal_device_new_changeset (udi)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Doing probe-storage for %s (bus %s) (drive_type %s) (udi=%s) (--only-check-for-media==%d)",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_file, bus, drive_type, udi, only_check_for_media));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((rfd = open (raw_device_file, O_RDONLY | O_NONBLOCK)) < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Cannot open %s: %s", raw_device_file, strerror (errno)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Checking for optical disc on %s", raw_device_file));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (is_floppy) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Checking for floppy on %s", raw_device_file));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't look for partitions on floppy */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Checking for partitions on %s", device_file));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((fd = open (device_file, O_RDONLY | O_NONBLOCK)) < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Cannot open %s: %s", device_file, strerror (errno)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* smi within mbr partition is okay */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (!is_cdrom && (efi_alloc_and_read(rfd, &gpt) >= 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Note: for some reason efi_read takes very long on cdroms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Needs more investigation, skip gpt on cdrom for now.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.no_partitions_hint", !is_partitioned);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "block.no_partitions", !is_partitioned);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "storage.partitioning_scheme", scheme);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.solaris.vtoc_slices", vtoc_slices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_int (cs, "storage.solaris.num_dos_partitions", dos_cnt);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* XXX should only set for removable drives */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.removable.media_available", got_media);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "storage.removable.solaris.read_only", is_write_protected);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fd >= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rfd >= 0) {