Annotation of embedaddon/istgt/src/istgt_iscsi_param.c, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008-2010 Daisuke Aoyama <aoyama@peach.ne.jp>.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: *
14: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17: * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: * SUCH DAMAGE.
25: *
26: */
27:
28: #ifdef HAVE_CONFIG_H
29: #include "config.h"
30: #endif
31:
32: #include <stdint.h>
33: #include <inttypes.h>
34:
35: #include <stdio.h>
36: #include <stdlib.h>
37: #include <string.h>
38:
39: #include "istgt.h"
40: #include "istgt_log.h"
41: #include "istgt_misc.h"
42: #include "istgt_iscsi.h"
43: #include "istgt_iscsi_param.h"
44:
45: void
46: istgt_iscsi_param_free(ISCSI_PARAM *params)
47: {
48: ISCSI_PARAM *param, *next_param;
49:
50: if (params == NULL)
51: return;
52: for (param = params; param != NULL; param = next_param) {
53: next_param = param->next;
54: xfree(param->list);
55: xfree(param->val);
56: xfree(param->key);
57: xfree(param);
58: }
59: }
60:
61: ISCSI_PARAM *
62: istgt_iscsi_param_find(ISCSI_PARAM *params, const char *key)
63: {
64: ISCSI_PARAM *param;
65:
66: if (params == NULL || key == NULL)
67: return NULL;
68: for (param = params; param != NULL; param = param->next) {
69: if (param->key != NULL && param->key[0] == key[0]
70: && strcasecmp(param->key, key) == 0) {
71: return param;
72: }
73: }
74: return NULL;
75: }
76:
77: int
78: istgt_iscsi_param_del(ISCSI_PARAM **params, const char *key)
79: {
80: ISCSI_PARAM *param, *prev_param = NULL;
81:
82: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "del %s\n", key);
83: if (params == NULL || key == NULL)
84: return 0;
85: for (param = *params; param != NULL; param = param->next) {
86: if (param->key != NULL && param->key[0] == key[0]
87: && strcasecmp(param->key, key) == 0) {
88: if (prev_param != NULL) {
89: prev_param->next = param->next;
90: } else {
91: *params = param->next;
92: }
93: param->next = NULL;
94: istgt_iscsi_param_free(param);
95: return 0;
96: }
97: prev_param = param;
98: }
99: return -1;
100: }
101:
102: int
103: istgt_iscsi_param_add(ISCSI_PARAM **params, const char *key, const char *val, const char *list, int type)
104: {
105: ISCSI_PARAM *param, *last_param;
106:
107: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "add %s=%s, list=[%s], type=%d\n",
108: key, val, list, type);
109: if (key == NULL)
110: return -1;
111: param = istgt_iscsi_param_find(*params, key);
112: if (param != NULL) {
113: istgt_iscsi_param_del(params, key);
114: }
115: param = xmalloc(sizeof *param);
116: memset(param, 0, sizeof *param);
117: param->next = NULL;
118: param->key = xstrdup(key);
119: param->val = xstrdup(val);
120: param->list = xstrdup(list);
121: param->type = type;
122:
123: last_param = *params;
124: if (last_param != NULL) {
125: while (last_param->next != NULL) {
126: last_param = last_param->next;
127: }
128: last_param->next = param;
129: } else {
130: *params = param;
131: }
132:
133: return 0;
134: }
135:
136: int
137: istgt_iscsi_param_set(ISCSI_PARAM *params, const char *key, const char *val)
138: {
139: ISCSI_PARAM *param;
140:
141: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "set %s=%s\n", key, val);
142: param = istgt_iscsi_param_find(params, key);
143: if (param == NULL) {
144: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "no key %s\n", key);
145: return -1;
146: }
147:
148: xfree(param->val);
149: param->val = xstrdup(val);
150:
151: return 0;
152: }
153:
154: int
155: istgt_iscsi_param_set_int(ISCSI_PARAM *params, const char *key, int val)
156: {
157: char buf[MAX_TMPBUF];
158: ISCSI_PARAM *param;
159:
160: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "set %s=%d\n", key, val);
161: param = istgt_iscsi_param_find(params, key);
162: if (param == NULL) {
163: ISTGT_TRACELOG(ISTGT_TRACE_DEBUG, "no key %s\n", key);
164: return -1;
165: }
166:
167: xfree(param->val);
168: snprintf(buf, sizeof buf, "%d", val);
169: param->val = xstrdup(buf);
170:
171: return 0;
172: }
173:
174: int
175: istgt_iscsi_parse_params(ISCSI_PARAM **params, const uint8_t *data, int len)
176: {
177: const uint8_t *p, *q;
178: const uint8_t *last;
179: char *key = NULL;
180: char *val = NULL;
181: int rc;
182: int n;
183:
184: /* for each key/val temporary store */
185: key = xmalloc(ISCSI_TEXT_MAX_KEY_LEN + 1);
186: val = xmalloc(ISCSI_TEXT_MAX_VAL_LEN + 1);
187:
188: /* data = "KEY=VAL<NUL>KEY=VAL<NUL>..." */
189: p = data;
190: last = data + len;
191: while (p < last && *p != '\0') {
192: q = p;
193: /* q = "KEY=VAL<NUL>" */
194: while (q < last && *q != '\0') {
195: if (*q == '=') {
196: break;
197: }
198: q++;
199: }
200: if (q >= last || *q == '\0') {
201: ISTGT_ERRLOG("'=' not found\n");
202: error_return:
203: xfree(key);
204: xfree(val);
205: return -1;
206: }
207: n = q - p;
208: if (n > ISCSI_TEXT_MAX_KEY_LEN) {
209: ISTGT_ERRLOG("Overflow Key %d\n", n);
210: goto error_return;
211: }
212: memcpy(key, p, n);
213: key[n] = '\0';
214:
215: p = q + 1;
216: q = p;
217: /* q = "VAL<NUL>" */
218: while (q < last && *q != '\0') {
219: q++;
220: }
221: n = q - p;
222: if (n > ISCSI_TEXT_MAX_VAL_LEN) {
223: ISTGT_ERRLOG("Overflow Val %d\n", n);
224: goto error_return;
225: }
226: memcpy(val, p, n);
227: val[n] = '\0';
228:
229: rc = istgt_iscsi_param_add(params, key, val, NULL, 0);
230: if (rc < 0) {
231: ISTGT_ERRLOG("iscsi_param_add() failed\n");
232: goto error_return;
233: }
234:
235: p = q + 1;
236: while (p < last && *p == '\0') {
237: p++;
238: }
239: }
240:
241: xfree(key);
242: xfree(val);
243: return 0;
244: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>