probe-volume.c revision 342440ec94087b8c751c580ab9ed6c693d31d418
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * probe-volume.c : probe volumes
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
b96e88d7982efdf721857ee071c9e6739bab83e9artem * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#ifdef HAVE_CONFIG_H
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# include <config.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#endif
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <errno.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/ioctl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/types.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/stat.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fcntl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <ctype.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <time.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/time.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/dkio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/cdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/fdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libnvpair.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libfstyp.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/vtoc.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/efi_partition.h>
7544909da5f7d5b467625910225a72e142c4b6b7artem#include <sys/fs/hsfs_spec.h>
7544909da5f7d5b467625910225a72e142c4b6b7artem#include <sys/fs/hsfs_isospec.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <priv.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libhal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <cdutils.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fsutils.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <logger.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmy_dbus_error_free(DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_error_is_set(error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
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 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrtrim_copy(char *src, int len)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *dst, *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = strlen(src);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((dst = calloc(1, len + 1)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem strncpy(dst, src, len);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = dst + len - 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((p >= dst) && (isspace(*p))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *p-- = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (dst);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemset_fstyp_properties (LibHalContext *ctx, const char *udi, const char *fstype, nvlist_t *fsattr)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[256];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *uuid = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *label_orig = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *label = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalChangeSet *cs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((cs = libhal_device_new_changeset (udi)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.fsusage", "filesystem");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.fstype", fstype);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* label */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) nvlist_lookup_string(fsattr, "gen_volume_label", &label_orig);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (label_orig != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem label = rtrim_copy(label_orig, 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((label != NULL) && (label[0] != '\0')) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.label", label);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "info.product", label);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.label", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf (buf, sizeof (buf), "Volume (%s)", fstype);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "info.product", buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(label);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* uuid */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nvlist_lookup_string(fsattr, "gen_uuid", &uuid) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.uuid", uuid);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.uuid", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_commit_changeset (ctx, cs, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_free_changeset (cs);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
7544909da5f7d5b467625910225a72e142c4b6b7artem/*
7544909da5f7d5b467625910225a72e142c4b6b7artem * hsfs/iso9660 contents detection: Video DVD, Video CD, etc.
7544909da5f7d5b467625910225a72e142c4b6b7artem */
7544909da5f7d5b467625910225a72e142c4b6b7artemstatic void
7544909da5f7d5b467625910225a72e142c4b6b7artemhsfs_contents(int fd, off_t probe_offset, LibHalContext *ctx, const char *udi)
7544909da5f7d5b467625910225a72e142c4b6b7artem{
7544909da5f7d5b467625910225a72e142c4b6b7artem size_t secsz = ISO_SECTOR_SIZE;
7544909da5f7d5b467625910225a72e142c4b6b7artem uchar_t buf[ISO_SECTOR_SIZE];
7544909da5f7d5b467625910225a72e142c4b6b7artem int ptbl_lbn, ptbl_size;
7544909da5f7d5b467625910225a72e142c4b6b7artem int off, reloff, readoff;
7544909da5f7d5b467625910225a72e142c4b6b7artem uchar_t *p;
7544909da5f7d5b467625910225a72e142c4b6b7artem char *name;
7544909da5f7d5b467625910225a72e142c4b6b7artem int name_len;
7544909da5f7d5b467625910225a72e142c4b6b7artem int ipe_len;
7544909da5f7d5b467625910225a72e142c4b6b7artem DBusError error;
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem /*
7544909da5f7d5b467625910225a72e142c4b6b7artem * find 1st Primary Volume Descriptor
7544909da5f7d5b467625910225a72e142c4b6b7artem */
7544909da5f7d5b467625910225a72e142c4b6b7artem readoff = probe_offset + ISO_VOLDESC_SEC * secsz;
7544909da5f7d5b467625910225a72e142c4b6b7artem if (pread (fd, buf, secsz, readoff) != secsz) {
7544909da5f7d5b467625910225a72e142c4b6b7artem return;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem while (ISO_DESC_TYPE (buf) != ISO_VD_PVD) {
7544909da5f7d5b467625910225a72e142c4b6b7artem if (ISO_DESC_TYPE (buf) == ISO_VD_EOV) {
7544909da5f7d5b467625910225a72e142c4b6b7artem return;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem readoff += secsz;
7544909da5f7d5b467625910225a72e142c4b6b7artem if (pread (fd, buf, secsz, readoff) != secsz) {
7544909da5f7d5b467625910225a72e142c4b6b7artem return;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem /*
7544909da5f7d5b467625910225a72e142c4b6b7artem * PVD contains size and offset of the LSB/MSB path table
7544909da5f7d5b467625910225a72e142c4b6b7artem */
7544909da5f7d5b467625910225a72e142c4b6b7artem ptbl_size = ISO_PTBL_SIZE (buf);
7544909da5f7d5b467625910225a72e142c4b6b7artem#if defined(_LITTLE_ENDIAN)
7544909da5f7d5b467625910225a72e142c4b6b7artem ptbl_lbn = ISO_PTBL_MAN_LS (buf);
7544909da5f7d5b467625910225a72e142c4b6b7artem#else
7544909da5f7d5b467625910225a72e142c4b6b7artem ptbl_lbn = ISO_PTBL_MAN_MS (buf);
7544909da5f7d5b467625910225a72e142c4b6b7artem#endif
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem /*
7544909da5f7d5b467625910225a72e142c4b6b7artem * Look through path table entries
7544909da5f7d5b467625910225a72e142c4b6b7artem */
7544909da5f7d5b467625910225a72e142c4b6b7artem readoff = probe_offset + ptbl_lbn * secsz;
7544909da5f7d5b467625910225a72e142c4b6b7artem if (pread (fd, buf, secsz, readoff) != secsz) {
7544909da5f7d5b467625910225a72e142c4b6b7artem return;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem dbus_error_init (&error);
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem for (off = reloff = 0;
7544909da5f7d5b467625910225a72e142c4b6b7artem off < ptbl_size;
7544909da5f7d5b467625910225a72e142c4b6b7artem off += ipe_len, reloff += ipe_len) {
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem /* load sectors on demand */
7544909da5f7d5b467625910225a72e142c4b6b7artem if (reloff >= secsz) {
7544909da5f7d5b467625910225a72e142c4b6b7artem readoff += secsz;
7544909da5f7d5b467625910225a72e142c4b6b7artem if (pread (fd, buf, secsz, readoff) != secsz) {
7544909da5f7d5b467625910225a72e142c4b6b7artem break;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem reloff -= secsz;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem p = buf + reloff;
7544909da5f7d5b467625910225a72e142c4b6b7artem name_len = IPE_NAME_LEN(p);
7544909da5f7d5b467625910225a72e142c4b6b7artem ipe_len = IPE_FPESIZE + name_len + (name_len % 2);
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem /* only interested in root directories */
7544909da5f7d5b467625910225a72e142c4b6b7artem if (IPE_PARENT_NO (p) != 1) {
7544909da5f7d5b467625910225a72e142c4b6b7artem continue;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem if ((name_len < 2) || (name_len > IDE_MAX_NAME_LEN)) {
7544909da5f7d5b467625910225a72e142c4b6b7artem continue;
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem name = (char *)IPE_NAME (p);
7544909da5f7d5b467625910225a72e142c4b6b7artem if (strncasecmp (name, "VIDEO_TS", min (8, name_len)) == 0) {
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_device_set_property_bool (ctx, udi,
7544909da5f7d5b467625910225a72e142c4b6b7artem "volume.disc.is_videodvd", TRUE, &error);
7544909da5f7d5b467625910225a72e142c4b6b7artem } else if (strncasecmp (name, "VCD", min (3, name_len)) == 0) {
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_device_set_property_bool (ctx, udi,
7544909da5f7d5b467625910225a72e142c4b6b7artem "volume.disc.is_vcd", TRUE, &error);
7544909da5f7d5b467625910225a72e142c4b6b7artem } else if (strncasecmp (name, "SVCD", min (4, name_len)) == 0) {
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_device_set_property_bool (ctx, udi,
7544909da5f7d5b467625910225a72e142c4b6b7artem "volume.disc.is_svcd", TRUE, &error);
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem my_dbus_error_free (&error);
7544909da5f7d5b467625910225a72e142c4b6b7artem}
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artemstatic dbus_bool_t
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artemprobe_disc (int fd, LibHalContext *ctx, const char *udi, dbus_bool_t *has_data,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dbus_bool_t *has_audio)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_info_t di;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int profile;
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dbus_bool_t is_blank, is_appendable, is_rewritable;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *disc_type = "cd_rom";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem uint64_t capacity = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalChangeSet *cs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (get_disc_info (fd, &di)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_blank = (di.disc_status == 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_appendable = (di.disc_status == 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = (di.erasable != 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_blank = is_appendable = is_rewritable = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (get_current_profile (fd, &profile)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (profile) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x08: /* CD-ROM */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "cd_rom";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x09: /* CD-R */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "cd_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x0A: /* CD-RW */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "cd_rw";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x10: /* DVD-ROM */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_rom";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x11: /* DVD-R Sequential */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x12: /* DVD-RAM */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_ram";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x13: /* DVD-RW Restricted Overwrite */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_rw";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x14: /* DVD-RW Sequential */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_rw";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x1A: /* DVD+RW */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_plus_rw";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x1B: /* DVD+R */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_plus_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x2B: /* DVD+R Double Layer */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "dvd_plus_r_dl";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x40: /* BD-ROM */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "bd_rom";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x41: /* BD-R Sequential */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "bd_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x42: /* BD-R Random */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "bd_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x43: /* BD-RE */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "bd_re";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x50: /* HD DVD-ROM */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "hddvd_rom";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x51: /* HD DVD-R */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "hddvd_r";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 0x52: /* HD DVD-Rewritable */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem disc_type = "hddvd_rw";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_rewritable = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) get_disc_capacity_for_profile(fd, profile, &capacity);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *has_audio = *has_data = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!is_blank) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem uchar_t smalltoc[12];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem size_t toc_size;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem uchar_t *toc, *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * XXX for some reason CDROMREADTOCENTRY fails on video DVDs,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but extracting the toc directly works okay.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!read_toc(fd, 0, 1, 4, smalltoc)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG(("read_toc failed"));
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *has_data = B_TRUE; /* probe for fs anyway */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem toc_size = smalltoc[0] * 256 + smalltoc[1] + 2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem toc = (uchar_t *)calloc(1, toc_size);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (toc == NULL || !read_toc(fd, 0, 1, toc_size, toc)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("read_toc again failed"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (p = &toc[4]; p < (toc + toc_size); p += 8) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* skip leadout */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p[2] == 0xAA) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p[1] & 4) {
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *has_data = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *has_audio = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(toc);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((cs = libhal_device_new_changeset (udi)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_string (cs, "volume.disc.type", disc_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "volume.disc.is_blank", is_blank);
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem libhal_changeset_set_property_bool (cs, "volume.disc.has_audio", *has_audio);
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem libhal_changeset_set_property_bool (cs, "volume.disc.has_data", *has_data);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "volume.disc.is_appendable", is_appendable);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_bool (cs, "volume.disc.is_rewritable", is_rewritable);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_changeset_set_property_uint64 (cs, "volume.disc.capacity", capacity);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_changeset_set_property_bool (cs, "volume.disc.is_videodvd", FALSE);
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_changeset_set_property_bool (cs, "volume.disc.is_vcd", FALSE);
7544909da5f7d5b467625910225a72e142c4b6b7artem libhal_changeset_set_property_bool (cs, "volume.disc.is_svcd", FALSE);
7544909da5f7d5b467625910225a72e142c4b6b7artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_commit_changeset (ctx, cs, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_free_changeset (cs);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
7544909da5f7d5b467625910225a72e142c4b6b7artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdrop_privileges ()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem priv_set_t *pPrivSet = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem priv_set_t *lPrivSet = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Start with the 'basic' privilege set and then remove any
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * of the 'basic' privileges that will not be needed.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((pPrivSet = priv_str_to_set("basic", ",", NULL)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Clear privileges we will not need from the 'basic' set */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_delset(pPrivSet, PRIV_FILE_LINK_ANY);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_delset(pPrivSet, PRIV_PROC_INFO);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_delset(pPrivSet, PRIV_PROC_SESSION);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_delset(pPrivSet, PRIV_PROC_EXEC);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_delset(pPrivSet, PRIV_PROC_FORK);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* for uscsi */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_addset(pPrivSet, PRIV_SYS_DEVICES);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* to open logindevperm'd devices */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) priv_addset(pPrivSet, PRIV_FILE_DAC_READ);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Set the permitted privilege set. */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (setppriv(PRIV_SET, PRIV_PERMITTED, pPrivSet) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Clear the limit set. */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((lPrivSet = priv_allocset()) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem priv_emptyset(lPrivSet);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (setppriv(PRIV_SET, PRIV_LIMIT, lPrivSet) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem priv_freeset(lPrivSet);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmain (int argc, char *argv[])
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int fd, rfd;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *device_file, *raw_device_file;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *devpath, *rdevpath;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t is_dos;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int dos_num;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalContext *ctx = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *conn;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *parent_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *storage_device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *is_disc_str;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int fdc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t is_disc = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_bool_t is_floppy = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem unsigned int block_size;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t vol_size;
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dbus_bool_t has_data = TRUE; /* probe for fs by default */
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dbus_bool_t has_audio = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *partition_scheme = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t partition_start = 0;
89522cbb2ae82987e4ab4a5275572d961a835dbaartem int partition_number = 0;
342440ec94087b8c751c580ab9ed6c693d31d418Prasad Singamsetty struct extvtoc vtoc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dk_gpt_t *gpt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct dk_minfo mi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i, dos_cnt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fstyp_handle_t fstyp_handle;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem off_t probe_offset = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_volumes;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **volumes;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_uint64_t v_start;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *fstype;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nvlist_t *fsattr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fd = rfd = -1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udi = getenv ("UDI")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((device_file = getenv ("HAL_PROP_BLOCK_DEVICE")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((raw_device_file = getenv ("HAL_PROP_BLOCK_SOLARIS_RAW_DEVICE")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
422ee27718423fbe84117ddd114a5c5e8699a6daartem if (!dos_to_dev(raw_device_file, &rdevpath, &dos_num)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rdevpath = raw_device_file;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(is_dos = dos_to_dev(device_file, &devpath, &dos_num))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devpath = device_file;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((parent_udi = getenv ("HAL_PROP_INFO_PARENT")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((storage_device = getenv ("HAL_PROP_BLOCK_STORAGE_DEVICE")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_disc_str = getenv ("HAL_PROP_VOLUME_IS_DISC");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_disc_str != NULL && strcmp (is_disc_str, "true") == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_disc = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_disc = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drop_privileges ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem setup_logger ();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((ctx = libhal_ctx_init_direct (&error)) == NULL)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("Doing probe-volume for %s\n", device_file));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fd = open (devpath, O_RDONLY | O_NONBLOCK);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fd < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rfd = open (rdevpath, O_RDONLY | O_NONBLOCK);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rfd < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* if it's a floppy with no media, bail out */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (ioctl(rfd, FDGETCHANGE, &fdc) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_floppy = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fdc & FDGC_CURRENT) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* block size and total size */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (ioctl(rfd, DKIOCGMEDIAINFO, &mi) != -1) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem block_size = mi.dki_lbsize;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem vol_size = mi.dki_capacity * block_size;
b96e88d7982efdf721857ee071c9e6739bab83e9artem } else if (errno == ENXIO) {
b96e88d7982efdf721857ee071c9e6739bab83e9artem /* driver supports ioctl, but media is not available */
b96e88d7982efdf721857ee071c9e6739bab83e9artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
b96e88d7982efdf721857ee071c9e6739bab83e9artem /* driver does not support ioctl, e.g. lofi */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem block_size = 512;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem vol_size = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_int (ctx, udi, "volume.block_size", block_size, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_uint64 (ctx, udi, "volume.size", vol_size, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_disc) {
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem if (!probe_disc (rfd, ctx, udi, &has_data, &has_audio)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("probe_disc failed, skipping fstyp"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem /* with audio present, create volume even if fs probing fails */
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem if (has_audio) {
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem ret = 0;
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem if (!has_data) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto skip_fs;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't support partitioned floppy */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_floppy) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto skip_part;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * first get partitioning info
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_dos) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* for a dos drive find partition offset */
422ee27718423fbe84117ddd114a5c5e8699a6daartem if (!find_dos_drive(fd, dos_num, block_size, &probe_offset)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_scheme = "mbr";
422ee27718423fbe84117ddd114a5c5e8699a6daartem partition_start = (dbus_uint64_t)probe_offset;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_number = dos_num;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
342440ec94087b8c751c580ab9ed6c693d31d418Prasad Singamsetty if ((partition_number = read_extvtoc(rfd, &vtoc)) >= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!vtoc_one_slice_entire_disk(&vtoc)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_scheme = "smi";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (partition_number < vtoc.v_nparts) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (vtoc.v_part[partition_number].p_size == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("zero size partition"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_start = vtoc.v_part[partition_number].p_start * block_size;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if ((partition_number = efi_alloc_and_read(rfd, &gpt)) >= 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_scheme = "gpt";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (partition_number < gpt->efi_nparts) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (gpt->efi_parts[partition_number].p_size == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("zero size partition"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_start = gpt->efi_parts[partition_number].p_start * block_size;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem efi_free(gpt);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem probe_offset = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (partition_scheme != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_string (ctx, udi, "volume.partition.scheme", partition_scheme, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_int (ctx, udi, "volume.partition.number", partition_number, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_uint64 (ctx, udi, "volume.partition.start", partition_start, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_bool (ctx, udi, "volume.is_partition", TRUE, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_set_property_bool (ctx, udi, "volume.is_partition", FALSE, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * ignore duplicate partitions
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((volumes = libhal_manager_find_device_string_match (
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ctx, "block.storage_device", storage_device, &num_volumes, &error)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_volumes; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (udi, volumes[i]) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue; /* skip self */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem v_start = libhal_device_get_property_uint64 (ctx, volumes[i], "volume.partition.start", &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (dbus_error_is_set(&error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (v_start == partition_start) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("duplicate partition"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array (volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemskip_part:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * now determine fs type
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem * XXX We could get better performance from block device,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem * but for now we use raw device because:
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem * - fstyp_udfs has a bug that it only works on raw
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem *
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem * - sd has a bug that causes extremely slow reads
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem * and incorrect probing of hybrid audio/data media
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem if (fstyp_init(rfd, probe_offset, NULL, &fstyp_handle) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("fstyp_init failed"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((fstyp_ident(fstyp_handle, NULL, &fstype) != 0) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (fstyp_get_attr(fstyp_handle, &fsattr) != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_DEBUG (("fstyp ident or get_attr failed"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fstyp_fini(fstyp_handle);
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem set_fstyp_properties (ctx, udi, fstype, fsattr);
7544909da5f7d5b467625910225a72e142c4b6b7artem
7544909da5f7d5b467625910225a72e142c4b6b7artem if (strcmp (fstype, "hsfs") == 0) {
7544909da5f7d5b467625910225a72e142c4b6b7artem hsfs_contents (fd, probe_offset, ctx, udi);
7544909da5f7d5b467625910225a72e142c4b6b7artem }
7544909da5f7d5b467625910225a72e142c4b6b7artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fstyp_fini(fstyp_handle);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemskip_fs:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (fd >= 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem close (fd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rfd >= 0)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem close (rfd);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (ctx != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my_dbus_error_free (&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_shutdown (ctx, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free (ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ret;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}