xref: /titanic_52/usr/src/lib/libadm/common/getvol.c (revision 4656d4747c8743290bfbe910c64cd75eb4e4af8d)
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
57c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
67c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
77c478bd9Sstevel@tonic-gate  * with the License.
87c478bd9Sstevel@tonic-gate  *
97c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
117c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
127c478bd9Sstevel@tonic-gate  * and limitations under the License.
137c478bd9Sstevel@tonic-gate  *
147c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
157c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
177c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
187c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bd9Sstevel@tonic-gate  *
207c478bd9Sstevel@tonic-gate  * CDDL HEADER END
217c478bd9Sstevel@tonic-gate  */
227c478bd9Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
237c478bd9Sstevel@tonic-gate /*	  All Rights Reserved  	*/
247c478bd9Sstevel@tonic-gate 
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate /*
277c478bd9Sstevel@tonic-gate  * Copyright (c) 1997, by Sun Microsystems, Inc.
287c478bd9Sstevel@tonic-gate  * All rights reserved.
297c478bd9Sstevel@tonic-gate  */
307c478bd9Sstevel@tonic-gate 
317c478bd9Sstevel@tonic-gate /*LINTLIBRARY*/
327c478bd9Sstevel@tonic-gate 
337c478bd9Sstevel@tonic-gate #include <stdio.h>
347c478bd9Sstevel@tonic-gate #include <string.h>
357c478bd9Sstevel@tonic-gate #include <sys/types.h>
367c478bd9Sstevel@tonic-gate #include <devmgmt.h>
377c478bd9Sstevel@tonic-gate #include "libadm.h"
387c478bd9Sstevel@tonic-gate #include <stdlib.h>
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate #define	LABELSIZ	6
417c478bd9Sstevel@tonic-gate #define	BELL	"\007"
427c478bd9Sstevel@tonic-gate 
437c478bd9Sstevel@tonic-gate #define	FORMFS_MSG ",\\n\\ \\ or [f] to format %s and place a filesystem on it"
447c478bd9Sstevel@tonic-gate #define	FORMAT_MSG ",\\n\\ \\ or [f] to format the %s"
457c478bd9Sstevel@tonic-gate #define	MAKEFS_MSG ",\\n\\ \\ or [m] to place a filesystem on %s"
467c478bd9Sstevel@tonic-gate #define	EJECT_MSG  ",\\n\\ \\ or [e] to eject the %s"
477c478bd9Sstevel@tonic-gate #define	UNLOAD_MSG ",\\n\\ \\ or [u] to unload/offline the %s"
487c478bd9Sstevel@tonic-gate #define	WLABEL_MSG ",\\n\\ \\ or [w] to write a new label on the %s"
497c478bd9Sstevel@tonic-gate #define	OLABEL_MSG ",\\n\\ \\ or [o] to use the current label anyway"
507c478bd9Sstevel@tonic-gate #define	QUIT_MSG   ",\\n\\ \\ or [q] to quit"
517c478bd9Sstevel@tonic-gate 
527c478bd9Sstevel@tonic-gate #define	ERR_ACCESS	"\n%s (%s) cannot be accessed.\n"
537c478bd9Sstevel@tonic-gate #define	ERR_FMT		"\nAttempt to format %s failed.\n"
547c478bd9Sstevel@tonic-gate #define	ERR_MKFS	"\nAttempt to place filesystem on %s failed.\n"
557c478bd9Sstevel@tonic-gate #define	ERR_REMOVE	"\nExecution of \"removecmd\"[%s] failed.\n"
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate static void	elabel(void);
587c478bd9Sstevel@tonic-gate static void	doformat(char *, char *, char *);
597c478bd9Sstevel@tonic-gate static void	labelerr(char *, char *);
607c478bd9Sstevel@tonic-gate static int	ckilabel(char *, int);
617c478bd9Sstevel@tonic-gate static int	insert(char *, char *, int, char *);
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate static char	*cdevice; 	/* character device name */
647c478bd9Sstevel@tonic-gate static char	*pname; 	/* device presentation name */
657c478bd9Sstevel@tonic-gate static char	*volume; 	/* volume name */
667c478bd9Sstevel@tonic-gate static char	origfsname[LABELSIZ+1];
677c478bd9Sstevel@tonic-gate static char	origvolname[LABELSIZ+1];
687c478bd9Sstevel@tonic-gate 
697c478bd9Sstevel@tonic-gate /*
707c478bd9Sstevel@tonic-gate  * Return:
717c478bd9Sstevel@tonic-gate  *	0 - okay, label matches
727c478bd9Sstevel@tonic-gate  *	1 - device not accessable
737c478bd9Sstevel@tonic-gate  *	2 - unknown device (devattr failed)
747c478bd9Sstevel@tonic-gate  *	3 - user selected quit
757c478bd9Sstevel@tonic-gate  *	4 - label does not match
767c478bd9Sstevel@tonic-gate  */
777c478bd9Sstevel@tonic-gate 
787c478bd9Sstevel@tonic-gate /*
797c478bd9Sstevel@tonic-gate  * macros from labelit to behave correctly for tape
807c478bd9Sstevel@tonic-gate  * is a kludge, should use devmgmt
817c478bd9Sstevel@tonic-gate  */
827c478bd9Sstevel@tonic-gate #ifdef RT
837c478bd9Sstevel@tonic-gate #define	IFTAPE(s) ((strncmp(s, "/dev/mt", 7) == 0) || \
847c478bd9Sstevel@tonic-gate (strncmp(s, "mt", 2) == 0))
857c478bd9Sstevel@tonic-gate #define	TAPENAMES "'/dev/mt'"
867c478bd9Sstevel@tonic-gate #else
877c478bd9Sstevel@tonic-gate #define	IFTAPE(s) ((strncmp(s, "/dev/rmt", 8) == 0) || \
887c478bd9Sstevel@tonic-gate (strncmp(s, "rmt", 3) == 0) || (strncmp(s, "/dev/rtp", 8) == 0) || \
897c478bd9Sstevel@tonic-gate (strncmp(s, "rtp", 3) == 0))
907c478bd9Sstevel@tonic-gate #define	TAPENAMES "'/dev/rmt' or '/dev/rtp'"
917c478bd9Sstevel@tonic-gate #endif
927c478bd9Sstevel@tonic-gate 
937c478bd9Sstevel@tonic-gate int
947c478bd9Sstevel@tonic-gate getvol(char *device, char *label, int options, char *prompt)
957c478bd9Sstevel@tonic-gate {
967c478bd9Sstevel@tonic-gate 	return (_getvol(device, label, options, prompt, NULL));
977c478bd9Sstevel@tonic-gate }
987c478bd9Sstevel@tonic-gate 
997c478bd9Sstevel@tonic-gate int
1007c478bd9Sstevel@tonic-gate _getvol(char *device, char *label, int options, char *prompt, char *norewind)
1017c478bd9Sstevel@tonic-gate {
1027c478bd9Sstevel@tonic-gate 	FILE	*tmp;
1037c478bd9Sstevel@tonic-gate 	char	*advice, *pt;
1047c478bd9Sstevel@tonic-gate 	int	n, override;
1057c478bd9Sstevel@tonic-gate 
1067c478bd9Sstevel@tonic-gate 	cdevice = devattr(device, "cdevice");
1077c478bd9Sstevel@tonic-gate 	if ((cdevice == NULL) || !cdevice[0]) {
1087c478bd9Sstevel@tonic-gate 		cdevice = devattr(device, "pathname");
1097c478bd9Sstevel@tonic-gate 		if ((cdevice == NULL) || !cdevice)
1107c478bd9Sstevel@tonic-gate 			return (2);	/* bad device */
1117c478bd9Sstevel@tonic-gate 	}
1127c478bd9Sstevel@tonic-gate 
1137c478bd9Sstevel@tonic-gate 	pname = devattr(device, "desc");
1147c478bd9Sstevel@tonic-gate 	if (pname == NULL) {
1157c478bd9Sstevel@tonic-gate 		pname = devattr(device, "alias");
1167c478bd9Sstevel@tonic-gate 		if (!pname)
1177c478bd9Sstevel@tonic-gate 			pname = device;
1187c478bd9Sstevel@tonic-gate 	}
1197c478bd9Sstevel@tonic-gate 
1207c478bd9Sstevel@tonic-gate 	volume = devattr(device, "volume");
1217c478bd9Sstevel@tonic-gate 
1227c478bd9Sstevel@tonic-gate 	if (label) {
1237c478bd9Sstevel@tonic-gate 		(void) strncpy(origfsname, label, LABELSIZ);
1247c478bd9Sstevel@tonic-gate 		origfsname[LABELSIZ] = '\0';
1257c478bd9Sstevel@tonic-gate 		if (pt = strchr(origfsname, ',')) {
1267c478bd9Sstevel@tonic-gate 			*pt = '\0';
1277c478bd9Sstevel@tonic-gate 		}
1287c478bd9Sstevel@tonic-gate 		if (pt = strchr(label, ',')) {
1297c478bd9Sstevel@tonic-gate 			(void) strncpy(origvolname, pt+1, LABELSIZ);
1307c478bd9Sstevel@tonic-gate 			origvolname[LABELSIZ] = '\0';
1317c478bd9Sstevel@tonic-gate 		} else
1327c478bd9Sstevel@tonic-gate 			origvolname[0] = '\0';
1337c478bd9Sstevel@tonic-gate 	}
1347c478bd9Sstevel@tonic-gate 
1357c478bd9Sstevel@tonic-gate 	override = 0;
1367c478bd9Sstevel@tonic-gate 	for (;;) {
1377c478bd9Sstevel@tonic-gate 		if (!(options & DM_BATCH) && volume) {
1387c478bd9Sstevel@tonic-gate 			n = insert(device, label, options, prompt);
1397c478bd9Sstevel@tonic-gate 			if (n < 0)
1407c478bd9Sstevel@tonic-gate 				override++;
1417c478bd9Sstevel@tonic-gate 			else if (n)
1427c478bd9Sstevel@tonic-gate 				return (n);	/* input function failed */
1437c478bd9Sstevel@tonic-gate 		}
1447c478bd9Sstevel@tonic-gate 
1457c478bd9Sstevel@tonic-gate 		if ((tmp = fopen(norewind ? norewind : cdevice, "r")) == NULL) {
1467c478bd9Sstevel@tonic-gate 			/* device was not accessible */
1477c478bd9Sstevel@tonic-gate 			if (options & DM_BATCH)
1487c478bd9Sstevel@tonic-gate 				return (1);
1497c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, ERR_ACCESS, pname, cdevice);
1507c478bd9Sstevel@tonic-gate 			if ((options & DM_BATCH) || (volume == NULL))
1517c478bd9Sstevel@tonic-gate 				return (1);
1527c478bd9Sstevel@tonic-gate 			/* display advice on how to ready device */
1537c478bd9Sstevel@tonic-gate 			if (advice = devattr(device, "advice"))
1547c478bd9Sstevel@tonic-gate 				(void) puttext(stderr, advice, 0, 0);
1557c478bd9Sstevel@tonic-gate 			continue;
1567c478bd9Sstevel@tonic-gate 		}
1577c478bd9Sstevel@tonic-gate 		(void) fclose(tmp);
1587c478bd9Sstevel@tonic-gate 
1597c478bd9Sstevel@tonic-gate 		/* check label on device */
1607c478bd9Sstevel@tonic-gate 		if (label) {
1617c478bd9Sstevel@tonic-gate 			if (options & DM_ELABEL)
1627c478bd9Sstevel@tonic-gate 				elabel();
1637c478bd9Sstevel@tonic-gate 			else {
1647c478bd9Sstevel@tonic-gate 				/* check internal label using /etc/labelit */
1657c478bd9Sstevel@tonic-gate 				if (ckilabel(label, override)) {
1667c478bd9Sstevel@tonic-gate 					if ((options & DM_BATCH) ||
1677c478bd9Sstevel@tonic-gate 					    volume == NULL)
1687c478bd9Sstevel@tonic-gate 						return (4);
1697c478bd9Sstevel@tonic-gate 					continue;
1707c478bd9Sstevel@tonic-gate 				}
1717c478bd9Sstevel@tonic-gate 			}
1727c478bd9Sstevel@tonic-gate 		}
1737c478bd9Sstevel@tonic-gate 		break;
1747c478bd9Sstevel@tonic-gate 	}
1757c478bd9Sstevel@tonic-gate 	return (0);
1767c478bd9Sstevel@tonic-gate }
1777c478bd9Sstevel@tonic-gate 
1787c478bd9Sstevel@tonic-gate static int
1797c478bd9Sstevel@tonic-gate ckilabel(char *label, int flag)
1807c478bd9Sstevel@tonic-gate {
1817c478bd9Sstevel@tonic-gate 	FILE	*pp;
1827c478bd9Sstevel@tonic-gate 	char	*pt, *look, buffer[512];
1837c478bd9Sstevel@tonic-gate 	char	fsname[LABELSIZ+1], volname[LABELSIZ+1];
1847c478bd9Sstevel@tonic-gate 	char	*pvolname, *pfsname;
1857c478bd9Sstevel@tonic-gate 	int	n, c;
1867c478bd9Sstevel@tonic-gate 
1877c478bd9Sstevel@tonic-gate 	(void) strncpy(fsname, label, LABELSIZ);
1887c478bd9Sstevel@tonic-gate 	fsname[LABELSIZ] = '\0';
1897c478bd9Sstevel@tonic-gate 	if (pt = strchr(fsname, ',')) {
1907c478bd9Sstevel@tonic-gate 		*pt = '\0';
1917c478bd9Sstevel@tonic-gate 	}
1927c478bd9Sstevel@tonic-gate 	if (pt = strchr(label, ',')) {
1937c478bd9Sstevel@tonic-gate 		(void) strncpy(volname, pt+1, LABELSIZ);
1947c478bd9Sstevel@tonic-gate 		volname[LABELSIZ] = '\0';
1957c478bd9Sstevel@tonic-gate 	} else
1967c478bd9Sstevel@tonic-gate 		volname[0] = '\0';
1977c478bd9Sstevel@tonic-gate 
198*4656d474SGarrett D'Amore 	(void) snprintf(buffer, sizeof (buffer), "/etc/labelit %s", cdevice);
1997c478bd9Sstevel@tonic-gate 	pp = popen(buffer, "r");
2007c478bd9Sstevel@tonic-gate 	pt = buffer;
2017c478bd9Sstevel@tonic-gate 	while ((c = getc(pp)) != EOF)
2027c478bd9Sstevel@tonic-gate 		*pt++ = (char)c;
2037c478bd9Sstevel@tonic-gate 	*pt = '\0';
2047c478bd9Sstevel@tonic-gate 	(void) pclose(pp);
2057c478bd9Sstevel@tonic-gate 
2067c478bd9Sstevel@tonic-gate 	pt = buffer;
2077c478bd9Sstevel@tonic-gate 	pfsname = pvolname = NULL;
2087c478bd9Sstevel@tonic-gate 	look = "Current fsname: ";
2097c478bd9Sstevel@tonic-gate 	n = (int)strlen(look);
2107c478bd9Sstevel@tonic-gate 	while (*pt) {
2117c478bd9Sstevel@tonic-gate 		if (strncmp(pt, look, n) == 0) {
2127c478bd9Sstevel@tonic-gate 			*pt = '\0';
2137c478bd9Sstevel@tonic-gate 			pt += strlen(look);
2147c478bd9Sstevel@tonic-gate 			if (pfsname == NULL) {
2157c478bd9Sstevel@tonic-gate 				pfsname = pt;
2167c478bd9Sstevel@tonic-gate 				look = ", Current volname: ";
2177c478bd9Sstevel@tonic-gate 				n = (int)strlen(look);
2187c478bd9Sstevel@tonic-gate 			} else if (pvolname == NULL) {
2197c478bd9Sstevel@tonic-gate 				pvolname = pt;
2207c478bd9Sstevel@tonic-gate 				look = ", Blocks: ";
2217c478bd9Sstevel@tonic-gate 				n = (int)strlen(look);
2227c478bd9Sstevel@tonic-gate 			} else
2237c478bd9Sstevel@tonic-gate 				break;
2247c478bd9Sstevel@tonic-gate 		} else
2257c478bd9Sstevel@tonic-gate 			pt++;
2267c478bd9Sstevel@tonic-gate 	}
2277c478bd9Sstevel@tonic-gate 
2287c478bd9Sstevel@tonic-gate 	if (strcmp(fsname, pfsname) || strcmp(volname, pvolname)) {
2297c478bd9Sstevel@tonic-gate 		/* mismatched label */
2307c478bd9Sstevel@tonic-gate 		if (flag) {
231*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
2327c478bd9Sstevel@tonic-gate 			(void) sprintf(label, "%s,%s", pfsname, pvolname);
2337c478bd9Sstevel@tonic-gate 		} else {
2347c478bd9Sstevel@tonic-gate 			labelerr(pfsname, pvolname);
2357c478bd9Sstevel@tonic-gate 			return (1);
2367c478bd9Sstevel@tonic-gate 		}
2377c478bd9Sstevel@tonic-gate 	}
2387c478bd9Sstevel@tonic-gate 	return (0);
2397c478bd9Sstevel@tonic-gate }
2407c478bd9Sstevel@tonic-gate 
2417c478bd9Sstevel@tonic-gate static int
2427c478bd9Sstevel@tonic-gate wilabel(char *label)
2437c478bd9Sstevel@tonic-gate {
2447c478bd9Sstevel@tonic-gate 	char	buffer[512];
2457c478bd9Sstevel@tonic-gate 	char	fsname[LABELSIZ+1];
2467c478bd9Sstevel@tonic-gate 	char	volname[LABELSIZ+1];
2477c478bd9Sstevel@tonic-gate 	int	n;
2487c478bd9Sstevel@tonic-gate 
2497c478bd9Sstevel@tonic-gate 	if (!label || !strlen(origfsname)) {
2507c478bd9Sstevel@tonic-gate 		if (n = ckstr(fsname, NULL, LABELSIZ, NULL, NULL, NULL,
2517c478bd9Sstevel@tonic-gate 				"Enter text for fsname label:"))
2527c478bd9Sstevel@tonic-gate 			return (n);
2537c478bd9Sstevel@tonic-gate 	} else
2547c478bd9Sstevel@tonic-gate 		(void) strcpy(fsname, origfsname);
2557c478bd9Sstevel@tonic-gate 	if (!label || !strlen(origvolname)) {
2567c478bd9Sstevel@tonic-gate 		if (n = ckstr(volname, NULL, LABELSIZ, NULL, NULL, NULL,
2577c478bd9Sstevel@tonic-gate 				"Enter text for volume label:"))
2587c478bd9Sstevel@tonic-gate 			return (n);
2597c478bd9Sstevel@tonic-gate 	} else
2607c478bd9Sstevel@tonic-gate 		(void) strcpy(volname, origvolname);
2617c478bd9Sstevel@tonic-gate 
2627c478bd9Sstevel@tonic-gate 	if (IFTAPE(cdevice)) {
263*4656d474SGarrett D'Amore 		(void) snprintf(buffer, sizeof (buffer),
264*4656d474SGarrett D'Amore 		    "/etc/labelit %s \"%s\" \"%s\" -n 1>&2",
2657c478bd9Sstevel@tonic-gate 			cdevice, fsname, volname);
2667c478bd9Sstevel@tonic-gate 	} else {
267*4656d474SGarrett D'Amore 		(void) snprintf(buffer, sizeof (buffer),
268*4656d474SGarrett D'Amore 		    "/etc/labelit %s \"%s\" \"%s\" 1>&2",
2697c478bd9Sstevel@tonic-gate 		    cdevice, fsname, volname);
2707c478bd9Sstevel@tonic-gate 	}
2717c478bd9Sstevel@tonic-gate 	if (system(buffer)) {
2727c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, "\nWrite of label to %s failed.", pname);
2737c478bd9Sstevel@tonic-gate 		return (1);
2747c478bd9Sstevel@tonic-gate 	}
2757c478bd9Sstevel@tonic-gate 	if (label)
276*4656d474SGarrett D'Amore 		/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
2777c478bd9Sstevel@tonic-gate 		(void) sprintf(label, "%s,%s", fsname, volname);
2787c478bd9Sstevel@tonic-gate 	return (0);
2797c478bd9Sstevel@tonic-gate }
2807c478bd9Sstevel@tonic-gate 
2817c478bd9Sstevel@tonic-gate static void
2827c478bd9Sstevel@tonic-gate elabel(void)
2837c478bd9Sstevel@tonic-gate {
2847c478bd9Sstevel@tonic-gate }
2857c478bd9Sstevel@tonic-gate 
2867c478bd9Sstevel@tonic-gate static int
2877c478bd9Sstevel@tonic-gate insert(char *device, char *label, int options, char *prompt)
2887c478bd9Sstevel@tonic-gate {
2897c478bd9Sstevel@tonic-gate 	int	n;
2907c478bd9Sstevel@tonic-gate 	char	strval[16], prmpt[BUFSIZ];
2917c478bd9Sstevel@tonic-gate 	char	*pt, *keyword[10];
2927c478bd9Sstevel@tonic-gate 	char 	*fmtcmd;
2937c478bd9Sstevel@tonic-gate 	char	*mkfscmd;
2947c478bd9Sstevel@tonic-gate 	char	*voltxt;
2957c478bd9Sstevel@tonic-gate 	char	*removecmd;
2967c478bd9Sstevel@tonic-gate 	char	*dev_type;
2977c478bd9Sstevel@tonic-gate 
2987c478bd9Sstevel@tonic-gate 	voltxt = (volume ? volume : "volume");
2997c478bd9Sstevel@tonic-gate 
3007c478bd9Sstevel@tonic-gate 	fmtcmd    = devattr(device, "fmtcmd");
3017c478bd9Sstevel@tonic-gate 	mkfscmd   = devattr(device, "mkfscmd");
3027c478bd9Sstevel@tonic-gate 	removecmd = devattr(device, "removecmd");
3037c478bd9Sstevel@tonic-gate 	dev_type  = devattr(device, "type");
3047c478bd9Sstevel@tonic-gate 
3057c478bd9Sstevel@tonic-gate 	if (prompt) {
306*4656d474SGarrett D'Amore 		(void) strlcpy(prmpt, prompt, sizeof (prmpt));
3077c478bd9Sstevel@tonic-gate 		for (pt = prmpt; *prompt; ) {
3087c478bd9Sstevel@tonic-gate 			if ((*prompt == '\\') && (prompt[1] == '%'))
3097c478bd9Sstevel@tonic-gate 				prompt++;
3107c478bd9Sstevel@tonic-gate 			else if (*prompt == '%') {
3117c478bd9Sstevel@tonic-gate 				switch (prompt[1]) {
3127c478bd9Sstevel@tonic-gate 				    case 'v':
3137c478bd9Sstevel@tonic-gate 					(void) strcpy(pt, voltxt);
3147c478bd9Sstevel@tonic-gate 					break;
3157c478bd9Sstevel@tonic-gate 
3167c478bd9Sstevel@tonic-gate 				    case 'p':
3177c478bd9Sstevel@tonic-gate 					(void) strcpy(pt, pname);
3187c478bd9Sstevel@tonic-gate 					break;
3197c478bd9Sstevel@tonic-gate 
3207c478bd9Sstevel@tonic-gate 				    default:
3217c478bd9Sstevel@tonic-gate 					*pt = '\0';
3227c478bd9Sstevel@tonic-gate 					break;
3237c478bd9Sstevel@tonic-gate 				}
3247c478bd9Sstevel@tonic-gate 				pt = pt + strlen(pt);
3257c478bd9Sstevel@tonic-gate 				prompt += 2;
3267c478bd9Sstevel@tonic-gate 				continue;
3277c478bd9Sstevel@tonic-gate 			}
3287c478bd9Sstevel@tonic-gate 			*pt++ = *prompt++;
3297c478bd9Sstevel@tonic-gate 		}
3307c478bd9Sstevel@tonic-gate 		*pt = '\0';
3317c478bd9Sstevel@tonic-gate 	} else {
332*4656d474SGarrett D'Amore 		/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3337c478bd9Sstevel@tonic-gate 		(void) sprintf(prmpt, "Insert a %s into %s.", voltxt, pname);
3347c478bd9Sstevel@tonic-gate 		if (label && (options & DM_ELABEL)) {
3357c478bd9Sstevel@tonic-gate 			(void) strcat(prmpt, " The following external label ");
336*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3377c478bd9Sstevel@tonic-gate 			(void) sprintf(prmpt+strlen(prmpt),
3387c478bd9Sstevel@tonic-gate 				" should appear on the %s:\\n\\t%s",
3397c478bd9Sstevel@tonic-gate 				voltxt, label);
3407c478bd9Sstevel@tonic-gate 		}
3417c478bd9Sstevel@tonic-gate 		if (label && !(options & DM_ELABEL)) {
342*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3437c478bd9Sstevel@tonic-gate 			(void) sprintf(prmpt+strlen(prmpt),
3447c478bd9Sstevel@tonic-gate 			    "  The %s should be internally labeled as follows:",
3457c478bd9Sstevel@tonic-gate 			    voltxt);
346*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3477c478bd9Sstevel@tonic-gate 			(void) sprintf(prmpt+strlen(prmpt),
3487c478bd9Sstevel@tonic-gate 				"\\n\\t%s\\n", label);
3497c478bd9Sstevel@tonic-gate 		}
3507c478bd9Sstevel@tonic-gate 	}
3517c478bd9Sstevel@tonic-gate 
3527c478bd9Sstevel@tonic-gate 	pt = prompt = prmpt + strlen(prmpt);
3537c478bd9Sstevel@tonic-gate 
3547c478bd9Sstevel@tonic-gate 	n = 0;
3557c478bd9Sstevel@tonic-gate 	pt += sprintf(pt, "\\nType [go] when ready");
3567c478bd9Sstevel@tonic-gate 	keyword[n++] = "go";
3577c478bd9Sstevel@tonic-gate 
3587c478bd9Sstevel@tonic-gate 	if (options & DM_FORMFS) {
3597c478bd9Sstevel@tonic-gate 		if (fmtcmd && *fmtcmd && mkfscmd && *mkfscmd) {
360*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3617c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, FORMFS_MSG, voltxt);
3627c478bd9Sstevel@tonic-gate 			keyword[n++] = "f";
3637c478bd9Sstevel@tonic-gate 		} else if (fmtcmd && *fmtcmd) {
364*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3657c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, FORMAT_MSG, voltxt);
3667c478bd9Sstevel@tonic-gate 			keyword[n++] = "f";
3677c478bd9Sstevel@tonic-gate 		}
3687c478bd9Sstevel@tonic-gate 		if (mkfscmd && *mkfscmd) {
369*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3707c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, MAKEFS_MSG, voltxt);
3717c478bd9Sstevel@tonic-gate 			keyword[n++] = "m";
3727c478bd9Sstevel@tonic-gate 		}
3737c478bd9Sstevel@tonic-gate 	} else if (options & DM_FORMAT) {
3747c478bd9Sstevel@tonic-gate 		if (fmtcmd && *fmtcmd) {
375*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3767c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, FORMAT_MSG, voltxt);
3777c478bd9Sstevel@tonic-gate 			keyword[n++] = "f";
3787c478bd9Sstevel@tonic-gate 		}
3797c478bd9Sstevel@tonic-gate 	}
3807c478bd9Sstevel@tonic-gate 	if (options & DM_WLABEL) {
381*4656d474SGarrett D'Amore 		/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3827c478bd9Sstevel@tonic-gate 		pt += sprintf(pt, WLABEL_MSG, voltxt);
3837c478bd9Sstevel@tonic-gate 		keyword[n++] = "w";
3847c478bd9Sstevel@tonic-gate 	}
3857c478bd9Sstevel@tonic-gate 	if (options & DM_OLABEL) {
3867c478bd9Sstevel@tonic-gate 		pt += sprintf(pt, OLABEL_MSG);
3877c478bd9Sstevel@tonic-gate 		keyword[n++] = "o";
3887c478bd9Sstevel@tonic-gate 	}
3897c478bd9Sstevel@tonic-gate 	if (removecmd && *removecmd && dev_type && *dev_type) {
3907c478bd9Sstevel@tonic-gate 		if (strcmp(dev_type, "diskette") == 0) {
391*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3927c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, EJECT_MSG, voltxt);
3937c478bd9Sstevel@tonic-gate 			keyword[n++] = "e";
3947c478bd9Sstevel@tonic-gate 		} else {
395*4656d474SGarrett D'Amore 			/* LINTED E_SEC_SPRINTF_UNBOUNDED_COPY */
3967c478bd9Sstevel@tonic-gate 			pt += sprintf(pt, UNLOAD_MSG, voltxt);
3977c478bd9Sstevel@tonic-gate 			keyword[n++] = "u";
3987c478bd9Sstevel@tonic-gate 		}
3997c478bd9Sstevel@tonic-gate 	}
4007c478bd9Sstevel@tonic-gate 	keyword[n] = NULL;
4017c478bd9Sstevel@tonic-gate 	if (ckquit)
4027c478bd9Sstevel@tonic-gate 		pt += sprintf(pt, QUIT_MSG);
4037c478bd9Sstevel@tonic-gate 	*pt++ = ':';
4047c478bd9Sstevel@tonic-gate 	*pt = '\0';
4057c478bd9Sstevel@tonic-gate 
4067c478bd9Sstevel@tonic-gate 	pt = prmpt;
4077c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, BELL);
4087c478bd9Sstevel@tonic-gate 	for (;;) {
4097c478bd9Sstevel@tonic-gate 		if (n = ckkeywd(strval, keyword, NULL, NULL, NULL, pt))
4107c478bd9Sstevel@tonic-gate 			return (n);
4117c478bd9Sstevel@tonic-gate 
4127c478bd9Sstevel@tonic-gate 		pt = prompt; /* next prompt is only partial */
4137c478bd9Sstevel@tonic-gate 		if (*strval == 'f') {
4147c478bd9Sstevel@tonic-gate 			if (options & DM_FORMFS)
4157c478bd9Sstevel@tonic-gate 				doformat(voltxt, fmtcmd, mkfscmd);
4167c478bd9Sstevel@tonic-gate 			else
4177c478bd9Sstevel@tonic-gate 				doformat(voltxt, fmtcmd, NULL);
4187c478bd9Sstevel@tonic-gate 			continue;
4197c478bd9Sstevel@tonic-gate 		} else if (*strval == 'm') {
4207c478bd9Sstevel@tonic-gate 			doformat(voltxt, NULL, mkfscmd);
4217c478bd9Sstevel@tonic-gate 			continue;
4227c478bd9Sstevel@tonic-gate 		} else if (*strval == 'e' || *strval == 'u') {
4237c478bd9Sstevel@tonic-gate 			(void) doremovecmd(device, 1);
4247c478bd9Sstevel@tonic-gate 			continue;
4257c478bd9Sstevel@tonic-gate 		} else if (*strval == 'w') {
4267c478bd9Sstevel@tonic-gate 			(void) wilabel(label);
4277c478bd9Sstevel@tonic-gate 			continue;
4287c478bd9Sstevel@tonic-gate 		} else if (*strval == 'o')
4297c478bd9Sstevel@tonic-gate 			return (-1);
4307c478bd9Sstevel@tonic-gate 		break;
4317c478bd9Sstevel@tonic-gate 	}
4327c478bd9Sstevel@tonic-gate 	return (0);
4337c478bd9Sstevel@tonic-gate }
4347c478bd9Sstevel@tonic-gate 
4357c478bd9Sstevel@tonic-gate static void
4367c478bd9Sstevel@tonic-gate doformat(char *voltxt, char *fmtcmd, char *mkfscmd)
4377c478bd9Sstevel@tonic-gate {
4387c478bd9Sstevel@tonic-gate 	char	buffer[512];
4397c478bd9Sstevel@tonic-gate 
4407c478bd9Sstevel@tonic-gate 	if (fmtcmd && *fmtcmd) {
4417c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, "\t[%s]\n", fmtcmd);
442*4656d474SGarrett D'Amore 		(void) snprintf(buffer, sizeof (buffer), "(%s) 1>&2", fmtcmd);
4437c478bd9Sstevel@tonic-gate 		if (system(buffer)) {
4447c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, ERR_FMT, voltxt);
4457c478bd9Sstevel@tonic-gate 			return;
4467c478bd9Sstevel@tonic-gate 		}
4477c478bd9Sstevel@tonic-gate 	}
4487c478bd9Sstevel@tonic-gate 	if (mkfscmd && *mkfscmd) {
4497c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, "\t[%s]\n", mkfscmd);
450*4656d474SGarrett D'Amore 		(void) snprintf(buffer, sizeof (buffer), "(%s) 1>&2", mkfscmd);
4517c478bd9Sstevel@tonic-gate 		if (system(buffer)) {
4527c478bd9Sstevel@tonic-gate 			(void) fprintf(stderr, ERR_MKFS, voltxt);
4537c478bd9Sstevel@tonic-gate 			return;
4547c478bd9Sstevel@tonic-gate 		}
4557c478bd9Sstevel@tonic-gate 	}
4567c478bd9Sstevel@tonic-gate }
4577c478bd9Sstevel@tonic-gate 
4587c478bd9Sstevel@tonic-gate void
4597c478bd9Sstevel@tonic-gate doremovecmd(char *device, int echo)
4607c478bd9Sstevel@tonic-gate {
4617c478bd9Sstevel@tonic-gate 	char 	*removecmd;
4627c478bd9Sstevel@tonic-gate 	char	buffer[512];
4637c478bd9Sstevel@tonic-gate 
4647c478bd9Sstevel@tonic-gate 	if (device && *device) {
4657c478bd9Sstevel@tonic-gate 		removecmd = devattr(device, "removecmd");
4667c478bd9Sstevel@tonic-gate 		if (removecmd && *removecmd) {
4677c478bd9Sstevel@tonic-gate 			if (echo)
4687c478bd9Sstevel@tonic-gate 				(void) fprintf(stderr, "\t[%s]\n", removecmd);
469*4656d474SGarrett D'Amore 			(void) snprintf(buffer, sizeof (buffer),
470*4656d474SGarrett D'Amore 			    "(%s) 1>&2", removecmd);
4717c478bd9Sstevel@tonic-gate 			if (system(buffer)) {
4727c478bd9Sstevel@tonic-gate 				if (echo)
4737c478bd9Sstevel@tonic-gate 					(void) fprintf(stderr, ERR_REMOVE,
4747c478bd9Sstevel@tonic-gate 					removecmd);
4757c478bd9Sstevel@tonic-gate 				return;
4767c478bd9Sstevel@tonic-gate 			}
4777c478bd9Sstevel@tonic-gate 		}
4787c478bd9Sstevel@tonic-gate 	}
4797c478bd9Sstevel@tonic-gate }
4807c478bd9Sstevel@tonic-gate 
4817c478bd9Sstevel@tonic-gate static void
4827c478bd9Sstevel@tonic-gate labelerr(char *fsname, char *volname)
4837c478bd9Sstevel@tonic-gate {
4847c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, "\nLabel incorrect.\n");
4857c478bd9Sstevel@tonic-gate 	if (volume)
4867c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr,
4877c478bd9Sstevel@tonic-gate 			"The internal label on the inserted %s is\n", volume);
4887c478bd9Sstevel@tonic-gate 	else
4897c478bd9Sstevel@tonic-gate 		(void) fprintf(stderr, "The internal label for %s is", pname);
4907c478bd9Sstevel@tonic-gate 	(void) fprintf(stderr, "\t%s,%s\n", fsname, volname);
4917c478bd9Sstevel@tonic-gate }
492