18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER START
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The contents of this file are subject to the terms of the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Common Development and Distribution License (the "License").
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You may not use this file except in compliance with the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * or http://www.opensolaris.org/os/licensing.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * See the License for the specific language governing permissions
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * and limitations under the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * When distributing Covered Code, include this CDDL HEADER in each
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If applicable, add the following below this CDDL HEADER, with the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * fields enclosed by brackets "[]" replaced with your own identifying
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * information: Portions Copyright [yyyy] [name of copyright owner]
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * CDDL HEADER END
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Use is subject to license terms.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdio.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <errno.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <strings.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdarg.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fcntl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libintl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <ctype.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/param.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/types.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/stat.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/mnttab.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dbus/dbus-glib-lowlevel.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libhal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libhal-storage.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "rmm_common.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
0ebe310024a809595007753781dc9969750affbcartem#define RMM_PRINT_DEVICE_WIDTH 20
0ebe310024a809595007753781dc9969750affbcartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemextern int rmm_debug;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic const char *action_strings[] = {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "eject",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "mount",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "remount",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "unmount",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "clear_mounts",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "closetray"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem};
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLibHalContext *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_init(LibHalDeviceAdded devadd_cb, LibHalDeviceRemoved devrem_cb,
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine LibHalDevicePropertyModified propmod_cb, LibHalDeviceCondition cond_cb,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError *error, rmm_error_t *rmm_error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalContext *ctx;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **devices;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int nr;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * setup D-Bus connection
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dbus_conn = dbus_bus_get(DBUS_BUS_SYSTEM, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot get system bus: %s\n", rmm_strerror(error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *rmm_error = RMM_EDBUS_CONNECT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_setup_with_g_main(dbus_conn, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_connection_set_exit_on_disconnect(dbus_conn, B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((ctx = libhal_ctx_new()) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("libhal_ctx_new failed");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *rmm_error = RMM_EHAL_CONNECT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_dbus_connection(ctx, dbus_conn);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * register callbacks
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (devadd_cb != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_added(ctx, devadd_cb);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (devrem_cb != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_removed(ctx, devrem_cb);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (propmod_cb != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_set_device_property_modified(ctx, propmod_cb);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_property_watch_all(ctx, error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property_watch_all failed %s",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_strerror(error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free(ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *rmm_error = RMM_EHAL_CONNECT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine if (cond_cb != NULL) {
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine libhal_ctx_set_device_condition(ctx, cond_cb);
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_ctx_init(ctx, error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("libhal_ctx_init failed: %s", rmm_strerror(error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free(ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *rmm_error = RMM_EHAL_CONNECT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The above functions do not guarantee that HAL is actually running.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Check by invoking a method.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(devices = libhal_get_all_devices(ctx, &nr, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("HAL is not running: %s", rmm_strerror(error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_shutdown(ctx, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_ctx_free(ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *rmm_error = RMM_EHAL_CONNECT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(devices);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_fini(LibHalContext *hal_ctx)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem (void) dbus_connection_unref(dbus_conn);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) libhal_ctx_free(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * find volume from any type of name, similar to the old media_findname()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * returns the LibHalDrive object and a list of LibHalVolume objects.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLibHalDrive *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_volume_find(LibHalContext *hal_ctx, const char *name, DBusError *error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList **volumes)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char lastc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* temporarily remove trailing slash */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = (char *)name + strlen(name) - 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*p == '/') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem lastc = *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *p = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (name[0] == '/') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (((drive = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "info.udi", name, volumes)) != NULL) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((drive = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.device", name, volumes)) != NULL) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((drive = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.solaris.raw_device", name, volumes)) != NULL) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((drive = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.mount_point", name, volumes)) != NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* try volume label */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.label", name, volumes)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive = rmm_hal_volume_findby_nickname(hal_ctx, name, volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (p != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *p = lastc;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * find default volume. Returns volume pointer and name in 'name'.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLibHalDrive *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_volume_find_default(LibHalContext *hal_ctx, DBusError *error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char **name_out, GSList **volumes)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static const char *names[] = { "floppy", "cdrom", "rmdisk" };
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < NELEM(names); i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive = rmm_hal_volume_findby_nickname(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem names[i], volumes)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Skip floppy if it has no media.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * XXX might want to actually check for media
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * every time instead of relying on volcheck.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((strcmp(names[i], "floppy") != 0) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_device_get_property_bool(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_get_udi(drive),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "storage.removable.media_available", NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *name_out = names[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * find volume by property=value
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * returns the LibHalDrive object and a list of LibHalVolume objects.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * XXX add support for multiple properties, reduce D-Bus traffic
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLibHalDrive *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_volume_findby(LibHalContext *hal_ctx, const char *property,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *value, GSList **volumes)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalVolume *v = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China int i_drive = -1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* get all devices with property=value */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udis = libhal_manager_find_device_string_match(hal_ctx, property,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem value, &num_udis, &error)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China /* find volumes and drives among these devices */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_udis; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (libhal_device_query_capability(hal_ctx, udis[i], "volume",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem v = libhal_volume_from_udi(hal_ctx, udis[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (v != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = g_slist_prepend(*volumes, v);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China } else if ((*volumes == NULL) &&
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China libhal_device_query_capability(hal_ctx, udis[i], "storage",
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China &error)) {
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China i_drive = i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (*volumes != NULL) {
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China /* used prepend, preserve original order */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = g_slist_reverse(*volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem v = (LibHalVolume *)(*volumes)->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive = libhal_drive_from_udi(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_volume_get_storage_device_udi(v));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (drive == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_volumes_free (*volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China } else if (i_drive >= 0) {
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China drive = libhal_drive_from_udi(hal_ctx, udis[i_drive]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(udis);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
0ebe310024a809595007753781dc9969750affbcartemstatic void
0ebe310024a809595007753781dc9969750affbcartemrmm_print_nicknames_one(LibHalDrive *d, LibHalVolume *v,
0ebe310024a809595007753781dc9969750affbcartem const char *device, char **drive_nicknames)
0ebe310024a809595007753781dc9969750affbcartem{
0ebe310024a809595007753781dc9969750affbcartem const char *volume_label = NULL;
0ebe310024a809595007753781dc9969750affbcartem const char *mount_point = NULL;
0ebe310024a809595007753781dc9969750affbcartem boolean_t comma;
0ebe310024a809595007753781dc9969750affbcartem int i;
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem (void) printf("%-*s ", RMM_PRINT_DEVICE_WIDTH, device);
0ebe310024a809595007753781dc9969750affbcartem comma = B_FALSE;
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem if (drive_nicknames != NULL) {
0ebe310024a809595007753781dc9969750affbcartem for (i = 0; drive_nicknames[i] != NULL; i++) {
0ebe310024a809595007753781dc9969750affbcartem (void) printf("%s%s", comma ? "," : "",
0ebe310024a809595007753781dc9969750affbcartem drive_nicknames[i]);
0ebe310024a809595007753781dc9969750affbcartem comma = B_TRUE;
0ebe310024a809595007753781dc9969750affbcartem }
0ebe310024a809595007753781dc9969750affbcartem }
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem if ((v != NULL) &&
0ebe310024a809595007753781dc9969750affbcartem ((volume_label = libhal_volume_get_label(v)) != NULL) &&
0ebe310024a809595007753781dc9969750affbcartem (strlen(volume_label) > 0)) {
0ebe310024a809595007753781dc9969750affbcartem (void) printf("%s%s", comma ? "," : "", volume_label);
0ebe310024a809595007753781dc9969750affbcartem comma = B_TRUE;
0ebe310024a809595007753781dc9969750affbcartem }
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem if ((v != NULL) &&
0ebe310024a809595007753781dc9969750affbcartem ((mount_point = libhal_volume_get_mount_point(v)) != NULL) &&
0ebe310024a809595007753781dc9969750affbcartem (strlen(mount_point) > 0)) {
0ebe310024a809595007753781dc9969750affbcartem (void) printf("%s%s", comma ? "," : "", mount_point);
0ebe310024a809595007753781dc9969750affbcartem comma = B_TRUE;
0ebe310024a809595007753781dc9969750affbcartem }
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem (void) printf("\n");
0ebe310024a809595007753781dc9969750affbcartem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * print nicknames for each available volume
0ebe310024a809595007753781dc9969750affbcartem *
0ebe310024a809595007753781dc9969750affbcartem * print_mask:
0ebe310024a809595007753781dc9969750affbcartem * RMM_PRINT_MOUNTABLE print only mountable volumes
0ebe310024a809595007753781dc9969750affbcartem * RMM_PRINT_EJECTABLE print volume-less ejectable drives
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
0ebe310024a809595007753781dc9969750affbcartemrmm_print_volume_nicknames(LibHalContext *hal_ctx, DBusError *error,
0ebe310024a809595007753781dc9969750affbcartem int print_mask)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_udis;
0ebe310024a809595007753781dc9969750affbcartem GSList *volumes = NULL;
0ebe310024a809595007753781dc9969750affbcartem LibHalDrive *d, *d_tmp;
0ebe310024a809595007753781dc9969750affbcartem LibHalVolume *v;
0ebe310024a809595007753781dc9969750affbcartem const char *device;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **nicknames;
0ebe310024a809595007753781dc9969750affbcartem int i;
0ebe310024a809595007753781dc9969750affbcartem GSList *j;
0ebe310024a809595007753781dc9969750affbcartem int nprinted;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
0ebe310024a809595007753781dc9969750affbcartem if ((udis = libhal_find_device_by_capability(hal_ctx, "storage",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &num_udis, error)) == NULL) {
0ebe310024a809595007753781dc9969750affbcartem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_udis; i++) {
0ebe310024a809595007753781dc9969750affbcartem if ((d = libhal_drive_from_udi(hal_ctx, udis[i])) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem /* find volumes belonging to this drive */
0ebe310024a809595007753781dc9969750affbcartem if ((d_tmp = rmm_hal_volume_findby(hal_ctx,
0ebe310024a809595007753781dc9969750affbcartem "block.storage_device", udis[i], &volumes)) != NULL) {
0ebe310024a809595007753781dc9969750affbcartem libhal_drive_free(d_tmp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem nicknames = libhal_device_get_property_strlist(hal_ctx,
0ebe310024a809595007753781dc9969750affbcartem udis[i], "storage.solaris.nicknames", NULL);
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem nprinted = 0;
0ebe310024a809595007753781dc9969750affbcartem for (j = volumes; j != NULL; j = g_slist_next(j)) {
0ebe310024a809595007753781dc9969750affbcartem v = (LibHalVolume *)(j->data);
0ebe310024a809595007753781dc9969750affbcartem
0ebe310024a809595007753781dc9969750affbcartem if ((device = libhal_volume_get_device_file(v)) ==
0ebe310024a809595007753781dc9969750affbcartem NULL) {
0ebe310024a809595007753781dc9969750affbcartem continue;
0ebe310024a809595007753781dc9969750affbcartem }
0ebe310024a809595007753781dc9969750affbcartem if ((print_mask & RMM_PRINT_MOUNTABLE) &&
0ebe310024a809595007753781dc9969750affbcartem (libhal_volume_get_fsusage(v) !=
0ebe310024a809595007753781dc9969750affbcartem LIBHAL_VOLUME_USAGE_MOUNTABLE_FILESYSTEM)) {
0ebe310024a809595007753781dc9969750affbcartem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
0ebe310024a809595007753781dc9969750affbcartem rmm_print_nicknames_one(d, v, device, nicknames);
0ebe310024a809595007753781dc9969750affbcartem nprinted++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
0ebe310024a809595007753781dc9969750affbcartem if ((nprinted == 0) &&
0ebe310024a809595007753781dc9969750affbcartem (print_mask & RMM_PRINT_EJECTABLE) &&
0ebe310024a809595007753781dc9969750affbcartem libhal_drive_requires_eject(d) &&
0ebe310024a809595007753781dc9969750affbcartem ((device = libhal_drive_get_device_file(d)) != NULL)) {
0ebe310024a809595007753781dc9969750affbcartem rmm_print_nicknames_one(d, NULL, device, nicknames);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(nicknames);
0ebe310024a809595007753781dc9969750affbcartem libhal_drive_free(d);
0ebe310024a809595007753781dc9969750affbcartem rmm_volumes_free(volumes);
0ebe310024a809595007753781dc9969750affbcartem volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
0ebe310024a809595007753781dc9969750affbcartem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(udis);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * find volume by nickname
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * returns the LibHalDrive object and a list of LibHalVolume objects.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemLibHalDrive *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_volume_findby_nickname(LibHalContext *hal_ctx, const char *name,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList **volumes)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive_tmp;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **nicknames;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i, j;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *volumes = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udis = libhal_find_device_by_capability(hal_ctx, "storage",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &num_udis, &error)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* find a drive by nickname */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; (i < num_udis) && (drive == NULL); i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((nicknames = libhal_device_get_property_strlist(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udis[i], "storage.solaris.nicknames", &error)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (j = 0; (nicknames[j] != NULL) && (drive == NULL); j++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp(nicknames[j], name) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive = libhal_drive_from_udi(hal_ctx, udis[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(nicknames);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(udis);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (drive != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* found the drive, now find its volumes */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive_tmp = rmm_hal_volume_findby(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.storage_device", libhal_drive_get_udi(drive),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem volumes)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_free(drive_tmp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_volumes_free(GSList *volumes)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = volumes; i != NULL; i = g_slist_next(i)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_volume_free((LibHalVolume *)(i->data));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free(volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Call HAL's Mount() method on the given device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_mount(LibHalContext *hal_ctx, const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **opts, int num_opts, char *mountpoint, DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *fstype;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("mounting %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal", udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.Hal.Device.Volume", "Mount"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "mount failed for %s: cannot create dbus message\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fstype = "";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mountpoint == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mountpoint = "";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg, DBUS_TYPE_STRING, &mountpoint,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_STRING, &fstype,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &opts, num_opts,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("mount failed for %s: cannot append args\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dmesg, RMM_MOUNT_TIMEOUT, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("mount failed for %s: %s\n", udi, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("mounted %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Call HAL's Unmount() method on the given device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_unmount(LibHalContext *hal_ctx, const char *udi, DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **opts = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unmounting %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal", udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.Hal.Device.Volume", "Unmount"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "unmount failed %s: cannot create dbus message\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg, DBUS_TYPE_ARRAY, DBUS_TYPE_STRING,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &opts, 0, DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unmount failed %s: cannot append args\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dmesg, RMM_UNMOUNT_TIMEOUT, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unmount failed for %s: %s\n", udi, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unmounted %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Call HAL's Eject() method on the given device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_eject(LibHalContext *hal_ctx, const char *udi, DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **options = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem uint_t num_options = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("ejecting %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal", udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.Hal.Device.Storage", "Eject"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("eject %s: cannot create dbus message\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &options, num_options,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("eject %s: cannot append args to dbus message ", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dmesg, RMM_EJECT_TIMEOUT, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("eject %s: %s\n", udi, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("ejected %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Call HAL's CloseTray() method on the given device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_closetray(LibHalContext *hal_ctx, const char *udi, DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **options = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem uint_t num_options = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("closing tray %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal", udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.Hal.Device.Storage", "CloseTray"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "closetray failed for %s: cannot create dbus message\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_ARRAY, DBUS_TYPE_STRING, &options, num_options,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("closetray %s: cannot append args to dbus message ",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
b941d3fc4e70b4411341c7aeb53517bbff5f2df4artem dmesg, RMM_CLOSETRAY_TIMEOUT, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("closetray failed for %s: %s\n", udi, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("closetray ok %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Call HAL's Rescan() method on the given device
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_rescan(LibHalContext *hal_ctx, const char *udi, DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rescanning %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal", udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "org.freedesktop.Hal.Device", "Rescan"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rescan failed for %s: cannot create dbus message\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dmesg, -1, error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rescan failed for %s: %s\n", udi, error->message);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rescan ok %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_claim_branch(LibHalContext *hal_ctx, const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *claimed_by = "rmvolmgr";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("claiming branch %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "ClaimBranch"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot create dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg, DBUS_TYPE_STRING, &udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_STRING, &claimed_by, DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot append args to dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dmesg, -1, &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot send dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("claim branch ok %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_hal_unclaim_branch(LibHalContext *hal_ctx, const char *udi)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusConnection *dbus_conn = libhal_ctx_get_dbus_connection(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusMessage *dmesg, *reply;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *claimed_by = "rmvolmgr";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unclaiming branch %s...\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(dmesg = dbus_message_new_method_call("org.freedesktop.Hal",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "/org/freedesktop/Hal/Manager", "org.freedesktop.Hal.Manager",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "UnclaimBranch"))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot create dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!dbus_message_append_args(dmesg, DBUS_TYPE_STRING, &udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBUS_TYPE_STRING, &claimed_by, DBUS_TYPE_INVALID)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot append args to dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(reply = dbus_connection_send_with_reply_and_block(dbus_conn,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dmesg, -1, &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot send dbus message\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("unclaim branch ok %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(dmesg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_message_unref(reply);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic boolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_action_one(LibHalContext *hal_ctx, const char *name, action_t action,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *dev, const char *udi, LibHalVolume *v,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **opts, int num_opts, char *mountpoint)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char dev_str[MAXPATHLEN];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *mountp;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t ret = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp(name, dev) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) snprintf(dev_str, sizeof (dev_str), name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) snprintf(dev_str, sizeof (dev_str), "%s %s", name, dev);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (action) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case EJECT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_hal_eject(hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case INSERT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case REMOUNT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (libhal_volume_is_mounted(v)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto done;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_hal_mount(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opts, num_opts, mountpoint, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case UNMOUNT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_volume_is_mounted(v)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto done;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_hal_unmount(hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case CLOSETRAY:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_hal_closetray(hal_ctx, udi, &error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!ret) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr, gettext("%s of %s failed: %s\n"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem action_strings[action], dev_str, rmm_strerror(&error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto done;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (action) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case EJECT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) printf(gettext("%s ejected\n"), dev_str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case INSERT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case REMOUNT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mountp = rmm_get_mnttab_mount_point(dev);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mountp != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) printf(gettext("%s mounted at %s\n"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dev_str, mountp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(mountp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case UNMOUNT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) printf(gettext("%s unmounted\n"), dev_str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case CLOSETRAY:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) printf(gettext("%s tray closed\n"), dev_str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdone:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * top level action routine
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If non-null 'aa' is passed, it will be used, otherwise a local copy
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * will be created.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_action(LibHalContext *hal_ctx, const char *name, action_t action,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct action_arg *aap, char **opts, int num_opts, char *mountpoint)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *volumes, *i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalVolume *v;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi, *d_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *dev, *d_dev;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct action_arg aa_local;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t ret = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rmm_action %s %s\n", name, action_strings[action]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap == NULL) {
7544909da5f7d5b467625910225a72e142c4b6b7artem bzero(&aa_local, sizeof (aa_local));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap = &aa_local;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* find the drive and its volumes */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d = rmm_hal_volume_find(hal_ctx, name, &error, &volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (d == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr, gettext("cannot find '%s'\n"), name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d_udi = libhal_drive_get_udi(d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem d_dev = libhal_drive_get_device_file(d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d_udi == NULL) || (d_dev == NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * For those drives that do not require media eject,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * EJECT turns into UNMOUNT.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((action == EJECT) && !libhal_drive_requires_eject(d)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem action = UNMOUNT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* per drive action */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((action == EJECT) || (action == CLOSETRAY)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_action_one(hal_ctx, name, action, d_dev, d_udi, NULL,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opts, num_opts, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!ret || (action == CLOSETRAY)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* per volume action */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = volumes; i != NULL; i = g_slist_next(i)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem v = (LibHalVolume *)i->data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi = libhal_volume_get_udi(v);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dev = libhal_volume_get_device_file(v);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udi == NULL) || (dev == NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap == &aa_local) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!rmm_volume_aa_from_prop(hal_ctx, udi, v, aap)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rmm_volume_aa_from_prop failed %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_action = action;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* ejected above, just need postprocess */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (action != EJECT) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = rmm_action_one(hal_ctx, name, action, dev, udi, v,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opts, num_opts, mountpoint);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (ret) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) vold_postprocess(hal_ctx, udi, aap);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap == &aa_local) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_volume_aa_free(aap);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
68e92846614d4b32eb1a814a5e8e77331cfaaa59fei feng - Sun Microsystems - Beijing China rmm_volumes_free(volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_free(d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * rescan by name
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * if name is NULL, rescan all drives
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_rescan(LibHalContext *hal_ctx, const char *name, boolean_t query)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *volumes;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *drive = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *drive_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int num_udis;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *nickname;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char **nicks = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t do_free_udis = FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
7544909da5f7d5b467625910225a72e142c4b6b7artem boolean_t ret = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("rmm_rescan %s\n", name != NULL ? name : "all");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_init(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive = rmm_hal_volume_find(hal_ctx, name, &error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &volumes)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("cannot find '%s'\n"), name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem g_slist_free(volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_udi = libhal_drive_get_udi(drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udis = (char **)&drive_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem num_udis = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udis = libhal_find_device_by_capability(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "storage", &num_udis, &error)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem do_free_udis = TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < num_udis; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (name == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nicks = libhal_device_get_property_strlist(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udis[i], "storage.solaris.nicknames", NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (nicks != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nickname = nicks[0];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem nickname = "";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(ret = rmm_hal_rescan(hal_ctx, udis[i], &error))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("rescan of %s failed: %s\n"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem name ? name : nickname,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_strerror(&error, -1));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(nicks);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (query) {
7544909da5f7d5b467625910225a72e142c4b6b7artem ret = libhal_device_get_property_bool(hal_ctx, udis[i],
7544909da5f7d5b467625910225a72e142c4b6b7artem "storage.removable.media_available", NULL);
7544909da5f7d5b467625910225a72e142c4b6b7artem if (ret) {
7544909da5f7d5b467625910225a72e142c4b6b7artem printf(gettext("%s is available\n"),
7544909da5f7d5b467625910225a72e142c4b6b7artem name ? name : nickname);
7544909da5f7d5b467625910225a72e142c4b6b7artem } else {
7544909da5f7d5b467625910225a72e142c4b6b7artem printf(gettext("%s is not available\n"),
7544909da5f7d5b467625910225a72e142c4b6b7artem name ? name : nickname);
7544909da5f7d5b467625910225a72e142c4b6b7artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(nicks);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (drive != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_free(drive);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (do_free_udis) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string_array(udis);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * set action_arg from volume properties
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemboolean_t
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_volume_aa_from_prop(LibHalContext *hal_ctx, const char *udi_arg,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalVolume *volume_arg, struct action_arg *aap)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalVolume *volume = volume_arg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *udi = udi_arg;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *drive_udi;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *volume_label;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *mountpoint;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int len;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int ret = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* at least udi or volume must be supplied */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udi == NULL) && (volume == NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (B_FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (volume == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((volume = libhal_volume_from_udi(hal_ctx, udi)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot get volume %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (udi == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((udi = libhal_volume_get_udi(volume)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("cannot get udi\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_udi = libhal_volume_get_storage_device_udi(volume);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(aap->aa_symdev = libhal_device_get_property_string(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_udi, "storage.solaris.legacy.symdev", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "storage.solaris.legacy.symdev", drive_udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(aap->aa_media = libhal_device_get_property_string(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_udi, "storage.solaris.legacy.media_type", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "storage.solaris.legacy.media_type", drive_udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* name is derived from volume label */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_name = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((volume_label = (char *)libhal_device_get_property_string(hal_ctx,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem udi, "volume.label", NULL)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((len = strlen(volume_label)) > 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_name = rmm_vold_convert_volume_label(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem volume_label, len);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strlen(aap->aa_name) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(aap->aa_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_name = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(volume_label);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* if no label, then unnamed_<mediatype> */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_name == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_name = (char *)calloc(1, sizeof ("unnamed_floppyNNNN"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_name == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) snprintf(aap->aa_name, sizeof ("unnamed_floppyNNNN"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "unnamed_%s", aap->aa_media);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(aap->aa_path = libhal_device_get_property_string(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.device", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n", "block.device", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(aap->aa_rawpath = libhal_device_get_property_string(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.solaris.raw_device", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.solaris.raw_device", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(aap->aa_type = libhal_device_get_property_string(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.fstype", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n", "volume.fstype", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!libhal_device_get_property_bool(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.is_partition", NULL)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_partname = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (!(aap->aa_partname = libhal_device_get_property_string(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_ctx, udi, "block.solaris.slice", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "block.solaris.slice", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!(mountpoint = libhal_device_get_property_string(hal_ctx, udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.mount_point", NULL))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("property %s not found %s\n",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "volume.mount_point", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * aa_mountpoint can be reallocated in rmm_volume_aa_update_mountpoint()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * won't have to choose between free() or libhal_free_string() later on
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_mountpoint = strdup(mountpoint);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(mountpoint);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_mountpoint == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dprintf("mountpoint is NULL %s\n", udi);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem goto out;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemout:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((volume != NULL) && (volume != volume_arg)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_volume_free(volume);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!ret) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_volume_aa_free(aap);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* ARGSUSED */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_volume_aa_update_mountpoint(LibHalContext *hal_ctx, const char *udi,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct action_arg *aap)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_mountpoint != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(aap->aa_mountpoint);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_mountpoint = rmm_get_mnttab_mount_point(aap->aa_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_volume_aa_free(struct action_arg *aap)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_symdev != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_symdev);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_symdev = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_name != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(aap->aa_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_name = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_path != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_path = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_rawpath != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_rawpath);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_rawpath = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_type != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_type = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_media != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_media);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_media = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_partname != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_free_string(aap->aa_partname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_partname = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (aap->aa_mountpoint != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem free(aap->aa_mountpoint);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem aap->aa_mountpoint = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * get device's mount point from mnttab
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_get_mnttab_mount_point(const char *special)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *mount_point = NULL;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem FILE *f;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct mnttab mnt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct mnttab mpref = { NULL, NULL, NULL, NULL, NULL };
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((f = fopen(MNTTAB, "r")) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mpref.mnt_special = (char *)special;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (getmntany(f, &mnt, &mpref) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_point = strdup(mnt.mnt_mountp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fclose(f);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * get human readable string from error values
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_strerror(DBusError *dbus_error, int rmm_error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *str;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((dbus_error != NULL) && dbus_error_is_set(dbus_error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = dbus_error->message;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (rmm_error) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case RMM_EOK:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = gettext("success");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case RMM_EDBUS_CONNECT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = gettext("cannot connect to D-Bus");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case RMM_EHAL_CONNECT:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = gettext("cannot connect to HAL");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem str = gettext("undefined error");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (str);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_dbus_error_free(DBusError *error)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (error != NULL && dbus_error_is_set(error)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem dbus_error_free(error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic int
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_vold_isbadchar(int c)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int ret_val = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (c) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case '/':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case ';':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case '|':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret_val = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (iscntrl(c) || isspace(c)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret_val = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret_val);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *
18c2aff776a775d34a4c9893a4c72e0434d68e36artemrmm_vold_convert_volume_label(const char *name, size_t len)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char buf[MAXNAMELEN+1];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *s = buf;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int i;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (len > MAXNAMELEN) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem len = MAXNAMELEN;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (i = 0; i < len; i++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (name[i] == '\0') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (isgraph((int)name[i])) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (isupper((int)name[i])) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s++ = tolower((int)name[i]);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (rmm_vold_isbadchar((int)name[i])) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s++ = '_';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s++ = name[i];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = strdup(buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * swiped from mkdir.c
18c2aff776a775d34a4c9893a4c72e0434d68e36artem */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmakepath(char *dir, mode_t mode)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int err;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *slash;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((mkdir(dir, mode) == 0) || (errno == EEXIST)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (errno != ENOENT) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (-1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((slash = strrchr(dir, '/')) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (-1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *slash = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem err = makepath(dir, mode);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *slash++ = '/';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (err || (*slash == '\0')) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (err);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (mkdir(dir, mode));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemvoid
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdprintf(const char *fmt, ...)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_list ap;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *p;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char msg[BUFSIZ];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *errmsg = strerror(errno);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem char *s;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rmm_debug == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) memset(msg, 0, BUFSIZ);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* scan for %m and replace with errno msg */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s = &msg[strlen(msg)];
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p = fmt;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while (*p != '\0') {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((*p == '%') && (*(p+1) == 'm')) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) strcat(s, errmsg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p += 2;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem s += strlen(errmsg);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem continue;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s++ = *p++;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem *s = '\0'; /* don't forget the null byte */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_start(ap, fmt);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) vfprintf(stderr, msg, ap);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem va_end(ap);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}