17c478bd9Sstevel@tonic-gate /* 27c478bd9Sstevel@tonic-gate * CDDL HEADER START 37c478bd9Sstevel@tonic-gate * 47c478bd9Sstevel@tonic-gate * The contents of this file are subject to the terms of the 5e3397557Szk194757 * Common Development and Distribution License (the "License"). 6e3397557Szk194757 * You may not use this file except in compliance with the License. 77c478bd9Sstevel@tonic-gate * 87c478bd9Sstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 97c478bd9Sstevel@tonic-gate * or http://www.opensolaris.org/os/licensing. 107c478bd9Sstevel@tonic-gate * See the License for the specific language governing permissions 117c478bd9Sstevel@tonic-gate * and limitations under the License. 127c478bd9Sstevel@tonic-gate * 137c478bd9Sstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each 147c478bd9Sstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 157c478bd9Sstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the 167c478bd9Sstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying 177c478bd9Sstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner] 187c478bd9Sstevel@tonic-gate * 197c478bd9Sstevel@tonic-gate * CDDL HEADER END 207c478bd9Sstevel@tonic-gate */ 217c478bd9Sstevel@tonic-gate /* 22*afb89a98SPavel Potoplyak * Copyright 2009 Sun Microsystems, Inc. All rights reserved. 237c478bd9Sstevel@tonic-gate * Use is subject to license terms. 247c478bd9Sstevel@tonic-gate */ 257c478bd9Sstevel@tonic-gate 267c478bd9Sstevel@tonic-gate /* 277c478bd9Sstevel@tonic-gate * rmf_menu.c : 287c478bd9Sstevel@tonic-gate * Command line options to rmformat are processed in this file. 297c478bd9Sstevel@tonic-gate */ 307c478bd9Sstevel@tonic-gate 317c478bd9Sstevel@tonic-gate #include "rmformat.h" 327c478bd9Sstevel@tonic-gate #include <sys/smedia.h> 33bbed02dfSzk194757 #include <priv_utils.h> 347c478bd9Sstevel@tonic-gate 357c478bd9Sstevel@tonic-gate extern int32_t D_flag; 367c478bd9Sstevel@tonic-gate extern int32_t e_flag; 377c478bd9Sstevel@tonic-gate extern int32_t H_flag; 387c478bd9Sstevel@tonic-gate extern int32_t U_flag; 397c478bd9Sstevel@tonic-gate extern int32_t V_flag; 407c478bd9Sstevel@tonic-gate extern int32_t b_flag; 417c478bd9Sstevel@tonic-gate extern int32_t w_flag; 427c478bd9Sstevel@tonic-gate extern int32_t W_flag; 437c478bd9Sstevel@tonic-gate extern int32_t s_flag; 447c478bd9Sstevel@tonic-gate extern int32_t c_flag; 457c478bd9Sstevel@tonic-gate extern int32_t F_flag; 467c478bd9Sstevel@tonic-gate extern int32_t R_flag; 477c478bd9Sstevel@tonic-gate extern int32_t p_flag; 487c478bd9Sstevel@tonic-gate extern int32_t l_flag; 497c478bd9Sstevel@tonic-gate 507c478bd9Sstevel@tonic-gate extern char *myname; 517c478bd9Sstevel@tonic-gate extern char *slice_file; 52342440ecSPrasad Singamsetty extern diskaddr_t repair_blk_no; 537c478bd9Sstevel@tonic-gate extern int32_t quick_format; 547c478bd9Sstevel@tonic-gate extern int32_t long_format; 557c478bd9Sstevel@tonic-gate extern int32_t force_format; 567c478bd9Sstevel@tonic-gate extern int32_t rw_protect_enable; 577c478bd9Sstevel@tonic-gate extern int32_t rw_protect_disable; 587c478bd9Sstevel@tonic-gate extern int32_t wp_enable_passwd; 597c478bd9Sstevel@tonic-gate extern int32_t wp_disable_passwd; 607c478bd9Sstevel@tonic-gate extern int32_t wp_enable; 617c478bd9Sstevel@tonic-gate extern int32_t wp_disable; 627c478bd9Sstevel@tonic-gate extern int32_t verify_write; 637c478bd9Sstevel@tonic-gate extern char *dev_name; 647c478bd9Sstevel@tonic-gate extern char *label; 657c478bd9Sstevel@tonic-gate extern int total_devices_found; 667c478bd9Sstevel@tonic-gate extern int removable_found; 677c478bd9Sstevel@tonic-gate char *global_intr_msg; 687c478bd9Sstevel@tonic-gate smmedium_prop_t med_info; 697c478bd9Sstevel@tonic-gate int vol_running; 707c478bd9Sstevel@tonic-gate 717c478bd9Sstevel@tonic-gate extern void check_invalid_combinations(); 727c478bd9Sstevel@tonic-gate extern void check_invalid_combinations_again(int32_t); 737c478bd9Sstevel@tonic-gate extern void process_options(); 747c478bd9Sstevel@tonic-gate extern void get_passwd(struct smwp_state *wp, int32_t confirm); 757c478bd9Sstevel@tonic-gate extern int32_t valid_slice_file(smedia_handle_t, int32_t, char *, 76342440ecSPrasad Singamsetty struct extvtoc *); 777c478bd9Sstevel@tonic-gate extern void trap_SIGINT(); 787c478bd9Sstevel@tonic-gate extern void release_SIGINT(); 797c478bd9Sstevel@tonic-gate extern int32_t verify(smedia_handle_t handle, int32_t fd, 80342440ecSPrasad Singamsetty diskaddr_t start_sector, uint32_t nblocks, 817c478bd9Sstevel@tonic-gate char *buf, int32_t flag, int32_t blocksize, int32_t no_raw_rw); 827c478bd9Sstevel@tonic-gate extern void my_perror(char *err_string); 837c478bd9Sstevel@tonic-gate extern void write_default_label(smedia_handle_t, int32_t fd); 847c478bd9Sstevel@tonic-gate extern int find_device(int defer, char *tmpstr); 857c478bd9Sstevel@tonic-gate 867c478bd9Sstevel@tonic-gate void overwrite_metadata(int32_t fd, smedia_handle_t handle); 877c478bd9Sstevel@tonic-gate 887c478bd9Sstevel@tonic-gate int32_t write_sunos_label(int32_t fd, int32_t media_type); 897c478bd9Sstevel@tonic-gate 907c478bd9Sstevel@tonic-gate int32_t my_open(char *device_name, int32_t flags); 917c478bd9Sstevel@tonic-gate int32_t check_and_unmount_vold(char *device_name, int32_t flag); 927c478bd9Sstevel@tonic-gate int32_t check_and_unmount_scsi(char *device_name, int32_t flag); 937c478bd9Sstevel@tonic-gate 947c478bd9Sstevel@tonic-gate int32_t check_and_unmount_floppy(int32_t fd, int32_t flag); 957c478bd9Sstevel@tonic-gate int32_t get_confirmation(void); 967c478bd9Sstevel@tonic-gate 977c478bd9Sstevel@tonic-gate 987c478bd9Sstevel@tonic-gate static void process_F_flag(smedia_handle_t handle, int32_t fd); 997c478bd9Sstevel@tonic-gate static void process_w_flag(smedia_handle_t handle); 1007c478bd9Sstevel@tonic-gate static void process_W_flag(smedia_handle_t handle); 1017c478bd9Sstevel@tonic-gate static void process_R_flag(smedia_handle_t handle); 1027c478bd9Sstevel@tonic-gate void process_p_flag(smedia_handle_t handle, int32_t fd); 1037c478bd9Sstevel@tonic-gate static void process_c_flag(smedia_handle_t handle); 1047c478bd9Sstevel@tonic-gate static void process_V_flag(smedia_handle_t handle, int32_t fd); 1057c478bd9Sstevel@tonic-gate static void process_s_flag(smedia_handle_t, int32_t fd); 1067c478bd9Sstevel@tonic-gate static void process_e_flag(smedia_handle_t handle); 1077c478bd9Sstevel@tonic-gate static void process_H_flag(smedia_handle_t handle, int32_t fd); 1087c478bd9Sstevel@tonic-gate static void process_D_flag(smedia_handle_t handle, int32_t fd); 1097c478bd9Sstevel@tonic-gate static void process_b_flag(int32_t fd); 1107c478bd9Sstevel@tonic-gate static void process_l_flag(void); 1117c478bd9Sstevel@tonic-gate 1127c478bd9Sstevel@tonic-gate void 1137c478bd9Sstevel@tonic-gate process_options() 1147c478bd9Sstevel@tonic-gate { 1157c478bd9Sstevel@tonic-gate int32_t fd; 1167c478bd9Sstevel@tonic-gate smedia_handle_t handle; 1177c478bd9Sstevel@tonic-gate int32_t m_scsi_umount = 0; 1187c478bd9Sstevel@tonic-gate int32_t m_flp_umount = 0; 1197c478bd9Sstevel@tonic-gate int32_t v_device_umount = 0; 1207c478bd9Sstevel@tonic-gate int32_t umount_required = 0; 1217c478bd9Sstevel@tonic-gate int32_t removable; 1227c478bd9Sstevel@tonic-gate int32_t umount_failed = 0; 1237c478bd9Sstevel@tonic-gate struct dk_minfo media; 1247c478bd9Sstevel@tonic-gate 1257c478bd9Sstevel@tonic-gate check_invalid_combinations(); 1267c478bd9Sstevel@tonic-gate 1277c478bd9Sstevel@tonic-gate if (l_flag && !dev_name) { 1287c478bd9Sstevel@tonic-gate process_l_flag(); 1297c478bd9Sstevel@tonic-gate return; 1307c478bd9Sstevel@tonic-gate } 1317c478bd9Sstevel@tonic-gate 1327c478bd9Sstevel@tonic-gate if (U_flag) { 1337c478bd9Sstevel@tonic-gate if (!(F_flag || H_flag || D_flag)) { 1347c478bd9Sstevel@tonic-gate F_flag = 1; 1357c478bd9Sstevel@tonic-gate long_format = 1; 1367c478bd9Sstevel@tonic-gate } 1377c478bd9Sstevel@tonic-gate } 1387c478bd9Sstevel@tonic-gate 1397c478bd9Sstevel@tonic-gate if (F_flag || w_flag || W_flag || R_flag || D_flag || H_flag || 1407c478bd9Sstevel@tonic-gate V_flag || c_flag || b_flag || s_flag || e_flag) { 1417c478bd9Sstevel@tonic-gate umount_required = 1; 1427c478bd9Sstevel@tonic-gate } 1437c478bd9Sstevel@tonic-gate 1447c478bd9Sstevel@tonic-gate fd = my_open(dev_name, O_RDONLY|O_NDELAY); 1457c478bd9Sstevel@tonic-gate if (fd < 0) { 1467c478bd9Sstevel@tonic-gate PERROR("Could not open device"); 1477c478bd9Sstevel@tonic-gate (void) close(fd); 1487c478bd9Sstevel@tonic-gate exit(1); 1497c478bd9Sstevel@tonic-gate } 1507c478bd9Sstevel@tonic-gate 1517c478bd9Sstevel@tonic-gate if (ioctl(fd, DKIOCREMOVABLE, &removable) < 0) { 1527c478bd9Sstevel@tonic-gate PERROR("DKIOCREMOVABLE ioctl failed"); 1537c478bd9Sstevel@tonic-gate (void) close(fd); 1547c478bd9Sstevel@tonic-gate exit(1); 1557c478bd9Sstevel@tonic-gate } 1567c478bd9Sstevel@tonic-gate if (!removable) { 1577c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1587c478bd9Sstevel@tonic-gate gettext("Not a removable media device\n")); 1597c478bd9Sstevel@tonic-gate (void) close(fd); 1607c478bd9Sstevel@tonic-gate exit(1); 1617c478bd9Sstevel@tonic-gate } 1627c478bd9Sstevel@tonic-gate 1637c478bd9Sstevel@tonic-gate if (ioctl(fd, DKIOCGMEDIAINFO, &media) < 0) { 1647c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1657c478bd9Sstevel@tonic-gate gettext("No media in specified device\n")); 1667c478bd9Sstevel@tonic-gate (void) close(fd); 1677c478bd9Sstevel@tonic-gate exit(1); 1687c478bd9Sstevel@tonic-gate } 1697c478bd9Sstevel@tonic-gate 1707c478bd9Sstevel@tonic-gate /* Check if volume manager has mounted this */ 1717c478bd9Sstevel@tonic-gate if (umount_required) { 1727c478bd9Sstevel@tonic-gate v_device_umount = check_and_unmount_vold(dev_name, U_flag); 1737c478bd9Sstevel@tonic-gate if (v_device_umount != 1) { 1747c478bd9Sstevel@tonic-gate m_scsi_umount = check_and_unmount_scsi(dev_name, 1757c478bd9Sstevel@tonic-gate U_flag); 1767c478bd9Sstevel@tonic-gate if (m_scsi_umount != 1) { 1777c478bd9Sstevel@tonic-gate m_flp_umount = check_and_unmount_floppy(fd, 1787c478bd9Sstevel@tonic-gate U_flag); 1797c478bd9Sstevel@tonic-gate if (m_flp_umount != 1) { 1807c478bd9Sstevel@tonic-gate umount_failed = 1; 1817c478bd9Sstevel@tonic-gate } 1827c478bd9Sstevel@tonic-gate } 1837c478bd9Sstevel@tonic-gate } 1847c478bd9Sstevel@tonic-gate } 1857c478bd9Sstevel@tonic-gate 1867c478bd9Sstevel@tonic-gate if (umount_required && U_flag && umount_failed) { 1877c478bd9Sstevel@tonic-gate if (v_device_umount || m_scsi_umount || m_flp_umount) { 1887c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1897c478bd9Sstevel@tonic-gate gettext("Could not unmount device.\n")); 1907c478bd9Sstevel@tonic-gate (void) close(fd); 1917c478bd9Sstevel@tonic-gate exit(1); 1927c478bd9Sstevel@tonic-gate } 1937c478bd9Sstevel@tonic-gate } 1947c478bd9Sstevel@tonic-gate 1957c478bd9Sstevel@tonic-gate if (umount_required && !U_flag) { 1967c478bd9Sstevel@tonic-gate if (v_device_umount || m_scsi_umount || m_flp_umount) { 1977c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("Device mounted.\n")); 1987c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 1997c478bd9Sstevel@tonic-gate gettext("Requested operation can not be \ 2007c478bd9Sstevel@tonic-gate performed on a mounted device.\n")); 2017c478bd9Sstevel@tonic-gate (void) close(fd); 2027c478bd9Sstevel@tonic-gate exit(1); 2037c478bd9Sstevel@tonic-gate } 2047c478bd9Sstevel@tonic-gate } 2057c478bd9Sstevel@tonic-gate /* register the fd with the libsmedia */ 2067c478bd9Sstevel@tonic-gate handle = smedia_get_handle(fd); 2077c478bd9Sstevel@tonic-gate if (handle == NULL) { 2087c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 2097c478bd9Sstevel@tonic-gate gettext("Failed to get libsmedia handle.\n")); 2107c478bd9Sstevel@tonic-gate (void) close(fd); 2117c478bd9Sstevel@tonic-gate exit(1); 2127c478bd9Sstevel@tonic-gate } 2137c478bd9Sstevel@tonic-gate 2147c478bd9Sstevel@tonic-gate if (smedia_get_medium_property(handle, &med_info) < 0) { 2157c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 2167c478bd9Sstevel@tonic-gate gettext("Get medium property failed \n")); 2177c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 2187c478bd9Sstevel@tonic-gate (void) close(fd); 2197c478bd9Sstevel@tonic-gate exit(1); 2207c478bd9Sstevel@tonic-gate } 2217c478bd9Sstevel@tonic-gate 2227c478bd9Sstevel@tonic-gate DPRINTF1("media type %x\n", med_info.sm_media_type); 2237c478bd9Sstevel@tonic-gate DPRINTF1("media block size %x\n", med_info.sm_blocksize); 224342440ecSPrasad Singamsetty DPRINTF1("media capacity %u\n", (uint32_t)med_info.sm_capacity); 2257c478bd9Sstevel@tonic-gate DPRINTF3("media cyl %d head %d sect %d\n", 2267c478bd9Sstevel@tonic-gate med_info.sm_pcyl, med_info.sm_nhead, med_info.sm_nsect); 2277c478bd9Sstevel@tonic-gate check_invalid_combinations_again(med_info.sm_media_type); 2287c478bd9Sstevel@tonic-gate 2297c478bd9Sstevel@tonic-gate /* 2307c478bd9Sstevel@tonic-gate * Special handling for pcmcia, sometimes open the file in 2317c478bd9Sstevel@tonic-gate * read-write mode. 2327c478bd9Sstevel@tonic-gate */ 2337c478bd9Sstevel@tonic-gate 2347c478bd9Sstevel@tonic-gate if (med_info.sm_media_type == SM_PCMCIA_MEM) { 2357c478bd9Sstevel@tonic-gate if (F_flag || H_flag || D_flag || (V_flag && verify_write)) { 2367c478bd9Sstevel@tonic-gate (void) close(fd); 2377c478bd9Sstevel@tonic-gate DPRINTF("Reopening device\n"); 2387c478bd9Sstevel@tonic-gate fd = my_open(dev_name, O_RDWR|O_NDELAY); 2397c478bd9Sstevel@tonic-gate if (fd < 0) { 2407c478bd9Sstevel@tonic-gate PERROR("Could not open device"); 2417c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 2427c478bd9Sstevel@tonic-gate (void) close(fd); 2437c478bd9Sstevel@tonic-gate exit(1); 2447c478bd9Sstevel@tonic-gate } 2457c478bd9Sstevel@tonic-gate } 2467c478bd9Sstevel@tonic-gate } 2477c478bd9Sstevel@tonic-gate 2487c478bd9Sstevel@tonic-gate if (med_info.sm_media_type == SM_PCMCIA_ATA) { 2497c478bd9Sstevel@tonic-gate if (V_flag || c_flag) { 2507c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 2517c478bd9Sstevel@tonic-gate gettext("Option not supported on PC ATA cards\n")); 2527c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 2537c478bd9Sstevel@tonic-gate (void) close(fd); 2547c478bd9Sstevel@tonic-gate exit(1); 2557c478bd9Sstevel@tonic-gate } 2567c478bd9Sstevel@tonic-gate if (F_flag) { 2577c478bd9Sstevel@tonic-gate /* same text as used by the format command */ 2587c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 2597c478bd9Sstevel@tonic-gate gettext("Cannot format this drive. Please use your \ 2607c478bd9Sstevel@tonic-gate Manufacturer supplied formatting utility.\n")); 2617c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 2627c478bd9Sstevel@tonic-gate (void) close(fd); 2637c478bd9Sstevel@tonic-gate exit(1); 2647c478bd9Sstevel@tonic-gate } 2657c478bd9Sstevel@tonic-gate } 2667c478bd9Sstevel@tonic-gate 2677c478bd9Sstevel@tonic-gate if (F_flag) 2687c478bd9Sstevel@tonic-gate process_F_flag(handle, fd); 2697c478bd9Sstevel@tonic-gate if (w_flag) 2707c478bd9Sstevel@tonic-gate process_w_flag(handle); 2717c478bd9Sstevel@tonic-gate if (W_flag) 2727c478bd9Sstevel@tonic-gate process_W_flag(handle); 2737c478bd9Sstevel@tonic-gate if (R_flag) 2747c478bd9Sstevel@tonic-gate process_R_flag(handle); 2757c478bd9Sstevel@tonic-gate if (p_flag) 2767c478bd9Sstevel@tonic-gate process_p_flag(handle, fd); 2777c478bd9Sstevel@tonic-gate if (D_flag) 2787c478bd9Sstevel@tonic-gate process_D_flag(handle, fd); 2797c478bd9Sstevel@tonic-gate if (H_flag) 2807c478bd9Sstevel@tonic-gate process_H_flag(handle, fd); 2817c478bd9Sstevel@tonic-gate if (V_flag) 2827c478bd9Sstevel@tonic-gate process_V_flag(handle, fd); 2837c478bd9Sstevel@tonic-gate if (c_flag) 2847c478bd9Sstevel@tonic-gate process_c_flag(handle); 2857c478bd9Sstevel@tonic-gate if (b_flag) 2867c478bd9Sstevel@tonic-gate process_b_flag(fd); 2877c478bd9Sstevel@tonic-gate if (s_flag) 2887c478bd9Sstevel@tonic-gate process_s_flag(handle, fd); 2897c478bd9Sstevel@tonic-gate if (e_flag) 2907c478bd9Sstevel@tonic-gate process_e_flag(handle); 2917c478bd9Sstevel@tonic-gate if (l_flag) { 2927c478bd9Sstevel@tonic-gate process_l_flag(); 2937c478bd9Sstevel@tonic-gate } 2947c478bd9Sstevel@tonic-gate 2957c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 2967c478bd9Sstevel@tonic-gate (void) close(fd); 2977c478bd9Sstevel@tonic-gate } 2987c478bd9Sstevel@tonic-gate 2997c478bd9Sstevel@tonic-gate /* 3007c478bd9Sstevel@tonic-gate * This routine handles the F_flag. 3017c478bd9Sstevel@tonic-gate * This options should not be used for floppy. However, 3027c478bd9Sstevel@tonic-gate * if this option is used for floppy, the option will 3037c478bd9Sstevel@tonic-gate * be forced to SM_FORMAT_HD and smedia_format is called. 3047c478bd9Sstevel@tonic-gate * Note that smedia_format is a blocked mode format and it 3057c478bd9Sstevel@tonic-gate * returns only after the complete formatting is over. 3067c478bd9Sstevel@tonic-gate */ 3077c478bd9Sstevel@tonic-gate 3087c478bd9Sstevel@tonic-gate static void 3097c478bd9Sstevel@tonic-gate process_F_flag(smedia_handle_t handle, int32_t fd) 3107c478bd9Sstevel@tonic-gate { 3117c478bd9Sstevel@tonic-gate uint32_t format_flag; 3127c478bd9Sstevel@tonic-gate int32_t old_per = 0; 3137c478bd9Sstevel@tonic-gate int32_t new_per, ret_val; 3147c478bd9Sstevel@tonic-gate 3157c478bd9Sstevel@tonic-gate if (force_format) { 3167c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 3177c478bd9Sstevel@tonic-gate gettext("Formatting disk.\n")); 3187c478bd9Sstevel@tonic-gate } else { 3197c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 3207c478bd9Sstevel@tonic-gate gettext("Formatting will erase all the data on disk.\n")); 3217c478bd9Sstevel@tonic-gate if (!get_confirmation()) 3227c478bd9Sstevel@tonic-gate return; 3237c478bd9Sstevel@tonic-gate } 3247c478bd9Sstevel@tonic-gate 3257c478bd9Sstevel@tonic-gate if (quick_format) 3267c478bd9Sstevel@tonic-gate format_flag = SM_FORMAT_QUICK; 3277c478bd9Sstevel@tonic-gate else if (long_format) 3287c478bd9Sstevel@tonic-gate format_flag = SM_FORMAT_LONG; 3297c478bd9Sstevel@tonic-gate else if (force_format) 3307c478bd9Sstevel@tonic-gate format_flag = SM_FORMAT_FORCE; 3317c478bd9Sstevel@tonic-gate 3327c478bd9Sstevel@tonic-gate if (med_info.sm_media_type == SM_FLOPPY) 3337c478bd9Sstevel@tonic-gate format_flag = SM_FORMAT_HD; 3347c478bd9Sstevel@tonic-gate 3357c478bd9Sstevel@tonic-gate if ((med_info.sm_media_type != SM_FLOPPY) && 3367c478bd9Sstevel@tonic-gate (med_info.sm_media_type != SM_PCMCIA_MEM) && 3377c478bd9Sstevel@tonic-gate (med_info.sm_media_type != SM_SCSI_FLOPPY)) { 3387c478bd9Sstevel@tonic-gate global_intr_msg = "Interrupting format may render the \ 3397c478bd9Sstevel@tonic-gate medium useless"; 3407c478bd9Sstevel@tonic-gate } else { 3417c478bd9Sstevel@tonic-gate global_intr_msg = ""; 3427c478bd9Sstevel@tonic-gate } 3437c478bd9Sstevel@tonic-gate trap_SIGINT(); 3447c478bd9Sstevel@tonic-gate 3457c478bd9Sstevel@tonic-gate if (smedia_format(handle, format_flag, SM_FORMAT_IMMEDIATE) != 0) { 3467c478bd9Sstevel@tonic-gate if (errno == EINVAL) { 3477c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("Format failed.\n")); 3487c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("The medium may not \ 3497c478bd9Sstevel@tonic-gate be compatible for format operation.\n")); 3507c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext("read/write surface \ 3517c478bd9Sstevel@tonic-gate scan may be used to get the effect of formatting.\n")); 3527c478bd9Sstevel@tonic-gate } else { 3537c478bd9Sstevel@tonic-gate PERROR("Format failed"); 3547c478bd9Sstevel@tonic-gate } 3557c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 3567c478bd9Sstevel@tonic-gate (void) close(fd); 3577c478bd9Sstevel@tonic-gate exit(1); 3587c478bd9Sstevel@tonic-gate } 3597c478bd9Sstevel@tonic-gate 3607c478bd9Sstevel@tonic-gate /* CONSTCOND */ 3617c478bd9Sstevel@tonic-gate while (1) { 3627c478bd9Sstevel@tonic-gate ret_val = smedia_check_format_status(handle); 3637c478bd9Sstevel@tonic-gate if (ret_val == -1) { 3647c478bd9Sstevel@tonic-gate if (errno != ENOTSUP) { 3657c478bd9Sstevel@tonic-gate PERROR("Format failed"); 3667c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 3677c478bd9Sstevel@tonic-gate (void) close(fd); 3687c478bd9Sstevel@tonic-gate exit(1); 3697c478bd9Sstevel@tonic-gate } else { 3707c478bd9Sstevel@tonic-gate /* Background formatting is not supported */ 3717c478bd9Sstevel@tonic-gate break; 3727c478bd9Sstevel@tonic-gate } 3737c478bd9Sstevel@tonic-gate } 3747c478bd9Sstevel@tonic-gate if (ret_val == 100) { 3757c478bd9Sstevel@tonic-gate (void) printf("\n"); 3767c478bd9Sstevel@tonic-gate (void) fflush(stdout); 3777c478bd9Sstevel@tonic-gate break; 3787c478bd9Sstevel@tonic-gate } 3797c478bd9Sstevel@tonic-gate new_per = (ret_val * 80)/100; 3807c478bd9Sstevel@tonic-gate while (new_per >= old_per) { 3817c478bd9Sstevel@tonic-gate (void) printf("."); 3827c478bd9Sstevel@tonic-gate (void) fflush(stdout); 3837c478bd9Sstevel@tonic-gate old_per++; 3847c478bd9Sstevel@tonic-gate } 3857c478bd9Sstevel@tonic-gate (void) sleep(6); 3867c478bd9Sstevel@tonic-gate } 3877c478bd9Sstevel@tonic-gate 3887c478bd9Sstevel@tonic-gate if ((med_info.sm_media_type == SM_FLOPPY) || 3897c478bd9Sstevel@tonic-gate (med_info.sm_media_type == SM_PCMCIA_MEM) || 3907c478bd9Sstevel@tonic-gate (med_info.sm_media_type == SM_SCSI_FLOPPY)) { 3917c478bd9Sstevel@tonic-gate (void) write_sunos_label(fd, med_info.sm_media_type); 3927c478bd9Sstevel@tonic-gate } else { 3937c478bd9Sstevel@tonic-gate 3947c478bd9Sstevel@tonic-gate /* 3957c478bd9Sstevel@tonic-gate * Iomega drives don't destroy the data in quick format. 3967c478bd9Sstevel@tonic-gate * Do a best effort write to first 1024 sectors. 3977c478bd9Sstevel@tonic-gate */ 3987c478bd9Sstevel@tonic-gate 3997c478bd9Sstevel@tonic-gate if (quick_format) 4007c478bd9Sstevel@tonic-gate overwrite_metadata(fd, handle); 4017c478bd9Sstevel@tonic-gate 4027c478bd9Sstevel@tonic-gate (void) write_default_label(handle, fd); 4037c478bd9Sstevel@tonic-gate } 4047c478bd9Sstevel@tonic-gate 4057c478bd9Sstevel@tonic-gate release_SIGINT(); 4067c478bd9Sstevel@tonic-gate } 4077c478bd9Sstevel@tonic-gate 4087c478bd9Sstevel@tonic-gate /* 4097c478bd9Sstevel@tonic-gate * List removable devices. 4107c478bd9Sstevel@tonic-gate */ 4117c478bd9Sstevel@tonic-gate static void 4127c478bd9Sstevel@tonic-gate process_l_flag() 4137c478bd9Sstevel@tonic-gate { 4147c478bd9Sstevel@tonic-gate int retry; 4157c478bd9Sstevel@tonic-gate int removable; 4167c478bd9Sstevel@tonic-gate int total_devices_found_last_time; 4177c478bd9Sstevel@tonic-gate int defer = 0; 4187c478bd9Sstevel@tonic-gate char *tmpstr; 4197c478bd9Sstevel@tonic-gate 4207c478bd9Sstevel@tonic-gate #define MAX_RETRIES_FOR_SCANNING 3 4217c478bd9Sstevel@tonic-gate 4227c478bd9Sstevel@tonic-gate vol_running = volmgt_running(); 4237c478bd9Sstevel@tonic-gate if (vol_running) 4247c478bd9Sstevel@tonic-gate defer = 1; 4257c478bd9Sstevel@tonic-gate (void) printf(gettext("Looking for devices...\n")); 4267c478bd9Sstevel@tonic-gate total_devices_found_last_time = 0; 4277c478bd9Sstevel@tonic-gate 4287c478bd9Sstevel@tonic-gate /* 4297c478bd9Sstevel@tonic-gate * Strip out any leading path. For example, /dev/rdsk/c3t0d0s2 4307c478bd9Sstevel@tonic-gate * will result in tmpstr = c3t0d0s2. dev_name is given as input 4317c478bd9Sstevel@tonic-gate * argument. 4327c478bd9Sstevel@tonic-gate */ 4337c478bd9Sstevel@tonic-gate if (dev_name) { 4347c478bd9Sstevel@tonic-gate if ((tmpstr = strrchr(dev_name, '/')) != NULL) { 4357c478bd9Sstevel@tonic-gate tmpstr += sizeof (char); 4367c478bd9Sstevel@tonic-gate } else { 4377c478bd9Sstevel@tonic-gate tmpstr = dev_name; 4387c478bd9Sstevel@tonic-gate } 4397c478bd9Sstevel@tonic-gate } 4407c478bd9Sstevel@tonic-gate 4417c478bd9Sstevel@tonic-gate for (retry = 0; retry < MAX_RETRIES_FOR_SCANNING; retry++) { 4427c478bd9Sstevel@tonic-gate removable = find_device(defer, tmpstr); 4437c478bd9Sstevel@tonic-gate if (removable == -1) 4447c478bd9Sstevel@tonic-gate break; 4457c478bd9Sstevel@tonic-gate 4467c478bd9Sstevel@tonic-gate /* 4477c478bd9Sstevel@tonic-gate * We'll do a small sleep and retry the command if volume 4487c478bd9Sstevel@tonic-gate * manager is running and no removable devices are found. 4497c478bd9Sstevel@tonic-gate * This is because the device may be busy. 4507c478bd9Sstevel@tonic-gate */ 4517c478bd9Sstevel@tonic-gate if (defer || (vol_running && (removable == 0))) { 4527c478bd9Sstevel@tonic-gate if ((total_devices_found == 0) || 4537c478bd9Sstevel@tonic-gate (total_devices_found != 4547c478bd9Sstevel@tonic-gate total_devices_found_last_time)) { 4557c478bd9Sstevel@tonic-gate total_devices_found_last_time = 4567c478bd9Sstevel@tonic-gate total_devices_found; 4577c478bd9Sstevel@tonic-gate (void) sleep(2); 4587c478bd9Sstevel@tonic-gate } else { 4597c478bd9Sstevel@tonic-gate /* Do the printing this time */ 4607c478bd9Sstevel@tonic-gate defer = 0; 4617c478bd9Sstevel@tonic-gate removable_found = 0; 4627c478bd9Sstevel@tonic-gate } 4637c478bd9Sstevel@tonic-gate 4647c478bd9Sstevel@tonic-gate } else 4657c478bd9Sstevel@tonic-gate break; 4667c478bd9Sstevel@tonic-gate } 4677c478bd9Sstevel@tonic-gate if (removable_found == 0) 4687c478bd9Sstevel@tonic-gate (void) printf(gettext("No removables found.\n")); 4697c478bd9Sstevel@tonic-gate } 4707c478bd9Sstevel@tonic-gate 4717c478bd9Sstevel@tonic-gate /* 4727c478bd9Sstevel@tonic-gate * The following three routines handle the write protect 4737c478bd9Sstevel@tonic-gate * options. These options are mostly Iomega ZIP/Jaz centric. 4747c478bd9Sstevel@tonic-gate * The following options are allowed : 4757c478bd9Sstevel@tonic-gate * No write protect <=> write protect without passwd : use -w flag 4767c478bd9Sstevel@tonic-gate * from any state to WP with passwd : use -W flag 4777c478bd9Sstevel@tonic-gate * from WP with passwd to no write protect : use -W flag 4787c478bd9Sstevel@tonic-gate * from any state to RWP with passwd : use -R flag 4797c478bd9Sstevel@tonic-gate * from RWP with passwd to no write protect : use -R flag 4807c478bd9Sstevel@tonic-gate * 4817c478bd9Sstevel@tonic-gate * The following transitions is not allowed 4827c478bd9Sstevel@tonic-gate * WP with passwd or RWP to WP without passwd. 4837c478bd9Sstevel@tonic-gate */ 4847c478bd9Sstevel@tonic-gate 4857c478bd9Sstevel@tonic-gate static void 4867c478bd9Sstevel@tonic-gate process_w_flag(smedia_handle_t handle) 4877c478bd9Sstevel@tonic-gate { 4887c478bd9Sstevel@tonic-gate int32_t rval; 4897c478bd9Sstevel@tonic-gate int32_t med_status; 4907c478bd9Sstevel@tonic-gate struct smwp_state wps; 4917c478bd9Sstevel@tonic-gate 4927c478bd9Sstevel@tonic-gate if ((rval = smedia_get_protection_status((handle), &wps)) < 0) { 4937c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 4947c478bd9Sstevel@tonic-gate gettext("Could not get medium status \n")); 4957c478bd9Sstevel@tonic-gate return; 4967c478bd9Sstevel@tonic-gate } 4977c478bd9Sstevel@tonic-gate med_status = wps.sm_new_state; 4987c478bd9Sstevel@tonic-gate 4997c478bd9Sstevel@tonic-gate wps.sm_version = SMWP_STATE_V_1; 5007c478bd9Sstevel@tonic-gate 5017c478bd9Sstevel@tonic-gate if (wp_enable) { /* Enable write protect no password */ 5027c478bd9Sstevel@tonic-gate 5037c478bd9Sstevel@tonic-gate switch (med_status) { 5047c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 5057c478bd9Sstevel@tonic-gate wps.sm_new_state = 5067c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_NOPASSWD; 5077c478bd9Sstevel@tonic-gate wps.sm_passwd_len = 0; 5087c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 5097c478bd9Sstevel@tonic-gate &wps); 5107c478bd9Sstevel@tonic-gate if (rval == -1) 5117c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 5127c478bd9Sstevel@tonic-gate break; 5137c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 5147c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_0)); 5157c478bd9Sstevel@tonic-gate break; 5167c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 5177c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_1)); 5187c478bd9Sstevel@tonic-gate break; 5197c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 5207c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_2)); 5217c478bd9Sstevel@tonic-gate break; 5227c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 5237c478bd9Sstevel@tonic-gate default : 5247c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_UNKNOWN)); 5257c478bd9Sstevel@tonic-gate break; 5267c478bd9Sstevel@tonic-gate } 5277c478bd9Sstevel@tonic-gate } else if (wp_disable) { 5287c478bd9Sstevel@tonic-gate switch (med_status) { 5297c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 5307c478bd9Sstevel@tonic-gate wps.sm_new_state = 5317c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_DISABLE; 5327c478bd9Sstevel@tonic-gate wps.sm_passwd_len = 0; 5337c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 5347c478bd9Sstevel@tonic-gate &wps); 5357c478bd9Sstevel@tonic-gate if (rval == -1) 5367c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 5377c478bd9Sstevel@tonic-gate break; 5387c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 5397c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_3)); 5407c478bd9Sstevel@tonic-gate break; 5417c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 5427c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_1)); 5437c478bd9Sstevel@tonic-gate break; 5447c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 5457c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_2)); 5467c478bd9Sstevel@tonic-gate break; 5477c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 5487c478bd9Sstevel@tonic-gate default : 5497c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_UNKNOWN)); 5507c478bd9Sstevel@tonic-gate break; 5517c478bd9Sstevel@tonic-gate } 5527c478bd9Sstevel@tonic-gate } 5537c478bd9Sstevel@tonic-gate } 5547c478bd9Sstevel@tonic-gate 5557c478bd9Sstevel@tonic-gate static void 5567c478bd9Sstevel@tonic-gate process_W_flag(smedia_handle_t handle) 5577c478bd9Sstevel@tonic-gate { 5587c478bd9Sstevel@tonic-gate int32_t rval; 5597c478bd9Sstevel@tonic-gate int32_t med_status; 5607c478bd9Sstevel@tonic-gate struct smwp_state wps; 5617c478bd9Sstevel@tonic-gate 5627c478bd9Sstevel@tonic-gate DPRINTF("Write protect with password\n"); 5637c478bd9Sstevel@tonic-gate 5647c478bd9Sstevel@tonic-gate if ((rval = smedia_get_protection_status((handle), &wps)) < 0) { 5657c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 5667c478bd9Sstevel@tonic-gate gettext("Could not get medium status \n")); 5677c478bd9Sstevel@tonic-gate return; 5687c478bd9Sstevel@tonic-gate } 5697c478bd9Sstevel@tonic-gate med_status = wps.sm_new_state; 5707c478bd9Sstevel@tonic-gate 5717c478bd9Sstevel@tonic-gate wps.sm_version = SMWP_STATE_V_1; 5727c478bd9Sstevel@tonic-gate 5737c478bd9Sstevel@tonic-gate if (wp_enable_passwd) { /* Enable write protect */ 5747c478bd9Sstevel@tonic-gate switch (med_status) { 5757c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 5767c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 5777c478bd9Sstevel@tonic-gate DPRINTF("Getting passwd\n"); 5787c478bd9Sstevel@tonic-gate get_passwd(&wps, 1); 5797c478bd9Sstevel@tonic-gate wps.sm_new_state = 5807c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_PASSWD; 5817c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 5827c478bd9Sstevel@tonic-gate &wps); 5837c478bd9Sstevel@tonic-gate if (rval == -1) { 5847c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 5857c478bd9Sstevel@tonic-gate } 5867c478bd9Sstevel@tonic-gate break; 5877c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 5887c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_4)); 5897c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_5)); 5907c478bd9Sstevel@tonic-gate get_passwd(&wps, 0); 5917c478bd9Sstevel@tonic-gate wps.sm_new_state = 5927c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_PASSWD; 5937c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 5947c478bd9Sstevel@tonic-gate &wps); 5957c478bd9Sstevel@tonic-gate if (rval == -1) { 5967c478bd9Sstevel@tonic-gate if (errno == EACCES) { 5977c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 5987c478bd9Sstevel@tonic-gate gettext(WP_MSG_10)); 5997c478bd9Sstevel@tonic-gate } else { 6007c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 6017c478bd9Sstevel@tonic-gate } 6027c478bd9Sstevel@tonic-gate } 6037c478bd9Sstevel@tonic-gate break; 6047c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 6057c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_6)); 6067c478bd9Sstevel@tonic-gate break; 6077c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 6087c478bd9Sstevel@tonic-gate default : 6097c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 6107c478bd9Sstevel@tonic-gate gettext(WP_UNKNOWN)); 6117c478bd9Sstevel@tonic-gate break; 6127c478bd9Sstevel@tonic-gate } 6137c478bd9Sstevel@tonic-gate } else if (wp_disable_passwd) { 6147c478bd9Sstevel@tonic-gate switch (med_status) { 6157c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 6167c478bd9Sstevel@tonic-gate get_passwd(&wps, 0); 6177c478bd9Sstevel@tonic-gate wps.sm_new_state = 6187c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_DISABLE; 6197c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 6207c478bd9Sstevel@tonic-gate &wps); 6217c478bd9Sstevel@tonic-gate if (rval == -1) { 6227c478bd9Sstevel@tonic-gate if (errno == EACCES) { 6237c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 6247c478bd9Sstevel@tonic-gate gettext(WP_MSG_10)); 6257c478bd9Sstevel@tonic-gate } else { 6267c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 6277c478bd9Sstevel@tonic-gate } 6287c478bd9Sstevel@tonic-gate } 6297c478bd9Sstevel@tonic-gate break; 6307c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 6317c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_2)); 6327c478bd9Sstevel@tonic-gate break; 6337c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 6347c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_7)); 6357c478bd9Sstevel@tonic-gate break; 6367c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 6377c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_3)); 6387c478bd9Sstevel@tonic-gate break; 6397c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 6407c478bd9Sstevel@tonic-gate default : 6417c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_UNKNOWN)); 6427c478bd9Sstevel@tonic-gate break; 6437c478bd9Sstevel@tonic-gate } 6447c478bd9Sstevel@tonic-gate } 6457c478bd9Sstevel@tonic-gate } 6467c478bd9Sstevel@tonic-gate 6477c478bd9Sstevel@tonic-gate static void 6487c478bd9Sstevel@tonic-gate process_R_flag(smedia_handle_t handle) 6497c478bd9Sstevel@tonic-gate { 6507c478bd9Sstevel@tonic-gate int32_t rval; 6517c478bd9Sstevel@tonic-gate int32_t med_status; 6527c478bd9Sstevel@tonic-gate struct smwp_state wps; 6537c478bd9Sstevel@tonic-gate 6547c478bd9Sstevel@tonic-gate DPRINTF("Read Write protect \n"); 6557c478bd9Sstevel@tonic-gate 6567c478bd9Sstevel@tonic-gate if ((rval = smedia_get_protection_status((handle), &wps)) < 0) { 6577c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 6587c478bd9Sstevel@tonic-gate gettext("Could not get medium status \n")); 6597c478bd9Sstevel@tonic-gate return; 6607c478bd9Sstevel@tonic-gate } 6617c478bd9Sstevel@tonic-gate med_status = wps.sm_new_state; 6627c478bd9Sstevel@tonic-gate 6637c478bd9Sstevel@tonic-gate wps.sm_version = SMWP_STATE_V_1; 6647c478bd9Sstevel@tonic-gate 6657c478bd9Sstevel@tonic-gate if (rw_protect_enable) { /* Enable write protect */ 6667c478bd9Sstevel@tonic-gate switch (med_status) { 6677c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 6687c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 6697c478bd9Sstevel@tonic-gate DPRINTF("Getting passwd\n"); 6707c478bd9Sstevel@tonic-gate get_passwd(&wps, 1); 6717c478bd9Sstevel@tonic-gate wps.sm_new_state = 6727c478bd9Sstevel@tonic-gate SM_READ_WRITE_PROTECT; 6737c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 6747c478bd9Sstevel@tonic-gate &wps); 6757c478bd9Sstevel@tonic-gate if (rval == -1) 6767c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 6777c478bd9Sstevel@tonic-gate break; 6787c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 6797c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_8)); 6807c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_9)); 6817c478bd9Sstevel@tonic-gate get_passwd(&wps, 0); 6827c478bd9Sstevel@tonic-gate wps.sm_new_state = 6837c478bd9Sstevel@tonic-gate SM_READ_WRITE_PROTECT; 6847c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 6857c478bd9Sstevel@tonic-gate &wps); 6867c478bd9Sstevel@tonic-gate if (rval == -1) { 6877c478bd9Sstevel@tonic-gate if (errno == EACCES) { 6887c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 6897c478bd9Sstevel@tonic-gate gettext(WP_MSG_10)); 6907c478bd9Sstevel@tonic-gate } else { 6917c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 6927c478bd9Sstevel@tonic-gate } 6937c478bd9Sstevel@tonic-gate } 6947c478bd9Sstevel@tonic-gate break; 6957c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 6967c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_4)); 6977c478bd9Sstevel@tonic-gate break; 6987c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 6997c478bd9Sstevel@tonic-gate default : 7007c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_UNKNOWN)); 7017c478bd9Sstevel@tonic-gate break; 7027c478bd9Sstevel@tonic-gate } 7037c478bd9Sstevel@tonic-gate } else if (rw_protect_disable) { 7047c478bd9Sstevel@tonic-gate switch (med_status) { 7057c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 7067c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 7077c478bd9Sstevel@tonic-gate get_passwd(&wps, 0); 7087c478bd9Sstevel@tonic-gate wps.sm_new_state = 7097c478bd9Sstevel@tonic-gate SM_WRITE_PROTECT_DISABLE; 7107c478bd9Sstevel@tonic-gate rval = smedia_set_protection_status(handle, 7117c478bd9Sstevel@tonic-gate &wps); 7127c478bd9Sstevel@tonic-gate if (rval == -1) { 7137c478bd9Sstevel@tonic-gate if (errno == EACCES) { 7147c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 7157c478bd9Sstevel@tonic-gate gettext(WP_MSG_10)); 7167c478bd9Sstevel@tonic-gate } else { 7177c478bd9Sstevel@tonic-gate PERROR(WP_ERROR); 7187c478bd9Sstevel@tonic-gate } 7197c478bd9Sstevel@tonic-gate } 7207c478bd9Sstevel@tonic-gate break; 7217c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 7227c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_1)); 7237c478bd9Sstevel@tonic-gate break; 7247c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 7257c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_7)); 7267c478bd9Sstevel@tonic-gate break; 7277c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 7287c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_MSG_3)); 7297c478bd9Sstevel@tonic-gate break; 7307c478bd9Sstevel@tonic-gate default : 7317c478bd9Sstevel@tonic-gate (void) fprintf(stderr, gettext(WP_UNKNOWN)); 7327c478bd9Sstevel@tonic-gate break; 7337c478bd9Sstevel@tonic-gate } 7347c478bd9Sstevel@tonic-gate } 7357c478bd9Sstevel@tonic-gate } 7367c478bd9Sstevel@tonic-gate 7377c478bd9Sstevel@tonic-gate void 7387c478bd9Sstevel@tonic-gate process_p_flag(smedia_handle_t handle, int32_t fd) 7397c478bd9Sstevel@tonic-gate { 7407c478bd9Sstevel@tonic-gate int32_t med_status; 7417c478bd9Sstevel@tonic-gate smwp_state_t wps; 7427c478bd9Sstevel@tonic-gate 7437c478bd9Sstevel@tonic-gate med_status = smedia_get_protection_status((handle), &wps); 7447c478bd9Sstevel@tonic-gate DPRINTF("Could not get medium status \n"); 7457c478bd9Sstevel@tonic-gate 7467c478bd9Sstevel@tonic-gate /* 7477c478bd9Sstevel@tonic-gate * Workaround in case mode sense fails. 7487c478bd9Sstevel@tonic-gate * 7497c478bd9Sstevel@tonic-gate * Also, special handling for PCMCIA. PCMCIA does not have any 7507c478bd9Sstevel@tonic-gate * ioctl to find out the write protect status. So, open the 7517c478bd9Sstevel@tonic-gate * device with O_RDWR. If it passes, it is not write protected, 7527c478bd9Sstevel@tonic-gate * otherwise it is write protected. 7537c478bd9Sstevel@tonic-gate * If it fails, reopen with O_RDONLY, may be some other 7547c478bd9Sstevel@tonic-gate * operation can go through. 7557c478bd9Sstevel@tonic-gate */ 7567c478bd9Sstevel@tonic-gate if ((med_status < 0) || (med_info.sm_media_type == SM_PCMCIA_MEM) || 7577c478bd9Sstevel@tonic-gate (med_info.sm_media_type == SM_PCMCIA_ATA)) { 7587c478bd9Sstevel@tonic-gate (void) close(fd); 7597c478bd9Sstevel@tonic-gate DPRINTF("Reopening device for -p option\n"); 7607c478bd9Sstevel@tonic-gate fd = my_open(dev_name, O_RDONLY|O_NDELAY); 7617c478bd9Sstevel@tonic-gate if (fd < 0) { 7627c478bd9Sstevel@tonic-gate if (p_flag) { 7637c478bd9Sstevel@tonic-gate PERROR("Could not open device"); 7647c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 7657c478bd9Sstevel@tonic-gate (void) close(fd); 7667c478bd9Sstevel@tonic-gate exit(1); 7677c478bd9Sstevel@tonic-gate } else { 768*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7697c478bd9Sstevel@tonic-gate gettext("<Unknown>\n")); 7707c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 7717c478bd9Sstevel@tonic-gate (void) close(fd); 7727c478bd9Sstevel@tonic-gate return; 7737c478bd9Sstevel@tonic-gate } 7747c478bd9Sstevel@tonic-gate fd = my_open(dev_name, O_RDWR|O_NDELAY); 7757c478bd9Sstevel@tonic-gate if (fd < 0) { 776*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7777c478bd9Sstevel@tonic-gate gettext("Medium is write protected.\n")); 7787c478bd9Sstevel@tonic-gate } 7797c478bd9Sstevel@tonic-gate } else { /* Open succeeded */ 780*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7817c478bd9Sstevel@tonic-gate gettext("Medium is not write protected.\n")); 7827c478bd9Sstevel@tonic-gate } 7837c478bd9Sstevel@tonic-gate return; 7847c478bd9Sstevel@tonic-gate } 7857c478bd9Sstevel@tonic-gate med_status = wps.sm_new_state; 7867c478bd9Sstevel@tonic-gate switch (med_status) { 7877c478bd9Sstevel@tonic-gate 7887c478bd9Sstevel@tonic-gate case SM_READ_WRITE_PROTECT : 789*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7907c478bd9Sstevel@tonic-gate gettext("Medium is read-write protected.\n")); 7917c478bd9Sstevel@tonic-gate break; 7927c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_PASSWD : 793*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7947c478bd9Sstevel@tonic-gate gettext("Medium is write protected with password.\n")); 7957c478bd9Sstevel@tonic-gate break; 7967c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_NOPASSWD : 797*afb89a98SPavel Potoplyak (void) fprintf(stdout, 7987c478bd9Sstevel@tonic-gate gettext("Medium is write protected.\n")); 7997c478bd9Sstevel@tonic-gate break; 8007c478bd9Sstevel@tonic-gate case SM_WRITE_PROTECT_DISABLE : 801*afb89a98SPavel Potoplyak (void) fprintf(stdout, 8027c478bd9Sstevel@tonic-gate gettext("Medium is not write protected.\n")); 8037c478bd9Sstevel@tonic-gate break; 8047c478bd9Sstevel@tonic-gate case SM_STATUS_UNKNOWN : 8057c478bd9Sstevel@tonic-gate default: 806*afb89a98SPavel Potoplyak (void) fprintf(stdout, 8077c478bd9Sstevel@tonic-gate gettext("Unknown write protect status.\n")); 8087c478bd9Sstevel@tonic-gate break; 8097c478bd9Sstevel@tonic-gate } 8107c478bd9Sstevel@tonic-gate } 8117c478bd9Sstevel@tonic-gate 8127c478bd9Sstevel@tonic-gate static void 8137c478bd9Sstevel@tonic-gate process_c_flag(smedia_handle_t handle) 8147c478bd9Sstevel@tonic-gate { 8157c478bd9Sstevel@tonic-gate char error_string[256]; 8167c478bd9Sstevel@tonic-gate 8177c478bd9Sstevel@tonic-gate if (smedia_reassign_block(handle, repair_blk_no) != 0) { 8187c478bd9Sstevel@tonic-gate (void) snprintf(error_string, 255, 819342440ecSPrasad Singamsetty gettext("Could not repair block no %llu"), repair_blk_no); 8207c478bd9Sstevel@tonic-gate PERROR(error_string); 8217c478bd9Sstevel@tonic-gate return; 8227c478bd9Sstevel@tonic-gate } 8237c478bd9Sstevel@tonic-gate } 8247c478bd9Sstevel@tonic-gate 8257c478bd9Sstevel@tonic-gate /* 8267c478bd9Sstevel@tonic-gate * This routine handles the -V (verify) option. 8277c478bd9Sstevel@tonic-gate * There can be devices without rw_read option. If the raw_read 8287c478bd9Sstevel@tonic-gate * and raw_write are not supported by the interface, then read and 8297c478bd9Sstevel@tonic-gate * write system calls are used. It is assumed that either both 8307c478bd9Sstevel@tonic-gate * raw_read and raw_write are supported or both are unsupported. 8317c478bd9Sstevel@tonic-gate */ 8327c478bd9Sstevel@tonic-gate 8337c478bd9Sstevel@tonic-gate static void 8347c478bd9Sstevel@tonic-gate process_V_flag(smedia_handle_t handle, int32_t fd) 8357c478bd9Sstevel@tonic-gate { 8367c478bd9Sstevel@tonic-gate int32_t ret; 837342440ecSPrasad Singamsetty uint32_t j; 838342440ecSPrasad Singamsetty diskaddr_t bn; 8397c478bd9Sstevel@tonic-gate char *read_buf, *write_buf; 8407c478bd9Sstevel@tonic-gate int32_t old_per = 0; 8417c478bd9Sstevel@tonic-gate int32_t new_per; 8427c478bd9Sstevel@tonic-gate int32_t no_raw_rw = 0; 8437c478bd9Sstevel@tonic-gate int32_t verify_size; 844342440ecSPrasad Singamsetty diskaddr_t capacity; 8457c478bd9Sstevel@tonic-gate int32_t blocksize; 8467c478bd9Sstevel@tonic-gate 8477c478bd9Sstevel@tonic-gate DPRINTF("ANALYSE MEDIA \n"); 8487c478bd9Sstevel@tonic-gate 8497c478bd9Sstevel@tonic-gate ret = smedia_get_medium_property(handle, &med_info); 8507c478bd9Sstevel@tonic-gate if (ret == -1) { 8517c478bd9Sstevel@tonic-gate DPRINTF("get_media_info failed\n"); 8527c478bd9Sstevel@tonic-gate return; 8537c478bd9Sstevel@tonic-gate } 8547c478bd9Sstevel@tonic-gate 8557c478bd9Sstevel@tonic-gate DPRINTF1("media_type %d\n", med_info.sm_media_type); 8567c478bd9Sstevel@tonic-gate DPRINTF1("sector_size %d\n", med_info.sm_blocksize); 857342440ecSPrasad Singamsetty DPRINTF1("num_sectors %u\n", (uint32_t)med_info.sm_capacity); 8587c478bd9Sstevel@tonic-gate DPRINTF1("nsect %d\n", med_info.sm_nsect); 8597c478bd9Sstevel@tonic-gate 8607c478bd9Sstevel@tonic-gate blocksize = med_info.sm_blocksize; 8617c478bd9Sstevel@tonic-gate 862342440ecSPrasad Singamsetty capacity = (uint32_t)med_info.sm_capacity; 8637c478bd9Sstevel@tonic-gate verify_size = (med_info.sm_nsect > 64) ? 64 : med_info.sm_nsect; 8647c478bd9Sstevel@tonic-gate read_buf = (char *)malloc(blocksize * verify_size); 8657c478bd9Sstevel@tonic-gate if (read_buf == NULL) { 8667c478bd9Sstevel@tonic-gate DPRINTF("Could not allocate memory\n"); 8677c478bd9Sstevel@tonic-gate return; 8687c478bd9Sstevel@tonic-gate } 8697c478bd9Sstevel@tonic-gate write_buf = (char *)malloc(blocksize * verify_size); 8707c478bd9Sstevel@tonic-gate if (write_buf == NULL) { 8717c478bd9Sstevel@tonic-gate DPRINTF("Could not allocate memory\n"); 8727c478bd9Sstevel@tonic-gate free(read_buf); 8737c478bd9Sstevel@tonic-gate return; 8747c478bd9Sstevel@tonic-gate } 8757c478bd9Sstevel@tonic-gate 8767c478bd9Sstevel@tonic-gate if (!verify_write) { 8777c478bd9Sstevel@tonic-gate DPRINTF("Non-destructive verify \n"); 878342440ecSPrasad Singamsetty for (bn = 0; bn < (uint32_t)med_info.sm_capacity; 879342440ecSPrasad Singamsetty bn += verify_size) { 880342440ecSPrasad Singamsetty new_per = (bn * 80)/(uint32_t)med_info.sm_capacity; 8817c478bd9Sstevel@tonic-gate if (new_per >= old_per) { 8827c478bd9Sstevel@tonic-gate (void) printf("."); 8837c478bd9Sstevel@tonic-gate (void) fflush(stdout); 8847c478bd9Sstevel@tonic-gate old_per++; 8857c478bd9Sstevel@tonic-gate } 886342440ecSPrasad Singamsetty DPRINTF2("Reading %d blks starting at %llu\n", 887342440ecSPrasad Singamsetty verify_size, bn); 888342440ecSPrasad Singamsetty ret = verify(handle, fd, bn, verify_size, read_buf, 8897c478bd9Sstevel@tonic-gate VERIFY_READ, blocksize, no_raw_rw); 8907c478bd9Sstevel@tonic-gate if ((ret == -1) && (errno == ENOTSUP)) { 8917c478bd9Sstevel@tonic-gate no_raw_rw = 1; 892342440ecSPrasad Singamsetty ret = verify(handle, fd, bn, verify_size, 8937c478bd9Sstevel@tonic-gate read_buf, 8947c478bd9Sstevel@tonic-gate VERIFY_READ, blocksize, no_raw_rw); 895342440ecSPrasad Singamsetty capacity = (diskaddr_t)med_info.sm_pcyl * 896342440ecSPrasad Singamsetty med_info.sm_nhead * med_info.sm_nsect; 8977c478bd9Sstevel@tonic-gate } 8987c478bd9Sstevel@tonic-gate 8997c478bd9Sstevel@tonic-gate if (ret != 0) { 9007c478bd9Sstevel@tonic-gate for (j = 0; j < verify_size; j++) { 901342440ecSPrasad Singamsetty if ((bn + j) >= capacity) 9027c478bd9Sstevel@tonic-gate return; 9037c478bd9Sstevel@tonic-gate DPRINTF2( 904342440ecSPrasad Singamsetty "Reading %d blks starting " 905342440ecSPrasad Singamsetty "at %llu\n", 1, bn + j); 906342440ecSPrasad Singamsetty ret = verify(handle, fd, bn + j, 1, 9077c478bd9Sstevel@tonic-gate read_buf, 9087c478bd9Sstevel@tonic-gate VERIFY_READ, blocksize, 9097c478bd9Sstevel@tonic-gate no_raw_rw); 9107c478bd9Sstevel@tonic-gate if (ret == -1) { 911342440ecSPrasad Singamsetty (void) printf( 912342440ecSPrasad Singamsetty "Bad block %llu\n", 913342440ecSPrasad Singamsetty bn + j); 9147c478bd9Sstevel@tonic-gate } 9157c478bd9Sstevel@tonic-gate } 9167c478bd9Sstevel@tonic-gate } 9177c478bd9Sstevel@tonic-gate } 9187c478bd9Sstevel@tonic-gate } else { 9197c478bd9Sstevel@tonic-gate 9207c478bd9Sstevel@tonic-gate DPRINTF("Destrutive verify \n"); 921342440ecSPrasad Singamsetty for (bn = 0; bn < (uint32_t)med_info.sm_capacity; 922342440ecSPrasad Singamsetty bn += verify_size) { 923342440ecSPrasad Singamsetty new_per = (bn * 80)/(uint32_t)med_info.sm_capacity; 9247c478bd9Sstevel@tonic-gate if (new_per >= old_per) { 9257c478bd9Sstevel@tonic-gate (void) printf("."); 9267c478bd9Sstevel@tonic-gate 9277c478bd9Sstevel@tonic-gate (void) fflush(stdout); 9287c478bd9Sstevel@tonic-gate old_per++; 9297c478bd9Sstevel@tonic-gate } 9307c478bd9Sstevel@tonic-gate 9317c478bd9Sstevel@tonic-gate for (j = 0; j < blocksize * verify_size; j++) { 932342440ecSPrasad Singamsetty write_buf[j] = (bn | j) & 0xFF; 9337c478bd9Sstevel@tonic-gate } 934342440ecSPrasad Singamsetty DPRINTF2("Writing %d blks starting at %llu\n", 935342440ecSPrasad Singamsetty verify_size, bn); 936342440ecSPrasad Singamsetty ret = verify(handle, fd, bn, verify_size, write_buf, 9377c478bd9Sstevel@tonic-gate VERIFY_WRITE, blocksize, no_raw_rw); 9387c478bd9Sstevel@tonic-gate 9397c478bd9Sstevel@tonic-gate if (ret != 0) { 9407c478bd9Sstevel@tonic-gate for (j = 0; j < verify_size; j++) { 941342440ecSPrasad Singamsetty if ((bn + j) >= capacity) 9427c478bd9Sstevel@tonic-gate break; 9437c478bd9Sstevel@tonic-gate DPRINTF2( 944342440ecSPrasad Singamsetty "Writing %d blks starting " 945342440ecSPrasad Singamsetty "at %llu\n", 1, bn + j); 946342440ecSPrasad Singamsetty ret = verify(handle, fd, bn + j, 1, 9477c478bd9Sstevel@tonic-gate write_buf, 9487c478bd9Sstevel@tonic-gate VERIFY_WRITE, blocksize, 9497c478bd9Sstevel@tonic-gate no_raw_rw); 9507c478bd9Sstevel@tonic-gate if (ret == -1) { 951342440ecSPrasad Singamsetty (void) printf( 952342440ecSPrasad Singamsetty "Bad block %llu\n", bn + j); 9537c478bd9Sstevel@tonic-gate } 9547c478bd9Sstevel@tonic-gate } 9557c478bd9Sstevel@tonic-gate } 956342440ecSPrasad Singamsetty DPRINTF2("Read after write %d blks starting at %llu\n", 957342440ecSPrasad Singamsetty verify_size, bn); 958342440ecSPrasad Singamsetty ret = verify(handle, fd, bn, verify_size, 9597c478bd9Sstevel@tonic-gate read_buf, VERIFY_READ, blocksize, no_raw_rw); 9607c478bd9Sstevel@tonic-gate 9617c478bd9Sstevel@tonic-gate if (ret != 0) { 9627c478bd9Sstevel@tonic-gate for (j = 0; j < verify_size; j++) { 963342440ecSPrasad Singamsetty if ((bn + j) >= capacity) 9647c478bd9Sstevel@tonic-gate return; 9657c478bd9Sstevel@tonic-gate DPRINTF2( 966342440ecSPrasad Singamsetty "Read after write %d blks " 967342440ecSPrasad Singamsetty "starting at %llu\n", 1, bn + j); 968342440ecSPrasad Singamsetty ret = verify(handle, fd, bn + j, 1, 9697c478bd9Sstevel@tonic-gate read_buf, VERIFY_READ, 9707c478bd9Sstevel@tonic-gate blocksize, no_raw_rw); 9717c478bd9Sstevel@tonic-gate if (ret == -1) { 972342440ecSPrasad Singamsetty (void) printf( 973342440ecSPrasad Singamsetty "Bad block %llu\n", bn + j); 9747c478bd9Sstevel@tonic-gate } 9757c478bd9Sstevel@tonic-gate } 9767c478bd9Sstevel@tonic-gate } 9777c478bd9Sstevel@tonic-gate 9787c478bd9Sstevel@tonic-gate 9797c478bd9Sstevel@tonic-gate } 9807c478bd9Sstevel@tonic-gate } 9817c478bd9Sstevel@tonic-gate } 9827c478bd9Sstevel@tonic-gate 9837c478bd9Sstevel@tonic-gate static void 9847c478bd9Sstevel@tonic-gate process_s_flag(smedia_handle_t handle, int32_t fd) 9857c478bd9Sstevel@tonic-gate { 9867c478bd9Sstevel@tonic-gate int32_t i, ret; 987342440ecSPrasad Singamsetty struct extvtoc v_toc, t_vtoc; 9887c478bd9Sstevel@tonic-gate if (valid_slice_file(handle, fd, slice_file, &v_toc)) { 9897c478bd9Sstevel@tonic-gate (void) smedia_release_handle(handle); 9907c478bd9Sstevel@tonic-gate (void) close(fd); 9917c478bd9Sstevel@tonic-gate exit(1); 9927c478bd9Sstevel@tonic-gate } 9937c478bd9Sstevel@tonic-gate 9947c478bd9Sstevel@tonic-gate (void) memset(&t_vtoc, 0, sizeof (t_vtoc)); 9957c478bd9Sstevel@tonic-gate 9967c478bd9Sstevel@tonic-gate 9977c478bd9Sstevel@tonic-gate t_vtoc.v_nparts = V_NUMPAR; 9987c478bd9Sstevel@tonic-gate t_vtoc.v_sanity = VTOC_SANE; 9997c478bd9Sstevel@tonic-gate t_vtoc.v_version = V_VERSION; 10007c478bd9Sstevel@tonic-gate t_vtoc.v_sectorsz = DEV_BSIZE; 10017c478bd9Sstevel@tonic-gate 10027c478bd9Sstevel@tonic-gate /* Get existing Vtoc, don't bother if it fails. */ 10037c478bd9Sstevel@tonic-gate 1004e3397557Szk194757 /* Turn on privileges. */ 1005e3397557Szk194757 (void) __priv_bracket(PRIV_ON); 10067c478bd9Sstevel@tonic-gate 1007342440ecSPrasad Singamsetty (void) read_extvtoc(fd, &t_vtoc); 10087c478bd9Sstevel@tonic-gate 1009e3397557Szk194757 /* Turn off privileges. */ 1010e3397557Szk194757 (void) __priv_bracket(PRIV_OFF); 10117c478bd9Sstevel@tonic-gate 10127c478bd9Sstevel@tonic-gate for (i = 0; i < V_NUMPAR; i++) { 10137c478bd9Sstevel@tonic-gate t_vtoc.v_part[i].p_start = v_toc.v_part[i].p_start; 10147c478bd9Sstevel@tonic-gate t_vtoc.v_part[i].p_size = v_toc.v_part[i].p_size; 10157c478bd9Sstevel@tonic-gate t_vtoc.v_part[i].p_tag = v_toc.v_part[i].p_tag; 10167c478bd9Sstevel@tonic-gate t_vtoc.v_part[i].p_flag = v_toc.v_part[i].p_flag; 10177c478bd9Sstevel@tonic-gate } 10187c478bd9Sstevel@tonic-gate 10197c478bd9Sstevel@tonic-gate errno = 0; 10207c478bd9Sstevel@tonic-gate 10217c478bd9Sstevel@tonic-gate 1022e3397557Szk194757 /* Turn on privileges. */ 1023e3397557Szk194757 (void) __priv_bracket(PRIV_ON); 10247c478bd9Sstevel@tonic-gate 1025342440ecSPrasad Singamsetty ret = write_extvtoc(fd, &t_vtoc); 10267c478bd9Sstevel@tonic-gate 1027e3397557Szk194757 /* Turn off privileges. */ 1028e3397557Szk194757 (void) __priv_bracket(PRIV_OFF); 10297c478bd9Sstevel@tonic-gate 10307c478bd9Sstevel@tonic-gate if (ret < 0) { 10317c478bd9Sstevel@tonic-gate #ifdef sparc 10327c478bd9Sstevel@tonic-gate PERROR("write VTOC failed"); 10337c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 10347c478bd9Sstevel@tonic-gate #else /* i386 */ 10357c478bd9Sstevel@tonic-gate if (errno == EIO) { 10367c478bd9Sstevel@tonic-gate PERROR("No Solaris partition, eject & retry"); 10377c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 10387c478bd9Sstevel@tonic-gate } else { 10397c478bd9Sstevel@tonic-gate PERROR("write VTOC failed"); 10407c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 10417c478bd9Sstevel@tonic-gate } 10427c478bd9Sstevel@tonic-gate #endif 10437c478bd9Sstevel@tonic-gate } 10447c478bd9Sstevel@tonic-gate } 10457c478bd9Sstevel@tonic-gate static void 10467c478bd9Sstevel@tonic-gate process_e_flag(smedia_handle_t handle) 10477c478bd9Sstevel@tonic-gate { 10487c478bd9Sstevel@tonic-gate if (smedia_eject(handle) < 0) { 10497c478bd9Sstevel@tonic-gate PERROR("Eject failed"); 10507c478bd9Sstevel@tonic-gate } 10517c478bd9Sstevel@tonic-gate } 10527c478bd9Sstevel@tonic-gate static void 10537c478bd9Sstevel@tonic-gate process_H_flag(smedia_handle_t handle, int32_t fd) 10547c478bd9Sstevel@tonic-gate { 10557c478bd9Sstevel@tonic-gate uint32_t cyl, head; 10567c478bd9Sstevel@tonic-gate int32_t old_per = 0; 10577c478bd9Sstevel@tonic-gate int32_t new_per; 10587c478bd9Sstevel@tonic-gate 10597c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 10607c478bd9Sstevel@tonic-gate gettext("Formatting will erase all the data on disk.\n")); 10617c478bd9Sstevel@tonic-gate if (!get_confirmation()) 10627c478bd9Sstevel@tonic-gate return; 10637c478bd9Sstevel@tonic-gate 10647c478bd9Sstevel@tonic-gate for (cyl = 0; cyl < med_info.sm_pcyl; cyl++) { 10657c478bd9Sstevel@tonic-gate for (head = 0; head < med_info.sm_nhead; head++) { 10667c478bd9Sstevel@tonic-gate if (smedia_format_track(handle, cyl, head, SM_FORMAT_HD) 10677c478bd9Sstevel@tonic-gate < 0) { 10687c478bd9Sstevel@tonic-gate PERROR("Format failed"); 10697c478bd9Sstevel@tonic-gate return; 10707c478bd9Sstevel@tonic-gate } 10717c478bd9Sstevel@tonic-gate } 10727c478bd9Sstevel@tonic-gate new_per = (cyl * 80)/med_info.sm_pcyl; 10737c478bd9Sstevel@tonic-gate while (new_per >= old_per) { 10747c478bd9Sstevel@tonic-gate (void) printf("."); 10757c478bd9Sstevel@tonic-gate (void) fflush(stdout); 10767c478bd9Sstevel@tonic-gate old_per++; 10777c478bd9Sstevel@tonic-gate } 10787c478bd9Sstevel@tonic-gate } 10797c478bd9Sstevel@tonic-gate 10807c478bd9Sstevel@tonic-gate (void) write_sunos_label(fd, med_info.sm_media_type); 10817c478bd9Sstevel@tonic-gate } 10827c478bd9Sstevel@tonic-gate 10837c478bd9Sstevel@tonic-gate static void 10847c478bd9Sstevel@tonic-gate process_D_flag(smedia_handle_t handle, int32_t fd) 10857c478bd9Sstevel@tonic-gate { 10867c478bd9Sstevel@tonic-gate uint32_t cyl, head; 10877c478bd9Sstevel@tonic-gate int32_t old_per = 0; 10887c478bd9Sstevel@tonic-gate int32_t new_per; 10897c478bd9Sstevel@tonic-gate 10907c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 10917c478bd9Sstevel@tonic-gate gettext("Formatting will erase all the data on disk.\n")); 10927c478bd9Sstevel@tonic-gate if (!get_confirmation()) 10937c478bd9Sstevel@tonic-gate return; 10947c478bd9Sstevel@tonic-gate for (cyl = 0; cyl < med_info.sm_pcyl; cyl++) { 10957c478bd9Sstevel@tonic-gate for (head = 0; head < med_info.sm_nhead; head++) { 10967c478bd9Sstevel@tonic-gate if (smedia_format_track(handle, cyl, head, SM_FORMAT_DD) 10977c478bd9Sstevel@tonic-gate < 0) { 10987c478bd9Sstevel@tonic-gate PERROR("Format failed"); 10997c478bd9Sstevel@tonic-gate return; 11007c478bd9Sstevel@tonic-gate } 11017c478bd9Sstevel@tonic-gate } 11027c478bd9Sstevel@tonic-gate new_per = (cyl * 80)/med_info.sm_pcyl; 11037c478bd9Sstevel@tonic-gate while (new_per >= old_per) { 11047c478bd9Sstevel@tonic-gate (void) printf("."); 11057c478bd9Sstevel@tonic-gate (void) fflush(stdout); 11067c478bd9Sstevel@tonic-gate old_per++; 11077c478bd9Sstevel@tonic-gate } 11087c478bd9Sstevel@tonic-gate } 11097c478bd9Sstevel@tonic-gate (void) write_sunos_label(fd, med_info.sm_media_type); 11107c478bd9Sstevel@tonic-gate } 11117c478bd9Sstevel@tonic-gate 11127c478bd9Sstevel@tonic-gate /* 11137c478bd9Sstevel@tonic-gate * This routine handles the -b (label) option. 11147c478bd9Sstevel@tonic-gate * Please note that, this will fail if there is no valid vtoc is 11157c478bd9Sstevel@tonic-gate * there on the medium and the vtoc is not faked. 11167c478bd9Sstevel@tonic-gate */ 11177c478bd9Sstevel@tonic-gate 11187c478bd9Sstevel@tonic-gate static void 11197c478bd9Sstevel@tonic-gate process_b_flag(int32_t fd) 11207c478bd9Sstevel@tonic-gate { 11217c478bd9Sstevel@tonic-gate int32_t ret, nparts; 1122342440ecSPrasad Singamsetty struct extvtoc v_toc; 11237c478bd9Sstevel@tonic-gate struct dk_gpt *vtoc64; 11247c478bd9Sstevel@tonic-gate 11257c478bd9Sstevel@tonic-gate /* For EFI disks. */ 11267c478bd9Sstevel@tonic-gate if (efi_type(fd)) { 11277c478bd9Sstevel@tonic-gate if (efi_alloc_and_read(fd, &vtoc64) < 0) { 11287c478bd9Sstevel@tonic-gate /* 11297c478bd9Sstevel@tonic-gate * If reading the vtoc failed, try to 11307c478bd9Sstevel@tonic-gate * auto-sense the disk configuration. 11317c478bd9Sstevel@tonic-gate */ 11327c478bd9Sstevel@tonic-gate if (efi_auto_sense(fd, &vtoc64) < 0) { 11337c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 11347c478bd9Sstevel@tonic-gate gettext("Could not write label.\n")); 11357c478bd9Sstevel@tonic-gate return; 11367c478bd9Sstevel@tonic-gate } 11377c478bd9Sstevel@tonic-gate } 11387c478bd9Sstevel@tonic-gate for (nparts = 0; nparts < vtoc64->efi_nparts; 11397c478bd9Sstevel@tonic-gate nparts++) { 11407c478bd9Sstevel@tonic-gate if (vtoc64->efi_parts[nparts].p_tag == 11417c478bd9Sstevel@tonic-gate V_RESERVED) { 11427c478bd9Sstevel@tonic-gate if (vtoc64->efi_parts[nparts].p_name) { 11437c478bd9Sstevel@tonic-gate (void) strncpy( 11447c478bd9Sstevel@tonic-gate vtoc64->efi_parts[nparts].p_name, label, 11457c478bd9Sstevel@tonic-gate EFI_PART_NAME_LEN); 11467c478bd9Sstevel@tonic-gate } 11477c478bd9Sstevel@tonic-gate break; 11487c478bd9Sstevel@tonic-gate } 11497c478bd9Sstevel@tonic-gate } 11507c478bd9Sstevel@tonic-gate if (efi_write(fd, vtoc64) != 0) { 11517c478bd9Sstevel@tonic-gate (void) efi_err_check(vtoc64); 11527c478bd9Sstevel@tonic-gate (void) fprintf(stderr, 11537c478bd9Sstevel@tonic-gate gettext("Could not write label.\n")); 11547c478bd9Sstevel@tonic-gate } 11557c478bd9Sstevel@tonic-gate return; 11567c478bd9Sstevel@tonic-gate } 11577c478bd9Sstevel@tonic-gate 11587c478bd9Sstevel@tonic-gate /* Get existing Vtoc */ 11597c478bd9Sstevel@tonic-gate 1160e3397557Szk194757 /* Turn on privileges. */ 1161e3397557Szk194757 (void) __priv_bracket(PRIV_ON); 11627c478bd9Sstevel@tonic-gate 1163342440ecSPrasad Singamsetty ret = read_extvtoc(fd, &v_toc); 11647c478bd9Sstevel@tonic-gate 1165e3397557Szk194757 /* Turn off privileges */ 1166e3397557Szk194757 (void) __priv_bracket(PRIV_OFF); 11677c478bd9Sstevel@tonic-gate 11687c478bd9Sstevel@tonic-gate if (ret < 0) { 11697c478bd9Sstevel@tonic-gate #ifdef sparc 11707c478bd9Sstevel@tonic-gate PERROR("read VTOC failed"); 11717c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 11727c478bd9Sstevel@tonic-gate #else /* i386 */ 11737c478bd9Sstevel@tonic-gate if (errno == EIO) { 11747c478bd9Sstevel@tonic-gate PERROR("No Solaris partition, eject & retry"); 11757c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 11767c478bd9Sstevel@tonic-gate } else { 11777c478bd9Sstevel@tonic-gate PERROR("read VTOC failed"); 11787c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 11797c478bd9Sstevel@tonic-gate } 11807c478bd9Sstevel@tonic-gate #endif 11817c478bd9Sstevel@tonic-gate return; 11827c478bd9Sstevel@tonic-gate } 11837c478bd9Sstevel@tonic-gate 11847c478bd9Sstevel@tonic-gate (void) strncpy(v_toc.v_volume, label, LEN_DKL_VVOL); 11857c478bd9Sstevel@tonic-gate 11867c478bd9Sstevel@tonic-gate 1187e3397557Szk194757 /* Turn on the privileges. */ 1188e3397557Szk194757 (void) __priv_bracket(PRIV_ON); 11897c478bd9Sstevel@tonic-gate 1190342440ecSPrasad Singamsetty ret = write_extvtoc(fd, &v_toc); 11917c478bd9Sstevel@tonic-gate 1192e3397557Szk194757 /* Turn off the privileges. */ 1193e3397557Szk194757 (void) __priv_bracket(PRIV_OFF); 11947c478bd9Sstevel@tonic-gate 11957c478bd9Sstevel@tonic-gate if (ret < 0) { 11967c478bd9Sstevel@tonic-gate #ifdef sparc 11977c478bd9Sstevel@tonic-gate PERROR("write VTOC failed"); 11987c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 11997c478bd9Sstevel@tonic-gate #else /* i386 */ 12007c478bd9Sstevel@tonic-gate if (errno == EIO) { 12017c478bd9Sstevel@tonic-gate PERROR("No Solaris partition, eject & retry"); 12027c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 12037c478bd9Sstevel@tonic-gate } else { 12047c478bd9Sstevel@tonic-gate PERROR("write VTOC failed"); 12057c478bd9Sstevel@tonic-gate DPRINTF1("Errno = %d\n", errno); 12067c478bd9Sstevel@tonic-gate } 12077c478bd9Sstevel@tonic-gate #endif 12087c478bd9Sstevel@tonic-gate } 12097c478bd9Sstevel@tonic-gate } 1210