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 <stdlib.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <unistd.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <fcntl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <string.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <strings.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <dirent.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <signal.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <errno.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <libintl.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include <sys/types.h>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "vold.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "rmm_common.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemchar *progname = "volrmmount";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void
18c2aff776a775d34a4c9893a4c72e0434d68e36artemusage()
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\nusage: %s [-i | -e] [DEVICE | NICKNAME]\n"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem progname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("or: %s -d\n"), progname);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "options:\t-i simulate volume being put in/inserted\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "options:\t-e simulate volume being taken out/ejected\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("options:\t-d show default device\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext(
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "\nThis command is deprecated. Use rmmount(1) instead.\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemint
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmain(int argc, char **argv)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem{
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *opts = "ied";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int c;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t opt_insert = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t opt_eject = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem boolean_t opt_default = B_FALSE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem action_t action;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalContext *hal_ctx;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem DBusError error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_error_t rmm_error;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem LibHalDrive *d;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem GSList *volumes;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem const char *default_name;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem int ret = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((c = getopt(argc, argv, opts)) != EOF) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem switch (c) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'i':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt_insert = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem action = REMOUNT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'e':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt_eject = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem action = UNMOUNT;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem case 'd':
18c2aff776a775d34a4c9893a4c72e0434d68e36artem opt_default = B_TRUE;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem break;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default:
18c2aff776a775d34a4c9893a4c72e0434d68e36artem usage();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((opt_insert && opt_eject) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (!opt_insert && !opt_eject && !opt_default)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem usage();
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
97ddcdce0091922bf2049977a3d42ba4fc0857a6Artem Kachitchkine if ((hal_ctx = rmm_hal_init(0, 0, 0, 0, &error, &rmm_error)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("HAL initialization failed: %s\n"),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_strerror(&error, rmm_error));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_dbus_error_free(&error);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (opt_default) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* -d: print default name and exit */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d = rmm_hal_volume_find_default(hal_ctx, &error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &default_name, &volumes)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem default_name = "nothing inserted";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_volumes_free(volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_free(d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) printf(gettext("Default device is: %s\n"), default_name);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (optind == argc) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* no name provided, use default */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((d = rmm_hal_volume_find_default(hal_ctx, &error,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem &default_name, &volumes)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (void) fprintf(stderr,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem gettext("No default media available\n"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_volumes_free(volumes);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem libhal_drive_free(d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!rmm_action(hal_ctx, default_name, action,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0, 0, 0, 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem for (; optind < argc; optind++) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (rmm_action(hal_ctx, argv[optind], action,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem 0, 0, 0, 0) != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ret = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem rmm_hal_fini(hal_ctx);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (ret);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}