118c2aff7Sartem /* 218c2aff7Sartem * CDDL HEADER START 318c2aff7Sartem * 418c2aff7Sartem * The contents of this file are subject to the terms of the 518c2aff7Sartem * Common Development and Distribution License (the "License"). 618c2aff7Sartem * You may not use this file except in compliance with the License. 718c2aff7Sartem * 818c2aff7Sartem * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 918c2aff7Sartem * or http://www.opensolaris.org/os/licensing. 1018c2aff7Sartem * See the License for the specific language governing permissions 1118c2aff7Sartem * and limitations under the License. 1218c2aff7Sartem * 1318c2aff7Sartem * When distributing Covered Code, include this CDDL HEADER in each 1418c2aff7Sartem * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1518c2aff7Sartem * If applicable, add the following below this CDDL HEADER, with the 1618c2aff7Sartem * fields enclosed by brackets "[]" replaced with your own identifying 1718c2aff7Sartem * information: Portions Copyright [yyyy] [name of copyright owner] 1818c2aff7Sartem * 1918c2aff7Sartem * CDDL HEADER END 2018c2aff7Sartem */ 2118c2aff7Sartem /* 22*97ddcdceSArtem Kachitchkine * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 2318c2aff7Sartem * Use is subject to license terms. 2418c2aff7Sartem */ 2518c2aff7Sartem 2618c2aff7Sartem #include <stdio.h> 2718c2aff7Sartem #include <stdlib.h> 2818c2aff7Sartem #include <unistd.h> 2918c2aff7Sartem #include <fcntl.h> 3018c2aff7Sartem #include <string.h> 3118c2aff7Sartem #include <strings.h> 3218c2aff7Sartem #include <dirent.h> 3318c2aff7Sartem #include <signal.h> 3418c2aff7Sartem #include <errno.h> 3518c2aff7Sartem #include <libintl.h> 3618c2aff7Sartem #include <sys/types.h> 3718c2aff7Sartem 3818c2aff7Sartem #include "vold.h" 3918c2aff7Sartem #include "rmm_common.h" 4018c2aff7Sartem 4118c2aff7Sartem char *progname = "volrmmount"; 4218c2aff7Sartem 4318c2aff7Sartem static void 4418c2aff7Sartem usage() 4518c2aff7Sartem { 4618c2aff7Sartem (void) fprintf(stderr, 4718c2aff7Sartem gettext( 4818c2aff7Sartem "\nusage: %s [-i | -e] [DEVICE | NICKNAME]\n"), 4918c2aff7Sartem progname); 5018c2aff7Sartem (void) fprintf(stderr, 5118c2aff7Sartem gettext("or: %s -d\n"), progname); 5218c2aff7Sartem (void) fprintf(stderr, 5318c2aff7Sartem gettext( 5418c2aff7Sartem "options:\t-i simulate volume being put in/inserted\n")); 5518c2aff7Sartem (void) fprintf(stderr, 5618c2aff7Sartem gettext( 5718c2aff7Sartem "options:\t-e simulate volume being taken out/ejected\n")); 5818c2aff7Sartem (void) fprintf(stderr, 5918c2aff7Sartem gettext("options:\t-d show default device\n")); 6018c2aff7Sartem (void) fprintf(stderr, 6118c2aff7Sartem gettext( 6218c2aff7Sartem "\nThis command is deprecated. Use rmmount(1) instead.\n")); 6318c2aff7Sartem } 6418c2aff7Sartem 6518c2aff7Sartem int 6618c2aff7Sartem main(int argc, char **argv) 6718c2aff7Sartem { 6818c2aff7Sartem const char *opts = "ied"; 6918c2aff7Sartem int c; 7018c2aff7Sartem boolean_t opt_insert = B_FALSE; 7118c2aff7Sartem boolean_t opt_eject = B_FALSE; 7218c2aff7Sartem boolean_t opt_default = B_FALSE; 7318c2aff7Sartem action_t action; 7418c2aff7Sartem LibHalContext *hal_ctx; 7518c2aff7Sartem DBusError error; 7618c2aff7Sartem rmm_error_t rmm_error; 7718c2aff7Sartem LibHalDrive *d; 7818c2aff7Sartem GSList *volumes; 7918c2aff7Sartem const char *default_name; 8018c2aff7Sartem int ret = 0; 8118c2aff7Sartem 8218c2aff7Sartem while ((c = getopt(argc, argv, opts)) != EOF) { 8318c2aff7Sartem switch (c) { 8418c2aff7Sartem case 'i': 8518c2aff7Sartem opt_insert = B_TRUE; 8618c2aff7Sartem action = REMOUNT; 8718c2aff7Sartem break; 8818c2aff7Sartem case 'e': 8918c2aff7Sartem opt_eject = B_TRUE; 9018c2aff7Sartem action = UNMOUNT; 9118c2aff7Sartem break; 9218c2aff7Sartem case 'd': 9318c2aff7Sartem opt_default = B_TRUE; 9418c2aff7Sartem break; 9518c2aff7Sartem default: 9618c2aff7Sartem usage(); 9718c2aff7Sartem return (1); 9818c2aff7Sartem } 9918c2aff7Sartem } 10018c2aff7Sartem if ((opt_insert && opt_eject) || 10118c2aff7Sartem (!opt_insert && !opt_eject && !opt_default)) { 10218c2aff7Sartem usage(); 10318c2aff7Sartem return (1); 10418c2aff7Sartem } 10518c2aff7Sartem 106*97ddcdceSArtem Kachitchkine if ((hal_ctx = rmm_hal_init(0, 0, 0, 0, &error, &rmm_error)) == NULL) { 10718c2aff7Sartem (void) fprintf(stderr, 10818c2aff7Sartem gettext("HAL initialization failed: %s\n"), 10918c2aff7Sartem rmm_strerror(&error, rmm_error)); 11018c2aff7Sartem rmm_dbus_error_free(&error); 11118c2aff7Sartem return (1); 11218c2aff7Sartem } 11318c2aff7Sartem 11418c2aff7Sartem if (opt_default) { 11518c2aff7Sartem /* -d: print default name and exit */ 11618c2aff7Sartem if ((d = rmm_hal_volume_find_default(hal_ctx, &error, 11718c2aff7Sartem &default_name, &volumes)) == NULL) { 11818c2aff7Sartem default_name = "nothing inserted"; 11918c2aff7Sartem } else { 12018c2aff7Sartem rmm_volumes_free(volumes); 12118c2aff7Sartem libhal_drive_free(d); 12218c2aff7Sartem } 12318c2aff7Sartem (void) printf(gettext("Default device is: %s\n"), default_name); 12418c2aff7Sartem } else if (optind == argc) { 12518c2aff7Sartem /* no name provided, use default */ 12618c2aff7Sartem if ((d = rmm_hal_volume_find_default(hal_ctx, &error, 12718c2aff7Sartem &default_name, &volumes)) == NULL) { 12818c2aff7Sartem (void) fprintf(stderr, 12918c2aff7Sartem gettext("No default media available\n")); 13018c2aff7Sartem ret = 1; 13118c2aff7Sartem } else { 13218c2aff7Sartem rmm_volumes_free(volumes); 13318c2aff7Sartem libhal_drive_free(d); 13418c2aff7Sartem if (!rmm_action(hal_ctx, default_name, action, 13518c2aff7Sartem 0, 0, 0, 0)) { 13618c2aff7Sartem ret = 1; 13718c2aff7Sartem } 13818c2aff7Sartem } 13918c2aff7Sartem } else { 14018c2aff7Sartem for (; optind < argc; optind++) { 14118c2aff7Sartem if (rmm_action(hal_ctx, argv[optind], action, 14218c2aff7Sartem 0, 0, 0, 0) != 0) { 14318c2aff7Sartem ret = 1; 14418c2aff7Sartem } 14518c2aff7Sartem } 14618c2aff7Sartem } 14718c2aff7Sartem 14818c2aff7Sartem rmm_hal_fini(hal_ctx); 14918c2aff7Sartem 15018c2aff7Sartem return (ret); 15118c2aff7Sartem } 152