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