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>