xref: /illumos-gate/usr/src/cmd/rmformat/rmf_menu.c (revision 0ab8feb4)
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
5e3397557Szk  * Common Development and Distribution License (the "License").
6e3397557Szk  * 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 /*
22afb89a98SPavel 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>
33bbed02dfSzk #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,
81342440ecSPrasad Singamsetty 	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
process_options()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 ||
140afb89a98SPavel Potoplyak 	    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,
158afb89a98SPavel Potoplyak 		    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,
175afb89a98SPavel Potoplyak 			    U_flag);
1767c478bd9Sstevel@tonic-gate 			if (m_scsi_umount != 1) {
1777c478bd9Sstevel@tonic-gate 				m_flp_umount = check_and_unmount_floppy(fd,
178afb89a98SPavel Potoplyak 				    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,
189afb89a98SPavel Potoplyak 			    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,
199afb89a98SPavel Potoplyak 			    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,
209afb89a98SPavel Potoplyak 		    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,
216afb89a98SPavel Potoplyak 		    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",
226afb89a98SPavel Potoplyak 	    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
process_F_flag(smedia_handle_t handle,int32_t fd)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,
317afb89a98SPavel Potoplyak 		    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) &&
336afb89a98SPavel Potoplyak 	    (med_info.sm_media_type != SM_PCMCIA_MEM) &&
337afb89a98SPavel Potoplyak 	    (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) ||
389afb89a98SPavel Potoplyak 	    (med_info.sm_media_type == SM_PCMCIA_MEM) ||
390afb89a98SPavel Potoplyak 	    (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
process_l_flag()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
process_w_flag(smedia_handle_t handle)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,
494afb89a98SPavel Potoplyak 		    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 =
506afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_NOPASSWD;
5077c478bd9Sstevel@tonic-gate 				wps.sm_passwd_len = 0;
5087c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
509afb89a98SPavel Potoplyak 				    &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 :
523afb89a98SPavel Potoplyak 				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 =
531afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_DISABLE;
5327c478bd9Sstevel@tonic-gate 				wps.sm_passwd_len = 0;
5337c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
534afb89a98SPavel Potoplyak 				    &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 :
548afb89a98SPavel Potoplyak 				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
process_W_flag(smedia_handle_t handle)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,
566afb89a98SPavel Potoplyak 		    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  :
576afb89a98SPavel Potoplyak 			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 =
580afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_PASSWD;
5817c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
582afb89a98SPavel Potoplyak 				    &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 =
592afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_PASSWD;
5937c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
594afb89a98SPavel Potoplyak 				    &wps);
5957c478bd9Sstevel@tonic-gate 				if (rval == -1) {
5967c478bd9Sstevel@tonic-gate 					if (errno == EACCES) {
5977c478bd9Sstevel@tonic-gate 						(void) fprintf(stderr,
598afb89a98SPavel Potoplyak 						    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 :
608afb89a98SPavel Potoplyak 				default :
6097c478bd9Sstevel@tonic-gate 				(void) fprintf(stderr,
610afb89a98SPavel Potoplyak 				    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 =
618afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_DISABLE;
6197c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
620afb89a98SPavel Potoplyak 				    &wps);
6217c478bd9Sstevel@tonic-gate 				if (rval == -1) {
6227c478bd9Sstevel@tonic-gate 					if (errno == EACCES) {
6237c478bd9Sstevel@tonic-gate 						(void) fprintf(stderr,
624afb89a98SPavel Potoplyak 						    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 :
640afb89a98SPavel Potoplyak 				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
process_R_flag(smedia_handle_t handle)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,
658afb89a98SPavel Potoplyak 		    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  :
668afb89a98SPavel Potoplyak 			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 =
672afb89a98SPavel Potoplyak 				    SM_READ_WRITE_PROTECT;
6737c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
674afb89a98SPavel Potoplyak 				    &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 =
683afb89a98SPavel Potoplyak 				    SM_READ_WRITE_PROTECT;
6847c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
685afb89a98SPavel Potoplyak 				    &wps);
6867c478bd9Sstevel@tonic-gate 				if (rval == -1) {
6877c478bd9Sstevel@tonic-gate 					if (errno == EACCES) {
6887c478bd9Sstevel@tonic-gate 						(void) fprintf(stderr,
689afb89a98SPavel Potoplyak 						    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 :
699afb89a98SPavel Potoplyak 				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 :
706afb89a98SPavel Potoplyak 			case SM_STATUS_UNKNOWN :
7077c478bd9Sstevel@tonic-gate 				get_passwd(&wps, 0);
7087c478bd9Sstevel@tonic-gate 				wps.sm_new_state =
709afb89a98SPavel Potoplyak 				    SM_WRITE_PROTECT_DISABLE;
7107c478bd9Sstevel@tonic-gate 				rval = smedia_set_protection_status(handle,
711afb89a98SPavel Potoplyak 				    &wps);
7127c478bd9Sstevel@tonic-gate 				if (rval == -1) {
7137c478bd9Sstevel@tonic-gate 					if (errno == EACCES) {
7147c478bd9Sstevel@tonic-gate 						(void) fprintf(stderr,
715afb89a98SPavel Potoplyak 						    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
process_p_flag(smedia_handle_t handle,int32_t fd)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 {
768afb89a98SPavel 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)  {
776afb89a98SPavel Potoplyak 				(void) fprintf(stdout,
7777c478bd9Sstevel@tonic-gate 				gettext("Medium is write protected.\n"));
7787c478bd9Sstevel@tonic-gate 			}
7797c478bd9Sstevel@tonic-gate 		} else { /* Open succeeded */
780afb89a98SPavel Potoplyak 			(void) fprintf(stdout,
781afb89a98SPavel Potoplyak 			    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 :
789afb89a98SPavel 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 :
793afb89a98SPavel 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 :
797afb89a98SPavel 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  :
801afb89a98SPavel 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:
806afb89a98SPavel Potoplyak 			(void) fprintf(stdout,
807afb89a98SPavel Potoplyak 			    gettext("Unknown write protect status.\n"));
8087c478bd9Sstevel@tonic-gate 			break;
8097c478bd9Sstevel@tonic-gate 	}
8107c478bd9Sstevel@tonic-gate }
8117c478bd9Sstevel@tonic-gate 
8127c478bd9Sstevel@tonic-gate static void
process_c_flag(smedia_handle_t handle)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
process_V_flag(smedia_handle_t handle,int32_t fd)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,
889342440ecSPrasad Singamsetty 			    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,
893342440ecSPrasad Singamsetty 				    read_buf,
894342440ecSPrasad Singamsetty 				    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;
903342440ecSPrasad Singamsetty 					DPRINTF2(
904342440ecSPrasad Singamsetty 					    "Reading %d blks starting "
905342440ecSPrasad Singamsetty 					    "at %llu\n", 1, bn + j);
906342440ecSPrasad Singamsetty 					ret = verify(handle, fd, bn + j, 1,
907342440ecSPrasad Singamsetty 					    read_buf,
908342440ecSPrasad Singamsetty 					    VERIFY_READ, blocksize,
909342440ecSPrasad Singamsetty 					    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,
937342440ecSPrasad Singamsetty 			    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,
947342440ecSPrasad Singamsetty 					    write_buf,
948342440ecSPrasad Singamsetty 					    VERIFY_WRITE, blocksize,
949342440ecSPrasad Singamsetty 					    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,
959342440ecSPrasad Singamsetty 			    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,
969342440ecSPrasad Singamsetty 					    read_buf, VERIFY_READ,
970342440ecSPrasad Singamsetty 					    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
process_s_flag(smedia_handle_t handle,int32_t fd)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 
1004e3397557Szk 	/* Turn on privileges. */
1005e3397557Szk 	(void) __priv_bracket(PRIV_ON);
10067c478bd9Sstevel@tonic-gate 
1007342440ecSPrasad Singamsetty 	(void) read_extvtoc(fd, &t_vtoc);
10087c478bd9Sstevel@tonic-gate 
1009e3397557Szk 	/* Turn off privileges. */
1010e3397557Szk 	(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 
1022e3397557Szk 	/* Turn on privileges. */
1023e3397557Szk 	(void) __priv_bracket(PRIV_ON);
10247c478bd9Sstevel@tonic-gate 
1025342440ecSPrasad Singamsetty 	ret = write_extvtoc(fd, &t_vtoc);
10267c478bd9Sstevel@tonic-gate 
1027e3397557Szk 	/* Turn off privileges. */
1028e3397557Szk 	(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
process_e_flag(smedia_handle_t handle)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
process_H_flag(smedia_handle_t handle,int32_t fd)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,
1060afb89a98SPavel Potoplyak 	    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)
1067afb89a98SPavel Potoplyak 			    < 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
process_D_flag(smedia_handle_t handle,int32_t fd)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,
1091afb89a98SPavel Potoplyak 	    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)
1097afb89a98SPavel Potoplyak 			    < 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
process_b_flag(int32_t fd)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;
1139afb89a98SPavel Potoplyak 		    nparts++) {
1140afb89a98SPavel Potoplyak 			if (vtoc64->efi_parts[nparts].p_tag ==
1141afb89a98SPavel Potoplyak 			    V_RESERVED) {
11427c478bd9Sstevel@tonic-gate 				(void) strncpy(
11437c478bd9Sstevel@tonic-gate 				    vtoc64->efi_parts[nparts].p_name, label,
11447c478bd9Sstevel@tonic-gate 				    EFI_PART_NAME_LEN);
1145*0ab8feb4SToomas Soome 				break;
11467c478bd9Sstevel@tonic-gate 			}
11477c478bd9Sstevel@tonic-gate 		}
11487c478bd9Sstevel@tonic-gate 		if (efi_write(fd, vtoc64) != 0) {
11497c478bd9Sstevel@tonic-gate 			(void) efi_err_check(vtoc64);
11507c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr,
1151afb89a98SPavel Potoplyak 			    gettext("Could not write label.\n"));
11527c478bd9Sstevel@tonic-gate 		}
11537c478bd9Sstevel@tonic-gate 		return;
11547c478bd9Sstevel@tonic-gate 	}
11557c478bd9Sstevel@tonic-gate 
11567c478bd9Sstevel@tonic-gate 	/* Get existing Vtoc */
11577c478bd9Sstevel@tonic-gate 
1158e3397557Szk 	/* Turn on privileges. */
1159e3397557Szk 	(void) __priv_bracket(PRIV_ON);
11607c478bd9Sstevel@tonic-gate 
1161342440ecSPrasad Singamsetty 	ret = read_extvtoc(fd, &v_toc);
11627c478bd9Sstevel@tonic-gate 
1163e3397557Szk 	/* Turn off privileges */
1164e3397557Szk 	(void) __priv_bracket(PRIV_OFF);
11657c478bd9Sstevel@tonic-gate 
11667c478bd9Sstevel@tonic-gate 	if (ret < 0) {
11677c478bd9Sstevel@tonic-gate #ifdef sparc
11687c478bd9Sstevel@tonic-gate 		PERROR("read VTOC failed");
11697c478bd9Sstevel@tonic-gate 		DPRINTF1("Errno = %d\n", errno);
11707c478bd9Sstevel@tonic-gate #else /* i386 */
11717c478bd9Sstevel@tonic-gate 		if (errno == EIO) {
11727c478bd9Sstevel@tonic-gate 			PERROR("No Solaris partition, eject & retry");
11737c478bd9Sstevel@tonic-gate 			DPRINTF1("Errno = %d\n", errno);
11747c478bd9Sstevel@tonic-gate 		} else {
11757c478bd9Sstevel@tonic-gate 			PERROR("read VTOC failed");
11767c478bd9Sstevel@tonic-gate 			DPRINTF1("Errno = %d\n", errno);
11777c478bd9Sstevel@tonic-gate 		}
11787c478bd9Sstevel@tonic-gate #endif
11797c478bd9Sstevel@tonic-gate 		return;
11807c478bd9Sstevel@tonic-gate 	}
11817c478bd9Sstevel@tonic-gate 
11827c478bd9Sstevel@tonic-gate 	(void) strncpy(v_toc.v_volume, label, LEN_DKL_VVOL);
11837c478bd9Sstevel@tonic-gate 
11847c478bd9Sstevel@tonic-gate 
1185e3397557Szk 	/* Turn on the privileges. */
1186e3397557Szk 	(void) __priv_bracket(PRIV_ON);
11877c478bd9Sstevel@tonic-gate 
1188342440ecSPrasad Singamsetty 	ret = write_extvtoc(fd, &v_toc);
11897c478bd9Sstevel@tonic-gate 
1190e3397557Szk 	/* Turn off the privileges. */
1191e3397557Szk 	(void) __priv_bracket(PRIV_OFF);
11927c478bd9Sstevel@tonic-gate 
11937c478bd9Sstevel@tonic-gate 	if (ret < 0) {
11947c478bd9Sstevel@tonic-gate #ifdef sparc
11957c478bd9Sstevel@tonic-gate 		PERROR("write VTOC failed");
11967c478bd9Sstevel@tonic-gate 		DPRINTF1("Errno = %d\n", errno);
11977c478bd9Sstevel@tonic-gate #else /* i386 */
11987c478bd9Sstevel@tonic-gate 		if (errno == EIO) {
11997c478bd9Sstevel@tonic-gate 			PERROR("No Solaris partition, eject & retry");
12007c478bd9Sstevel@tonic-gate 			DPRINTF1("Errno = %d\n", errno);
12017c478bd9Sstevel@tonic-gate 		} else {
12027c478bd9Sstevel@tonic-gate 			PERROR("write VTOC failed");
12037c478bd9Sstevel@tonic-gate 			DPRINTF1("Errno = %d\n", errno);
12047c478bd9Sstevel@tonic-gate 		}
12057c478bd9Sstevel@tonic-gate #endif
12067c478bd9Sstevel@tonic-gate 	}
12077c478bd9Sstevel@tonic-gate }
1208