xref: /freebsd/sbin/camcontrol/util.c (revision f9218d3d4fd34f082473b3a021c6d4d109fb47cf)
1 /*
2  * Written By Julian ELischer
3  * Copyright julian Elischer 1993.
4  * Permission is granted to use or redistribute this file in any way as long
5  * as this notice remains. Julian Elischer does not guarantee that this file
6  * is totally correct for any given task and users of this file must
7  * accept responsibility for any damage that occurs from the application of this
8  * file.
9  *
10  * (julian@tfs.com julian@dialix.oz.au)
11  *
12  * User SCSI hooks added by Peter Dufault:
13  *
14  * Copyright (c) 1994 HD Associates
15  * (contact: dufault@hda.com)
16  * All rights reserved.
17  *
18  * Redistribution and use in source and binary forms, with or without
19  * modification, are permitted provided that the following conditions
20  * are met:
21  * 1. Redistributions of source code must retain the above copyright
22  *    notice, this list of conditions and the following disclaimer.
23  * 2. Redistributions in binary form must reproduce the above copyright
24  *    notice, this list of conditions and the following disclaimer in the
25  *    documentation and/or other materials provided with the distribution.
26  * 3. The name of HD Associates
27  *    may not be used to endorse or promote products derived from this software
28  *    without specific prior written permission.
29  *
30  * THIS SOFTWARE IS PROVIDED BY HD ASSOCIATES ``AS IS'' AND
31  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
32  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
33  * ARE DISCLAIMED.  IN NO EVENT SHALL HD ASSOCIATES BE LIABLE
34  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
35  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
36  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
37  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
38  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
39  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
40  * SUCH DAMAGE.
41  */
42 /*
43  * Taken from the original scsi(8) program.
44  * from: scsi.c,v 1.17 1998/01/12 07:57:57 charnier Exp $";
45  */
46 #ifndef lint
47 static const char rcsid[] =
48   "$FreeBSD$";
49 #endif /* not lint */
50 
51 #include <sys/stdint.h>
52 #include <sys/types.h>
53 
54 #include <stdlib.h>
55 #include <stdio.h>
56 #include <string.h>
57 
58 #include <camlib.h>
59 #include "camcontrol.h"
60 
61 int verbose;
62 
63 /* iget: Integer argument callback
64  */
65 int
66 iget(void *hook, char *name)
67 {
68 	struct get_hook *h = (struct get_hook *)hook;
69 	int arg;
70 
71 	if (h->got >= h->argc)
72 	{
73 		fprintf(stderr, "Expecting an integer argument.\n");
74 		usage(0);
75 		exit(1);
76 	}
77 	arg = strtol(h->argv[h->got], 0, 0);
78 	h->got++;
79 
80 	if (verbose && name && *name)
81 		printf("%s: %d\n", name, arg);
82 
83 	return arg;
84 }
85 
86 /* cget: char * argument callback
87  */
88 char *
89 cget(void *hook, char *name)
90 {
91 	struct get_hook *h = (struct get_hook *)hook;
92 	char *arg;
93 
94 	if (h->got >= h->argc)
95 	{
96 		fprintf(stderr, "Expecting a character pointer argument.\n");
97 		usage(0);
98 		exit(1);
99 	}
100 	arg = h->argv[h->got];
101 	h->got++;
102 
103 	if (verbose && name)
104 		printf("cget: %s: %s", name, arg);
105 
106 	return arg;
107 }
108 
109 /* arg_put: "put argument" callback
110  */
111 void
112 arg_put(void *hook, int letter, void *arg, int count, char *name)
113 {
114 	if (verbose && name && *name)
115 		printf("%s:  ", name);
116 
117 	switch(letter)
118 	{
119 		case 'i':
120 		case 'b':
121 		printf("%jd ", (intmax_t)(intptr_t)arg);
122 		break;
123 
124 		case 'c':
125 		case 'z':
126 		{
127 			char *p;
128 
129 			p = malloc(count + 1);
130 			if (p == NULL) {
131 				fprintf(stderr, "can't malloc memory for p\n");
132 				exit(1);
133 			}
134 
135 			bzero(p, count +1);
136 			strncpy(p, (char *)arg, count);
137 			if (letter == 'z')
138 			{
139 				int i;
140 				for (i = count - 1; i >= 0; i--)
141 					if (p[i] == ' ')
142 						p[i] = 0;
143 					else
144 						break;
145 			}
146 			printf("%s ", p);
147 
148 			free(p);
149 		}
150 
151 		break;
152 
153 		default:
154 		printf("Unknown format letter: '%c'\n", letter);
155 	}
156 	if (verbose)
157 		putchar('\n');
158 }
159