xref: /freebsd/sbin/camcontrol/util.c (revision 1d386b48a555f61cb7325543adbbb5c3f3407a66)
11de7b4b8SPedro F. Giffuni /*-
21de7b4b8SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
31de7b4b8SPedro F. Giffuni  *
4525689f1SJustin T. Gibbs  * Written By Julian ELischer
5525689f1SJustin T. Gibbs  * Copyright julian Elischer 1993.
6525689f1SJustin T. Gibbs  * Permission is granted to use or redistribute this file in any way as long
7525689f1SJustin T. Gibbs  * as this notice remains. Julian Elischer does not guarantee that this file
8525689f1SJustin T. Gibbs  * is totally correct for any given task and users of this file must
9525689f1SJustin T. Gibbs  * accept responsibility for any damage that occurs from the application of this
10525689f1SJustin T. Gibbs  * file.
11525689f1SJustin T. Gibbs  *
12525689f1SJustin T. Gibbs  * (julian@tfs.com julian@dialix.oz.au)
13525689f1SJustin T. Gibbs  *
14525689f1SJustin T. Gibbs  * User SCSI hooks added by Peter Dufault:
15525689f1SJustin T. Gibbs  *
16525689f1SJustin T. Gibbs  * Copyright (c) 1994 HD Associates
17525689f1SJustin T. Gibbs  * (contact: dufault@hda.com)
18525689f1SJustin T. Gibbs  * All rights reserved.
19525689f1SJustin T. Gibbs  *
20525689f1SJustin T. Gibbs  * Redistribution and use in source and binary forms, with or without
21525689f1SJustin T. Gibbs  * modification, are permitted provided that the following conditions
22525689f1SJustin T. Gibbs  * are met:
23525689f1SJustin T. Gibbs  * 1. Redistributions of source code must retain the above copyright
24525689f1SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer.
25525689f1SJustin T. Gibbs  * 2. Redistributions in binary form must reproduce the above copyright
26525689f1SJustin T. Gibbs  *    notice, this list of conditions and the following disclaimer in the
27525689f1SJustin T. Gibbs  *    documentation and/or other materials provided with the distribution.
28525689f1SJustin T. Gibbs  * 3. The name of HD Associates
29525689f1SJustin T. Gibbs  *    may not be used to endorse or promote products derived from this software
30525689f1SJustin T. Gibbs  *    without specific prior written permission.
31525689f1SJustin T. Gibbs  *
32525689f1SJustin T. Gibbs  * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES ``AS IS'' AND
33525689f1SJustin T. Gibbs  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
34525689f1SJustin T. Gibbs  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
35525689f1SJustin T. Gibbs  * ARE DISCLAIMED.  IN NO EVENT SHALL HD ASSOCIATES BE LIABLE
36525689f1SJustin T. Gibbs  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37525689f1SJustin T. Gibbs  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38525689f1SJustin T. Gibbs  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39525689f1SJustin T. Gibbs  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
40525689f1SJustin T. Gibbs  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
41525689f1SJustin T. Gibbs  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
42525689f1SJustin T. Gibbs  * SUCH DAMAGE.
43525689f1SJustin T. Gibbs  */
44525689f1SJustin T. Gibbs /*
45525689f1SJustin T. Gibbs  * Taken from the original scsi(8) program.
46525689f1SJustin T. Gibbs  * from: scsi.c,v 1.17 1998/01/12 07:57:57 charnier Exp $";
47525689f1SJustin T. Gibbs  */
48bf2783a0SDavid E. O'Brien #include <sys/cdefs.h>
49c7cf7aa6SJohan Karlsson #include <sys/stdint.h>
50c7cf7aa6SJohan Karlsson #include <sys/types.h>
51c7cf7aa6SJohan Karlsson 
52525689f1SJustin T. Gibbs #include <stdlib.h>
53525689f1SJustin T. Gibbs #include <stdio.h>
547e32b20dSKelly Yancey #include <string.h>
55525689f1SJustin T. Gibbs 
56525689f1SJustin T. Gibbs #include <camlib.h>
57525689f1SJustin T. Gibbs #include "camcontrol.h"
58525689f1SJustin T. Gibbs 
597e32b20dSKelly Yancey int verbose;
60525689f1SJustin T. Gibbs 
61525689f1SJustin T. Gibbs /* iget: Integer argument callback
62525689f1SJustin T. Gibbs  */
63525689f1SJustin T. Gibbs int
iget(void * hook,char * name)64525689f1SJustin T. Gibbs iget(void *hook, char *name)
65525689f1SJustin T. Gibbs {
66525689f1SJustin T. Gibbs 	struct get_hook *h = (struct get_hook *)hook;
67525689f1SJustin T. Gibbs 	int arg;
68525689f1SJustin T. Gibbs 
69525689f1SJustin T. Gibbs 	if (h->got >= h->argc)
70525689f1SJustin T. Gibbs 	{
71525689f1SJustin T. Gibbs 		fprintf(stderr, "Expecting an integer argument.\n");
72c60e19a8SKenneth D. Merry 		usage(0);
73525689f1SJustin T. Gibbs 		exit(1);
74525689f1SJustin T. Gibbs 	}
75525689f1SJustin T. Gibbs 	arg = strtol(h->argv[h->got], 0, 0);
76525689f1SJustin T. Gibbs 	h->got++;
77525689f1SJustin T. Gibbs 
78525689f1SJustin T. Gibbs 	if (verbose && name && *name)
79525689f1SJustin T. Gibbs 		printf("%s: %d\n", name, arg);
80525689f1SJustin T. Gibbs 
81525689f1SJustin T. Gibbs 	return arg;
82525689f1SJustin T. Gibbs }
83525689f1SJustin T. Gibbs 
84525689f1SJustin T. Gibbs /* cget: char * argument callback
85525689f1SJustin T. Gibbs  */
86525689f1SJustin T. Gibbs char *
cget(void * hook,char * name)87525689f1SJustin T. Gibbs cget(void *hook, char *name)
88525689f1SJustin T. Gibbs {
89525689f1SJustin T. Gibbs 	struct get_hook *h = (struct get_hook *)hook;
90525689f1SJustin T. Gibbs 	char *arg;
91525689f1SJustin T. Gibbs 
92525689f1SJustin T. Gibbs 	if (h->got >= h->argc)
93525689f1SJustin T. Gibbs 	{
94525689f1SJustin T. Gibbs 		fprintf(stderr, "Expecting a character pointer argument.\n");
95c60e19a8SKenneth D. Merry 		usage(0);
96525689f1SJustin T. Gibbs 		exit(1);
97525689f1SJustin T. Gibbs 	}
98525689f1SJustin T. Gibbs 	arg = h->argv[h->got];
99525689f1SJustin T. Gibbs 	h->got++;
100525689f1SJustin T. Gibbs 
101525689f1SJustin T. Gibbs 	if (verbose && name)
102525689f1SJustin T. Gibbs 		printf("cget: %s: %s", name, arg);
103525689f1SJustin T. Gibbs 
104525689f1SJustin T. Gibbs 	return arg;
105525689f1SJustin T. Gibbs }
106525689f1SJustin T. Gibbs 
107525689f1SJustin T. Gibbs /* arg_put: "put argument" callback
108525689f1SJustin T. Gibbs  */
109525689f1SJustin T. Gibbs void
arg_put(void * hook __unused,int letter,void * arg,int count,char * name)11039867613SJohan Karlsson arg_put(void *hook __unused, int letter, void *arg, int count, char *name)
111525689f1SJustin T. Gibbs {
112525689f1SJustin T. Gibbs 	if (verbose && name && *name)
113525689f1SJustin T. Gibbs 		printf("%s:  ", name);
114525689f1SJustin T. Gibbs 
115525689f1SJustin T. Gibbs 	switch(letter)
116525689f1SJustin T. Gibbs 	{
117525689f1SJustin T. Gibbs 		case 'i':
118525689f1SJustin T. Gibbs 		case 'b':
119c7cf7aa6SJohan Karlsson 		printf("%jd ", (intmax_t)(intptr_t)arg);
120525689f1SJustin T. Gibbs 		break;
121525689f1SJustin T. Gibbs 
122525689f1SJustin T. Gibbs 		case 'c':
123525689f1SJustin T. Gibbs 		case 'z':
124525689f1SJustin T. Gibbs 		{
125525689f1SJustin T. Gibbs 			char *p;
126525689f1SJustin T. Gibbs 
127*fd340a12SXin LI 			p = calloc(1, count + 1);
128b673f44dSChris D. Faulhaber 			if (p == NULL) {
129b673f44dSChris D. Faulhaber 				fprintf(stderr, "can't malloc memory for p\n");
130b673f44dSChris D. Faulhaber 				exit(1);
131b673f44dSChris D. Faulhaber 			}
132525689f1SJustin T. Gibbs 
133*fd340a12SXin LI 			strlcpy(p, (char *)arg, count + 1);
134525689f1SJustin T. Gibbs 			if (letter == 'z')
135525689f1SJustin T. Gibbs 			{
136525689f1SJustin T. Gibbs 				int i;
137525689f1SJustin T. Gibbs 				for (i = count - 1; i >= 0; i--)
138525689f1SJustin T. Gibbs 					if (p[i] == ' ')
139525689f1SJustin T. Gibbs 						p[i] = 0;
140525689f1SJustin T. Gibbs 					else
141525689f1SJustin T. Gibbs 						break;
142525689f1SJustin T. Gibbs 			}
143525689f1SJustin T. Gibbs 			printf("%s ", p);
144525689f1SJustin T. Gibbs 
145525689f1SJustin T. Gibbs 			free(p);
146525689f1SJustin T. Gibbs 		}
147525689f1SJustin T. Gibbs 
148525689f1SJustin T. Gibbs 		break;
149525689f1SJustin T. Gibbs 
150525689f1SJustin T. Gibbs 		default:
151525689f1SJustin T. Gibbs 		printf("Unknown format letter: '%c'\n", letter);
152525689f1SJustin T. Gibbs 	}
153525689f1SJustin T. Gibbs 	if (verbose)
154525689f1SJustin T. Gibbs 		putchar('\n');
155525689f1SJustin T. Gibbs }
1561f4782a4SEd Maste 
1571f4782a4SEd Maste /*
1581f4782a4SEd Maste  * Get confirmation from user
1591f4782a4SEd Maste  * Return values:
1601f4782a4SEd Maste  *    1: confirmed
1611f4782a4SEd Maste  *    0: unconfirmed
1621f4782a4SEd Maste  */
1631f4782a4SEd Maste int
get_confirmation(void)16453f48302SXin LI get_confirmation(void)
1651f4782a4SEd Maste {
1661f4782a4SEd Maste 	char str[1024];
1671f4782a4SEd Maste 	int response = -1;
1681f4782a4SEd Maste 
1691f4782a4SEd Maste 	do {
1701f4782a4SEd Maste 		fprintf(stdout, "Are you SURE you want to do this? (yes/no) ");
1711f4782a4SEd Maste 		if (fgets(str, sizeof(str), stdin) != NULL) {
1721f4782a4SEd Maste 			if (strncasecmp(str, "yes", 3) == 0)
1731f4782a4SEd Maste 				response = 1;
1741f4782a4SEd Maste 			else if (strncasecmp(str, "no", 2) == 0)
1751f4782a4SEd Maste 				response = 0;
1761f4782a4SEd Maste 			else
1771f4782a4SEd Maste 				fprintf(stdout,
1781f4782a4SEd Maste 				    "Please answer \"yes\" or \"no\"\n");
1791f4782a4SEd Maste 		} else
1801f4782a4SEd Maste 			response = 0;
1811f4782a4SEd Maste 	} while (response == -1);
1821f4782a4SEd Maste 	return (response);
1831f4782a4SEd Maste }
184