15c734b04SJakub Wojciech Klama /*- 28eebe1bfSEdward Tomasz Napierala * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 38eebe1bfSEdward Tomasz Napierala * 45c734b04SJakub Wojciech Klama * Copyright (c) 2015 iXsystems Inc. 55c734b04SJakub Wojciech Klama * All rights reserved. 65c734b04SJakub Wojciech Klama * 75c734b04SJakub Wojciech Klama * This software was developed by Jakub Klama <jceel@FreeBSD.org> 85c734b04SJakub Wojciech Klama * under sponsorship from iXsystems Inc. 95c734b04SJakub Wojciech Klama * 105c734b04SJakub Wojciech Klama * Redistribution and use in source and binary forms, with or without 115c734b04SJakub Wojciech Klama * modification, are permitted provided that the following conditions 125c734b04SJakub Wojciech Klama * are met: 135c734b04SJakub Wojciech Klama * 1. Redistributions of source code must retain the above copyright 145c734b04SJakub Wojciech Klama * notice, this list of conditions and the following disclaimer. 155c734b04SJakub Wojciech Klama * 2. Redistributions in binary form must reproduce the above copyright 165c734b04SJakub Wojciech Klama * notice, this list of conditions and the following disclaimer in the 175c734b04SJakub Wojciech Klama * documentation and/or other materials provided with the distribution. 185c734b04SJakub Wojciech Klama * 195c734b04SJakub Wojciech Klama * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 205c734b04SJakub Wojciech Klama * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 215c734b04SJakub Wojciech Klama * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 225c734b04SJakub Wojciech Klama * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 235c734b04SJakub Wojciech Klama * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 245c734b04SJakub Wojciech Klama * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 255c734b04SJakub Wojciech Klama * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 265c734b04SJakub Wojciech Klama * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 275c734b04SJakub Wojciech Klama * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 285c734b04SJakub Wojciech Klama * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 295c734b04SJakub Wojciech Klama * SUCH DAMAGE. 305c734b04SJakub Wojciech Klama * 315c734b04SJakub Wojciech Klama * $FreeBSD$ 325c734b04SJakub Wojciech Klama */ 335c734b04SJakub Wojciech Klama 345c734b04SJakub Wojciech Klama #include <sys/queue.h> 355c734b04SJakub Wojciech Klama #include <sys/types.h> 365c734b04SJakub Wojciech Klama #include <assert.h> 375c734b04SJakub Wojciech Klama #include <stdio.h> 385c734b04SJakub Wojciech Klama #include <stdint.h> 395c734b04SJakub Wojciech Klama #include <stdlib.h> 405c734b04SJakub Wojciech Klama #include <string.h> 415c734b04SJakub Wojciech Klama #include <ucl.h> 4264ffe6d4SRichard Scheffenegger #include <netinet/in.h> 4364ffe6d4SRichard Scheffenegger #include <netinet/ip.h> 445c734b04SJakub Wojciech Klama 455c734b04SJakub Wojciech Klama #include "ctld.h" 465c734b04SJakub Wojciech Klama 475c734b04SJakub Wojciech Klama static struct conf *conf = NULL; 485c734b04SJakub Wojciech Klama 495c734b04SJakub Wojciech Klama static int uclparse_toplevel(const ucl_object_t *); 505c734b04SJakub Wojciech Klama static int uclparse_chap(struct auth_group *, const ucl_object_t *); 515c734b04SJakub Wojciech Klama static int uclparse_chap_mutual(struct auth_group *, const ucl_object_t *); 525c734b04SJakub Wojciech Klama static int uclparse_lun(const char *, const ucl_object_t *); 535c734b04SJakub Wojciech Klama static int uclparse_auth_group(const char *, const ucl_object_t *); 545c734b04SJakub Wojciech Klama static int uclparse_portal_group(const char *, const ucl_object_t *); 555c734b04SJakub Wojciech Klama static int uclparse_target(const char *, const ucl_object_t *); 565c734b04SJakub Wojciech Klama static int uclparse_target_portal_group(struct target *, const ucl_object_t *); 575c734b04SJakub Wojciech Klama static int uclparse_target_lun(struct target *, const ucl_object_t *); 585c734b04SJakub Wojciech Klama 595c734b04SJakub Wojciech Klama static int 605c734b04SJakub Wojciech Klama uclparse_chap(struct auth_group *auth_group, const ucl_object_t *obj) 615c734b04SJakub Wojciech Klama { 625c734b04SJakub Wojciech Klama const struct auth *ca; 635c734b04SJakub Wojciech Klama const ucl_object_t *user, *secret; 645c734b04SJakub Wojciech Klama 655c734b04SJakub Wojciech Klama user = ucl_object_find_key(obj, "user"); 665c734b04SJakub Wojciech Klama if (!user || user->type != UCL_STRING) { 675c734b04SJakub Wojciech Klama log_warnx("chap section in auth-group \"%s\" is missing " 685c734b04SJakub Wojciech Klama "\"user\" string key", auth_group->ag_name); 695c734b04SJakub Wojciech Klama return (1); 705c734b04SJakub Wojciech Klama } 715c734b04SJakub Wojciech Klama 725c734b04SJakub Wojciech Klama secret = ucl_object_find_key(obj, "secret"); 735c734b04SJakub Wojciech Klama if (!secret || secret->type != UCL_STRING) { 745c734b04SJakub Wojciech Klama log_warnx("chap section in auth-group \"%s\" is missing " 755c734b04SJakub Wojciech Klama "\"secret\" string key", auth_group->ag_name); 765c734b04SJakub Wojciech Klama } 775c734b04SJakub Wojciech Klama 785c734b04SJakub Wojciech Klama ca = auth_new_chap(auth_group, 795c734b04SJakub Wojciech Klama ucl_object_tostring(user), 805c734b04SJakub Wojciech Klama ucl_object_tostring(secret)); 815c734b04SJakub Wojciech Klama 825c734b04SJakub Wojciech Klama if (ca == NULL) 835c734b04SJakub Wojciech Klama return (1); 845c734b04SJakub Wojciech Klama 855c734b04SJakub Wojciech Klama return (0); 865c734b04SJakub Wojciech Klama } 875c734b04SJakub Wojciech Klama 885c734b04SJakub Wojciech Klama static int 895c734b04SJakub Wojciech Klama uclparse_chap_mutual(struct auth_group *auth_group, const ucl_object_t *obj) 905c734b04SJakub Wojciech Klama { 915c734b04SJakub Wojciech Klama const struct auth *ca; 925c734b04SJakub Wojciech Klama const ucl_object_t *user, *secret, *mutual_user; 935c734b04SJakub Wojciech Klama const ucl_object_t *mutual_secret; 945c734b04SJakub Wojciech Klama 955c734b04SJakub Wojciech Klama user = ucl_object_find_key(obj, "user"); 965c734b04SJakub Wojciech Klama if (!user || user->type != UCL_STRING) { 975c734b04SJakub Wojciech Klama log_warnx("chap-mutual section in auth-group \"%s\" is missing " 985c734b04SJakub Wojciech Klama "\"user\" string key", auth_group->ag_name); 995c734b04SJakub Wojciech Klama return (1); 1005c734b04SJakub Wojciech Klama } 1015c734b04SJakub Wojciech Klama 1025c734b04SJakub Wojciech Klama secret = ucl_object_find_key(obj, "secret"); 1035c734b04SJakub Wojciech Klama if (!secret || secret->type != UCL_STRING) { 1045c734b04SJakub Wojciech Klama log_warnx("chap-mutual section in auth-group \"%s\" is missing " 1055c734b04SJakub Wojciech Klama "\"secret\" string key", auth_group->ag_name); 1065c734b04SJakub Wojciech Klama return (1); 1075c734b04SJakub Wojciech Klama } 1085c734b04SJakub Wojciech Klama 1095c734b04SJakub Wojciech Klama mutual_user = ucl_object_find_key(obj, "mutual-user"); 1105c734b04SJakub Wojciech Klama if (!user || user->type != UCL_STRING) { 1115c734b04SJakub Wojciech Klama log_warnx("chap-mutual section in auth-group \"%s\" is missing " 1125c734b04SJakub Wojciech Klama "\"mutual-user\" string key", auth_group->ag_name); 1135c734b04SJakub Wojciech Klama return (1); 1145c734b04SJakub Wojciech Klama } 1155c734b04SJakub Wojciech Klama 1165c734b04SJakub Wojciech Klama mutual_secret = ucl_object_find_key(obj, "mutual-secret"); 1175c734b04SJakub Wojciech Klama if (!secret || secret->type != UCL_STRING) { 1185c734b04SJakub Wojciech Klama log_warnx("chap-mutual section in auth-group \"%s\" is missing " 1195c734b04SJakub Wojciech Klama "\"mutual-secret\" string key", auth_group->ag_name); 1205c734b04SJakub Wojciech Klama return (1); 1215c734b04SJakub Wojciech Klama } 1225c734b04SJakub Wojciech Klama 1235c734b04SJakub Wojciech Klama ca = auth_new_chap_mutual(auth_group, 1245c734b04SJakub Wojciech Klama ucl_object_tostring(user), 1255c734b04SJakub Wojciech Klama ucl_object_tostring(secret), 1265c734b04SJakub Wojciech Klama ucl_object_tostring(mutual_user), 1275c734b04SJakub Wojciech Klama ucl_object_tostring(mutual_secret)); 1285c734b04SJakub Wojciech Klama 1295c734b04SJakub Wojciech Klama if (ca == NULL) 1305c734b04SJakub Wojciech Klama return (1); 1315c734b04SJakub Wojciech Klama 1325c734b04SJakub Wojciech Klama return (0); 1335c734b04SJakub Wojciech Klama } 1345c734b04SJakub Wojciech Klama 1355c734b04SJakub Wojciech Klama static int 1365c734b04SJakub Wojciech Klama uclparse_target_portal_group(struct target *target, const ucl_object_t *obj) 1375c734b04SJakub Wojciech Klama { 1385c734b04SJakub Wojciech Klama struct portal_group *tpg; 1395c734b04SJakub Wojciech Klama struct auth_group *tag = NULL; 1405c734b04SJakub Wojciech Klama struct port *tp; 1415c734b04SJakub Wojciech Klama const ucl_object_t *portal_group, *auth_group; 1425c734b04SJakub Wojciech Klama 1435c734b04SJakub Wojciech Klama portal_group = ucl_object_find_key(obj, "name"); 1445c734b04SJakub Wojciech Klama if (!portal_group || portal_group->type != UCL_STRING) { 1455c734b04SJakub Wojciech Klama log_warnx("portal-group section in target \"%s\" is missing " 1465c734b04SJakub Wojciech Klama "\"name\" string key", target->t_name); 1475c734b04SJakub Wojciech Klama return (1); 1485c734b04SJakub Wojciech Klama } 1495c734b04SJakub Wojciech Klama 1505c734b04SJakub Wojciech Klama auth_group = ucl_object_find_key(obj, "auth-group-name"); 1515c734b04SJakub Wojciech Klama if (auth_group && auth_group->type != UCL_STRING) { 1525c734b04SJakub Wojciech Klama log_warnx("portal-group section in target \"%s\" is missing " 1535c734b04SJakub Wojciech Klama "\"auth-group-name\" string key", target->t_name); 1545c734b04SJakub Wojciech Klama return (1); 1555c734b04SJakub Wojciech Klama } 1565c734b04SJakub Wojciech Klama 1575c734b04SJakub Wojciech Klama 1585c734b04SJakub Wojciech Klama tpg = portal_group_find(conf, ucl_object_tostring(portal_group)); 1595c734b04SJakub Wojciech Klama if (tpg == NULL) { 1605c734b04SJakub Wojciech Klama log_warnx("unknown portal-group \"%s\" for target " 1615c734b04SJakub Wojciech Klama "\"%s\"", ucl_object_tostring(portal_group), target->t_name); 1625c734b04SJakub Wojciech Klama return (1); 1635c734b04SJakub Wojciech Klama } 1645c734b04SJakub Wojciech Klama 1655c734b04SJakub Wojciech Klama if (auth_group) { 1665c734b04SJakub Wojciech Klama tag = auth_group_find(conf, ucl_object_tostring(auth_group)); 1675c734b04SJakub Wojciech Klama if (tag == NULL) { 1685c734b04SJakub Wojciech Klama log_warnx("unknown auth-group \"%s\" for target " 1695c734b04SJakub Wojciech Klama "\"%s\"", ucl_object_tostring(auth_group), 1705c734b04SJakub Wojciech Klama target->t_name); 1715c734b04SJakub Wojciech Klama return (1); 1725c734b04SJakub Wojciech Klama } 1735c734b04SJakub Wojciech Klama } 1745c734b04SJakub Wojciech Klama 1755c734b04SJakub Wojciech Klama tp = port_new(conf, target, tpg); 1765c734b04SJakub Wojciech Klama if (tp == NULL) { 1775c734b04SJakub Wojciech Klama log_warnx("can't link portal-group \"%s\" to target " 1785c734b04SJakub Wojciech Klama "\"%s\"", ucl_object_tostring(portal_group), target->t_name); 1795c734b04SJakub Wojciech Klama return (1); 1805c734b04SJakub Wojciech Klama } 1815c734b04SJakub Wojciech Klama tp->p_auth_group = tag; 1825c734b04SJakub Wojciech Klama 1835c734b04SJakub Wojciech Klama return (0); 1845c734b04SJakub Wojciech Klama } 1855c734b04SJakub Wojciech Klama 1865c734b04SJakub Wojciech Klama static int 1875c734b04SJakub Wojciech Klama uclparse_target_lun(struct target *target, const ucl_object_t *obj) 1885c734b04SJakub Wojciech Klama { 1895c734b04SJakub Wojciech Klama struct lun *lun; 190dad99db2SAlexander Motin uint64_t tmp; 1915c734b04SJakub Wojciech Klama 1925c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) { 1935c734b04SJakub Wojciech Klama char *name; 1945c734b04SJakub Wojciech Klama 195dad99db2SAlexander Motin tmp = ucl_object_toint(obj); 196dad99db2SAlexander Motin if (tmp >= MAX_LUNS) { 197dad99db2SAlexander Motin log_warnx("LU number %ju in target \"%s\" is too big", 198dad99db2SAlexander Motin tmp, target->t_name); 199dad99db2SAlexander Motin return (1); 200dad99db2SAlexander Motin } 201dad99db2SAlexander Motin 202dad99db2SAlexander Motin asprintf(&name, "%s,lun,%ju", target->t_name, tmp); 2035c734b04SJakub Wojciech Klama lun = lun_new(conf, name); 2045c734b04SJakub Wojciech Klama if (lun == NULL) 2055c734b04SJakub Wojciech Klama return (1); 2065c734b04SJakub Wojciech Klama 2075c734b04SJakub Wojciech Klama lun_set_scsiname(lun, name); 208dad99db2SAlexander Motin target->t_luns[tmp] = lun; 2095c734b04SJakub Wojciech Klama return (0); 2105c734b04SJakub Wojciech Klama } 2115c734b04SJakub Wojciech Klama 2125c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 2135c734b04SJakub Wojciech Klama const ucl_object_t *num = ucl_object_find_key(obj, "number"); 2145c734b04SJakub Wojciech Klama const ucl_object_t *name = ucl_object_find_key(obj, "name"); 2155c734b04SJakub Wojciech Klama 2165c734b04SJakub Wojciech Klama if (num == NULL || num->type != UCL_INT) { 2175c734b04SJakub Wojciech Klama log_warnx("lun section in target \"%s\" is missing " 2185c734b04SJakub Wojciech Klama "\"number\" integer property", target->t_name); 2195c734b04SJakub Wojciech Klama return (1); 2205c734b04SJakub Wojciech Klama } 221dad99db2SAlexander Motin tmp = ucl_object_toint(num); 222dad99db2SAlexander Motin if (tmp >= MAX_LUNS) { 223dad99db2SAlexander Motin log_warnx("LU number %ju in target \"%s\" is too big", 224dad99db2SAlexander Motin tmp, target->t_name); 225dad99db2SAlexander Motin return (1); 226dad99db2SAlexander Motin } 2275c734b04SJakub Wojciech Klama 2285c734b04SJakub Wojciech Klama if (name == NULL || name->type != UCL_STRING) { 2295c734b04SJakub Wojciech Klama log_warnx("lun section in target \"%s\" is missing " 2305c734b04SJakub Wojciech Klama "\"name\" string property", target->t_name); 2315c734b04SJakub Wojciech Klama return (1); 2325c734b04SJakub Wojciech Klama } 2335c734b04SJakub Wojciech Klama 2345c734b04SJakub Wojciech Klama lun = lun_find(conf, ucl_object_tostring(name)); 2355c734b04SJakub Wojciech Klama if (lun == NULL) 2365c734b04SJakub Wojciech Klama return (1); 2375c734b04SJakub Wojciech Klama 238dad99db2SAlexander Motin target->t_luns[tmp] = lun; 2395c734b04SJakub Wojciech Klama } 2405c734b04SJakub Wojciech Klama 2415c734b04SJakub Wojciech Klama return (0); 2425c734b04SJakub Wojciech Klama } 2435c734b04SJakub Wojciech Klama 2445c734b04SJakub Wojciech Klama static int 2455c734b04SJakub Wojciech Klama uclparse_toplevel(const ucl_object_t *top) 2465c734b04SJakub Wojciech Klama { 2475c734b04SJakub Wojciech Klama ucl_object_iter_t it = NULL, iter = NULL; 2485c734b04SJakub Wojciech Klama const ucl_object_t *obj = NULL, *child = NULL; 2495c734b04SJakub Wojciech Klama int err = 0; 2505c734b04SJakub Wojciech Klama 2515c734b04SJakub Wojciech Klama /* Pass 1 - everything except targets */ 2525c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 2535c734b04SJakub Wojciech Klama const char *key = ucl_object_key(obj); 2545c734b04SJakub Wojciech Klama 2555c734b04SJakub Wojciech Klama if (!strcmp(key, "debug")) { 2565c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) 2575c734b04SJakub Wojciech Klama conf->conf_debug = ucl_object_toint(obj); 2585c734b04SJakub Wojciech Klama else { 2595c734b04SJakub Wojciech Klama log_warnx("\"debug\" property value is not integer"); 2605c734b04SJakub Wojciech Klama return (1); 2615c734b04SJakub Wojciech Klama } 2625c734b04SJakub Wojciech Klama } 2635c734b04SJakub Wojciech Klama 2645c734b04SJakub Wojciech Klama if (!strcmp(key, "timeout")) { 2655c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) 2665c734b04SJakub Wojciech Klama conf->conf_timeout = ucl_object_toint(obj); 2675c734b04SJakub Wojciech Klama else { 2685c734b04SJakub Wojciech Klama log_warnx("\"timeout\" property value is not integer"); 2695c734b04SJakub Wojciech Klama return (1); 2705c734b04SJakub Wojciech Klama } 2715c734b04SJakub Wojciech Klama } 2725c734b04SJakub Wojciech Klama 2735c734b04SJakub Wojciech Klama if (!strcmp(key, "maxproc")) { 2745c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) 2755c734b04SJakub Wojciech Klama conf->conf_maxproc = ucl_object_toint(obj); 2765c734b04SJakub Wojciech Klama else { 2775c734b04SJakub Wojciech Klama log_warnx("\"maxproc\" property value is not integer"); 2785c734b04SJakub Wojciech Klama return (1); 2795c734b04SJakub Wojciech Klama } 2805c734b04SJakub Wojciech Klama } 2815c734b04SJakub Wojciech Klama 2825c734b04SJakub Wojciech Klama if (!strcmp(key, "pidfile")) { 2835c734b04SJakub Wojciech Klama if (obj->type == UCL_STRING) 2845c734b04SJakub Wojciech Klama conf->conf_pidfile_path = strdup( 2855c734b04SJakub Wojciech Klama ucl_object_tostring(obj)); 2865c734b04SJakub Wojciech Klama else { 2875c734b04SJakub Wojciech Klama log_warnx("\"pidfile\" property value is not string"); 2885c734b04SJakub Wojciech Klama return (1); 2895c734b04SJakub Wojciech Klama } 2905c734b04SJakub Wojciech Klama } 2915c734b04SJakub Wojciech Klama 2925c734b04SJakub Wojciech Klama if (!strcmp(key, "isns-server")) { 2935c734b04SJakub Wojciech Klama if (obj->type == UCL_ARRAY) { 2945c734b04SJakub Wojciech Klama iter = NULL; 2955c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &iter, 2965c734b04SJakub Wojciech Klama true))) { 2975c734b04SJakub Wojciech Klama if (child->type != UCL_STRING) 2985c734b04SJakub Wojciech Klama return (1); 2995c734b04SJakub Wojciech Klama 3005c734b04SJakub Wojciech Klama err = isns_new(conf, 3015c734b04SJakub Wojciech Klama ucl_object_tostring(child)); 3025c734b04SJakub Wojciech Klama if (err != 0) { 3035c734b04SJakub Wojciech Klama return (1); 3045c734b04SJakub Wojciech Klama } 3055c734b04SJakub Wojciech Klama } 3065c734b04SJakub Wojciech Klama } else { 3075c734b04SJakub Wojciech Klama log_warnx("\"isns-server\" property value is " 3085c734b04SJakub Wojciech Klama "not an array"); 3095c734b04SJakub Wojciech Klama return (1); 3105c734b04SJakub Wojciech Klama } 3115c734b04SJakub Wojciech Klama } 3125c734b04SJakub Wojciech Klama 3135c734b04SJakub Wojciech Klama if (!strcmp(key, "isns-period")) { 3145c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) 3155c734b04SJakub Wojciech Klama conf->conf_timeout = ucl_object_toint(obj); 3165c734b04SJakub Wojciech Klama else { 3175c734b04SJakub Wojciech Klama log_warnx("\"isns-period\" property value is not integer"); 3185c734b04SJakub Wojciech Klama return (1); 3195c734b04SJakub Wojciech Klama } 3205c734b04SJakub Wojciech Klama } 3215c734b04SJakub Wojciech Klama 3225c734b04SJakub Wojciech Klama if (!strcmp(key, "isns-timeout")) { 3235c734b04SJakub Wojciech Klama if (obj->type == UCL_INT) 3245c734b04SJakub Wojciech Klama conf->conf_timeout = ucl_object_toint(obj); 3255c734b04SJakub Wojciech Klama else { 3265c734b04SJakub Wojciech Klama log_warnx("\"isns-timeout\" property value is not integer"); 3275c734b04SJakub Wojciech Klama return (1); 3285c734b04SJakub Wojciech Klama } 3295c734b04SJakub Wojciech Klama } 3305c734b04SJakub Wojciech Klama 3315c734b04SJakub Wojciech Klama if (!strcmp(key, "auth-group")) { 3325c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 3335c734b04SJakub Wojciech Klama iter = NULL; 3345c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &iter, true))) { 3355c734b04SJakub Wojciech Klama uclparse_auth_group(ucl_object_key(child), child); 3365c734b04SJakub Wojciech Klama } 3375c734b04SJakub Wojciech Klama } else { 3385c734b04SJakub Wojciech Klama log_warnx("\"auth-group\" section is not an object"); 3395c734b04SJakub Wojciech Klama return (1); 3405c734b04SJakub Wojciech Klama } 3415c734b04SJakub Wojciech Klama } 3425c734b04SJakub Wojciech Klama 3435c734b04SJakub Wojciech Klama if (!strcmp(key, "portal-group")) { 3445c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 3455c734b04SJakub Wojciech Klama iter = NULL; 3465c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &iter, true))) { 3475c734b04SJakub Wojciech Klama uclparse_portal_group(ucl_object_key(child), child); 3485c734b04SJakub Wojciech Klama } 3495c734b04SJakub Wojciech Klama } else { 3505c734b04SJakub Wojciech Klama log_warnx("\"portal-group\" section is not an object"); 3515c734b04SJakub Wojciech Klama return (1); 3525c734b04SJakub Wojciech Klama } 3535c734b04SJakub Wojciech Klama } 3545c734b04SJakub Wojciech Klama 3555c734b04SJakub Wojciech Klama if (!strcmp(key, "lun")) { 3565c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 3575c734b04SJakub Wojciech Klama iter = NULL; 3585c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &iter, true))) { 3595c734b04SJakub Wojciech Klama uclparse_lun(ucl_object_key(child), child); 3605c734b04SJakub Wojciech Klama } 3615c734b04SJakub Wojciech Klama } else { 3625c734b04SJakub Wojciech Klama log_warnx("\"lun\" section is not an object"); 3635c734b04SJakub Wojciech Klama return (1); 3645c734b04SJakub Wojciech Klama } 3655c734b04SJakub Wojciech Klama } 3665c734b04SJakub Wojciech Klama } 3675c734b04SJakub Wojciech Klama 3685c734b04SJakub Wojciech Klama /* Pass 2 - targets */ 3695c734b04SJakub Wojciech Klama it = NULL; 3705c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 3715c734b04SJakub Wojciech Klama const char *key = ucl_object_key(obj); 3725c734b04SJakub Wojciech Klama 3735c734b04SJakub Wojciech Klama if (!strcmp(key, "target")) { 3745c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 3755c734b04SJakub Wojciech Klama iter = NULL; 3765c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &iter, 3775c734b04SJakub Wojciech Klama true))) { 3785c734b04SJakub Wojciech Klama uclparse_target(ucl_object_key(child), 3795c734b04SJakub Wojciech Klama child); 3805c734b04SJakub Wojciech Klama } 3815c734b04SJakub Wojciech Klama } else { 3825c734b04SJakub Wojciech Klama log_warnx("\"target\" section is not an object"); 3835c734b04SJakub Wojciech Klama return (1); 3845c734b04SJakub Wojciech Klama } 3855c734b04SJakub Wojciech Klama } 3865c734b04SJakub Wojciech Klama } 3875c734b04SJakub Wojciech Klama 3885c734b04SJakub Wojciech Klama return (0); 3895c734b04SJakub Wojciech Klama } 3905c734b04SJakub Wojciech Klama 3915c734b04SJakub Wojciech Klama static int 3925c734b04SJakub Wojciech Klama uclparse_auth_group(const char *name, const ucl_object_t *top) 3935c734b04SJakub Wojciech Klama { 3945c734b04SJakub Wojciech Klama struct auth_group *auth_group; 3955c734b04SJakub Wojciech Klama const struct auth_name *an; 3965c734b04SJakub Wojciech Klama const struct auth_portal *ap; 3975c734b04SJakub Wojciech Klama ucl_object_iter_t it = NULL, it2 = NULL; 3985c734b04SJakub Wojciech Klama const ucl_object_t *obj = NULL, *tmp = NULL; 3995c734b04SJakub Wojciech Klama const char *key; 4005c734b04SJakub Wojciech Klama int err; 4015c734b04SJakub Wojciech Klama 4025c734b04SJakub Wojciech Klama if (!strcmp(name, "default") && 4035c734b04SJakub Wojciech Klama conf->conf_default_ag_defined == false) { 4045c734b04SJakub Wojciech Klama auth_group = auth_group_find(conf, name); 4055c734b04SJakub Wojciech Klama conf->conf_default_ag_defined = true; 4065c734b04SJakub Wojciech Klama } else { 4075c734b04SJakub Wojciech Klama auth_group = auth_group_new(conf, name); 4085c734b04SJakub Wojciech Klama } 4095c734b04SJakub Wojciech Klama 4105c734b04SJakub Wojciech Klama if (auth_group == NULL) 4115c734b04SJakub Wojciech Klama return (1); 4125c734b04SJakub Wojciech Klama 4135c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 4145c734b04SJakub Wojciech Klama key = ucl_object_key(obj); 4155c734b04SJakub Wojciech Klama 4165c734b04SJakub Wojciech Klama if (!strcmp(key, "auth-type")) { 4175c734b04SJakub Wojciech Klama const char *value = ucl_object_tostring(obj); 4185c734b04SJakub Wojciech Klama 4195c734b04SJakub Wojciech Klama err = auth_group_set_type(auth_group, value); 4205c734b04SJakub Wojciech Klama if (err) 4215c734b04SJakub Wojciech Klama return (1); 4225c734b04SJakub Wojciech Klama } 4235c734b04SJakub Wojciech Klama 4245c734b04SJakub Wojciech Klama if (!strcmp(key, "chap")) { 4255c734b04SJakub Wojciech Klama if (obj->type != UCL_ARRAY) { 4265c734b04SJakub Wojciech Klama log_warnx("\"chap\" property of " 4275c734b04SJakub Wojciech Klama "auth-group \"%s\" is not an array", 4285c734b04SJakub Wojciech Klama name); 4295c734b04SJakub Wojciech Klama return (1); 4305c734b04SJakub Wojciech Klama } 4315c734b04SJakub Wojciech Klama 4325c734b04SJakub Wojciech Klama it2 = NULL; 4335c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, true))) { 4345c734b04SJakub Wojciech Klama if (uclparse_chap(auth_group, tmp) != 0) 4355c734b04SJakub Wojciech Klama return (1); 4365c734b04SJakub Wojciech Klama } 4375c734b04SJakub Wojciech Klama } 4385c734b04SJakub Wojciech Klama 4395c734b04SJakub Wojciech Klama if (!strcmp(key, "chap-mutual")) { 4405c734b04SJakub Wojciech Klama if (obj->type != UCL_ARRAY) { 4415c734b04SJakub Wojciech Klama log_warnx("\"chap-mutual\" property of " 4425c734b04SJakub Wojciech Klama "auth-group \"%s\" is not an array", 4435c734b04SJakub Wojciech Klama name); 4445c734b04SJakub Wojciech Klama return (1); 4455c734b04SJakub Wojciech Klama } 4465c734b04SJakub Wojciech Klama 4475c734b04SJakub Wojciech Klama it2 = NULL; 4485c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, true))) { 4495c734b04SJakub Wojciech Klama if (uclparse_chap_mutual(auth_group, tmp) != 0) 4505c734b04SJakub Wojciech Klama return (1); 4515c734b04SJakub Wojciech Klama } 4525c734b04SJakub Wojciech Klama } 4535c734b04SJakub Wojciech Klama 4545c734b04SJakub Wojciech Klama if (!strcmp(key, "initiator-name")) { 4555c734b04SJakub Wojciech Klama if (obj->type != UCL_ARRAY) { 4565c734b04SJakub Wojciech Klama log_warnx("\"initiator-name\" property of " 4575c734b04SJakub Wojciech Klama "auth-group \"%s\" is not an array", 4585c734b04SJakub Wojciech Klama name); 4595c734b04SJakub Wojciech Klama return (1); 4605c734b04SJakub Wojciech Klama } 4615c734b04SJakub Wojciech Klama 4625c734b04SJakub Wojciech Klama it2 = NULL; 4635c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, true))) { 4645c734b04SJakub Wojciech Klama const char *value = ucl_object_tostring(tmp); 4655c734b04SJakub Wojciech Klama 4665c734b04SJakub Wojciech Klama an = auth_name_new(auth_group, value); 4675c734b04SJakub Wojciech Klama if (an == NULL) 4685c734b04SJakub Wojciech Klama return (1); 4695c734b04SJakub Wojciech Klama } 4705c734b04SJakub Wojciech Klama } 4715c734b04SJakub Wojciech Klama 4725c734b04SJakub Wojciech Klama if (!strcmp(key, "initiator-portal")) { 4735c734b04SJakub Wojciech Klama if (obj->type != UCL_ARRAY) { 4745c734b04SJakub Wojciech Klama log_warnx("\"initiator-portal\" property of " 4755c734b04SJakub Wojciech Klama "auth-group \"%s\" is not an array", 4765c734b04SJakub Wojciech Klama name); 4775c734b04SJakub Wojciech Klama return (1); 4785c734b04SJakub Wojciech Klama } 4795c734b04SJakub Wojciech Klama 4805c734b04SJakub Wojciech Klama it2 = NULL; 4815c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, true))) { 4825c734b04SJakub Wojciech Klama const char *value = ucl_object_tostring(tmp); 4835c734b04SJakub Wojciech Klama 4845c734b04SJakub Wojciech Klama ap = auth_portal_new(auth_group, value); 4855c734b04SJakub Wojciech Klama if (ap == NULL) 4865c734b04SJakub Wojciech Klama return (1); 4875c734b04SJakub Wojciech Klama } 4885c734b04SJakub Wojciech Klama } 4895c734b04SJakub Wojciech Klama } 4905c734b04SJakub Wojciech Klama 4915c734b04SJakub Wojciech Klama return (0); 4925c734b04SJakub Wojciech Klama } 4935c734b04SJakub Wojciech Klama 4945c734b04SJakub Wojciech Klama static int 4955c734b04SJakub Wojciech Klama uclparse_portal_group(const char *name, const ucl_object_t *top) 4965c734b04SJakub Wojciech Klama { 4975c734b04SJakub Wojciech Klama struct portal_group *portal_group; 4985c734b04SJakub Wojciech Klama ucl_object_iter_t it = NULL, it2 = NULL; 4995c734b04SJakub Wojciech Klama const ucl_object_t *obj = NULL, *tmp = NULL; 5005c734b04SJakub Wojciech Klama const char *key; 5015c734b04SJakub Wojciech Klama 5025c734b04SJakub Wojciech Klama if (strcmp(name, "default") == 0 && 5035c734b04SJakub Wojciech Klama conf->conf_default_pg_defined == false) { 5045c734b04SJakub Wojciech Klama portal_group = portal_group_find(conf, name); 5055c734b04SJakub Wojciech Klama conf->conf_default_pg_defined = true; 5065c734b04SJakub Wojciech Klama } else { 5075c734b04SJakub Wojciech Klama portal_group = portal_group_new(conf, name); 5085c734b04SJakub Wojciech Klama } 5095c734b04SJakub Wojciech Klama 5105c734b04SJakub Wojciech Klama if (portal_group == NULL) 5115c734b04SJakub Wojciech Klama return (1); 5125c734b04SJakub Wojciech Klama 5135c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 5145c734b04SJakub Wojciech Klama key = ucl_object_key(obj); 5155c734b04SJakub Wojciech Klama 5165c734b04SJakub Wojciech Klama if (!strcmp(key, "discovery-auth-group")) { 5175c734b04SJakub Wojciech Klama portal_group->pg_discovery_auth_group = 5185c734b04SJakub Wojciech Klama auth_group_find(conf, ucl_object_tostring(obj)); 5195c734b04SJakub Wojciech Klama if (portal_group->pg_discovery_auth_group == NULL) { 5205c734b04SJakub Wojciech Klama log_warnx("unknown discovery-auth-group \"%s\" " 5215c734b04SJakub Wojciech Klama "for portal-group \"%s\"", 5225c734b04SJakub Wojciech Klama ucl_object_tostring(obj), 5235c734b04SJakub Wojciech Klama portal_group->pg_name); 5245c734b04SJakub Wojciech Klama return (1); 5255c734b04SJakub Wojciech Klama } 5265c734b04SJakub Wojciech Klama } 5275c734b04SJakub Wojciech Klama 5285c734b04SJakub Wojciech Klama if (!strcmp(key, "discovery-filter")) { 5295c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 5305c734b04SJakub Wojciech Klama log_warnx("\"discovery-filter\" property of " 5315c734b04SJakub Wojciech Klama "portal-group \"%s\" is not a string", 5325c734b04SJakub Wojciech Klama portal_group->pg_name); 5335c734b04SJakub Wojciech Klama return (1); 5345c734b04SJakub Wojciech Klama } 5355c734b04SJakub Wojciech Klama 5365c734b04SJakub Wojciech Klama if (portal_group_set_filter(portal_group, 5375c734b04SJakub Wojciech Klama ucl_object_tostring(obj)) != 0) 5385c734b04SJakub Wojciech Klama return (1); 5395c734b04SJakub Wojciech Klama } 5405c734b04SJakub Wojciech Klama 5415c734b04SJakub Wojciech Klama if (!strcmp(key, "listen")) { 5425c734b04SJakub Wojciech Klama if (obj->type == UCL_STRING) { 5435c734b04SJakub Wojciech Klama if (portal_group_add_listen(portal_group, 5445c734b04SJakub Wojciech Klama ucl_object_tostring(obj), false) != 0) 5455c734b04SJakub Wojciech Klama return (1); 5465c734b04SJakub Wojciech Klama } else if (obj->type == UCL_ARRAY) { 5475c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, 5485c734b04SJakub Wojciech Klama true))) { 5495c734b04SJakub Wojciech Klama if (portal_group_add_listen( 5505c734b04SJakub Wojciech Klama portal_group, 5515c734b04SJakub Wojciech Klama ucl_object_tostring(tmp), 5525c734b04SJakub Wojciech Klama false) != 0) 5535c734b04SJakub Wojciech Klama return (1); 5545c734b04SJakub Wojciech Klama } 5555c734b04SJakub Wojciech Klama } else { 5565c734b04SJakub Wojciech Klama log_warnx("\"listen\" property of " 5575c734b04SJakub Wojciech Klama "portal-group \"%s\" is not a string", 5585c734b04SJakub Wojciech Klama portal_group->pg_name); 5595c734b04SJakub Wojciech Klama return (1); 5605c734b04SJakub Wojciech Klama } 5615c734b04SJakub Wojciech Klama } 5625c734b04SJakub Wojciech Klama 5635c734b04SJakub Wojciech Klama if (!strcmp(key, "listen-iser")) { 5645c734b04SJakub Wojciech Klama if (obj->type == UCL_STRING) { 5655c734b04SJakub Wojciech Klama if (portal_group_add_listen(portal_group, 5665c734b04SJakub Wojciech Klama ucl_object_tostring(obj), true) != 0) 5675c734b04SJakub Wojciech Klama return (1); 5685c734b04SJakub Wojciech Klama } else if (obj->type == UCL_ARRAY) { 5695c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, 5705c734b04SJakub Wojciech Klama true))) { 5715c734b04SJakub Wojciech Klama if (portal_group_add_listen( 5725c734b04SJakub Wojciech Klama portal_group, 5735c734b04SJakub Wojciech Klama ucl_object_tostring(tmp), 5745c734b04SJakub Wojciech Klama true) != 0) 5755c734b04SJakub Wojciech Klama return (1); 5765c734b04SJakub Wojciech Klama } 5775c734b04SJakub Wojciech Klama } else { 5785c734b04SJakub Wojciech Klama log_warnx("\"listen\" property of " 5795c734b04SJakub Wojciech Klama "portal-group \"%s\" is not a string", 5805c734b04SJakub Wojciech Klama portal_group->pg_name); 5815c734b04SJakub Wojciech Klama return (1); 5825c734b04SJakub Wojciech Klama } 5835c734b04SJakub Wojciech Klama } 5845c734b04SJakub Wojciech Klama 5855c734b04SJakub Wojciech Klama if (!strcmp(key, "redirect")) { 5865c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 5875c734b04SJakub Wojciech Klama log_warnx("\"listen\" property of " 5885c734b04SJakub Wojciech Klama "portal-group \"%s\" is not a string", 5895c734b04SJakub Wojciech Klama portal_group->pg_name); 5905c734b04SJakub Wojciech Klama return (1); 5915c734b04SJakub Wojciech Klama } 5925c734b04SJakub Wojciech Klama 5935c734b04SJakub Wojciech Klama if (portal_group_set_redirection(portal_group, 5945c734b04SJakub Wojciech Klama ucl_object_tostring(obj)) != 0) 5955c734b04SJakub Wojciech Klama return (1); 5965c734b04SJakub Wojciech Klama } 5975c734b04SJakub Wojciech Klama 5985c734b04SJakub Wojciech Klama if (!strcmp(key, "options")) { 5995c734b04SJakub Wojciech Klama if (obj->type != UCL_OBJECT) { 6005c734b04SJakub Wojciech Klama log_warnx("\"options\" property of portal group " 6015c734b04SJakub Wojciech Klama "\"%s\" is not an object", portal_group->pg_name); 6025c734b04SJakub Wojciech Klama return (1); 6035c734b04SJakub Wojciech Klama } 6045c734b04SJakub Wojciech Klama 6055c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, 6065c734b04SJakub Wojciech Klama true))) { 6075c734b04SJakub Wojciech Klama option_new(&portal_group->pg_options, 6085c734b04SJakub Wojciech Klama ucl_object_key(tmp), 6095c734b04SJakub Wojciech Klama ucl_object_tostring_forced(tmp)); 6105c734b04SJakub Wojciech Klama } 6115c734b04SJakub Wojciech Klama } 61264ffe6d4SRichard Scheffenegger 61364ffe6d4SRichard Scheffenegger if (!strcmp(key, "dscp")) { 61464ffe6d4SRichard Scheffenegger if ((obj->type != UCL_STRING) && (obj->type != UCL_INT)) { 61564ffe6d4SRichard Scheffenegger log_warnx("\"dscp\" property of portal group " 61664ffe6d4SRichard Scheffenegger "\"%s\" is not a string or integer", portal_group->pg_name); 61764ffe6d4SRichard Scheffenegger return(1); 61864ffe6d4SRichard Scheffenegger } 61964ffe6d4SRichard Scheffenegger if (obj->type == UCL_INT) 62064ffe6d4SRichard Scheffenegger portal_group->pg_dscp = ucl_object_toint(obj); 62164ffe6d4SRichard Scheffenegger else { 62264ffe6d4SRichard Scheffenegger key = ucl_object_tostring(obj); 62364ffe6d4SRichard Scheffenegger if (strcmp(key, "0x") == 0) 62464ffe6d4SRichard Scheffenegger portal_group->pg_dscp = strtol(key + 2, NULL, 16); 62564ffe6d4SRichard Scheffenegger else if (strcmp(key, "be") || strcmp(key, "cs0")) 62664ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS0 >> 2; 62764ffe6d4SRichard Scheffenegger else if (strcmp(key, "ef")) 62864ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_EF >> 2; 62964ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs0")) 63064ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS0 >> 2; 63164ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs1")) 63264ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS1 >> 2; 63364ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs2")) 63464ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS2 >> 2; 63564ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs3")) 63664ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS3 >> 2; 63764ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs4")) 63864ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS4 >> 2; 63964ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs5")) 64064ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS5 >> 2; 64164ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs6")) 64264ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS6 >> 2; 64364ffe6d4SRichard Scheffenegger else if (strcmp(key, "cs7")) 64464ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_CS7 >> 2; 64564ffe6d4SRichard Scheffenegger else if (strcmp(key, "af11")) 64664ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF11 >> 2; 64764ffe6d4SRichard Scheffenegger else if (strcmp(key, "af12")) 64864ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF12 >> 2; 64964ffe6d4SRichard Scheffenegger else if (strcmp(key, "af13")) 65064ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF13 >> 2; 65164ffe6d4SRichard Scheffenegger else if (strcmp(key, "af21")) 65264ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF21 >> 2; 65364ffe6d4SRichard Scheffenegger else if (strcmp(key, "af22")) 65464ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF22 >> 2; 65564ffe6d4SRichard Scheffenegger else if (strcmp(key, "af23")) 65664ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF23 >> 2; 65764ffe6d4SRichard Scheffenegger else if (strcmp(key, "af31")) 65864ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF31 >> 2; 65964ffe6d4SRichard Scheffenegger else if (strcmp(key, "af32")) 66064ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF32 >> 2; 66164ffe6d4SRichard Scheffenegger else if (strcmp(key, "af33")) 66264ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF33 >> 2; 66364ffe6d4SRichard Scheffenegger else if (strcmp(key, "af41")) 66464ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF41 >> 2; 66564ffe6d4SRichard Scheffenegger else if (strcmp(key, "af42")) 66664ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF42 >> 2; 66764ffe6d4SRichard Scheffenegger else if (strcmp(key, "af43")) 66864ffe6d4SRichard Scheffenegger portal_group->pg_dscp = IPTOS_DSCP_AF43 >> 2; 66964ffe6d4SRichard Scheffenegger else { 67064ffe6d4SRichard Scheffenegger log_warnx("\"dscp\" property value is not a supported textual value"); 67164ffe6d4SRichard Scheffenegger return (1); 67264ffe6d4SRichard Scheffenegger } 67364ffe6d4SRichard Scheffenegger } 67464ffe6d4SRichard Scheffenegger } 675*ea8f1280SRichard Scheffenegger 676*ea8f1280SRichard Scheffenegger if (!strcmp(key, "pcp")) { 677*ea8f1280SRichard Scheffenegger if (obj->type != UCL_INT) { 678*ea8f1280SRichard Scheffenegger log_warnx("\"pcp\" property of portal group " 679*ea8f1280SRichard Scheffenegger "\"%s\" is not an integer", portal_group->pg_name); 680*ea8f1280SRichard Scheffenegger return(1); 681*ea8f1280SRichard Scheffenegger } 682*ea8f1280SRichard Scheffenegger portal_group->pg_pcp = ucl_object_toint(obj); 683*ea8f1280SRichard Scheffenegger if (!((portal_group->pg_pcp >= 0) && (portal_group->pg_pcp <= 7))) { 684*ea8f1280SRichard Scheffenegger log_warnx("invalid \"pcp\" value %d, using default", portal_group->pg_pcp); 685*ea8f1280SRichard Scheffenegger portal_group->pg_pcp = -1; 686*ea8f1280SRichard Scheffenegger } 687*ea8f1280SRichard Scheffenegger } 6885c734b04SJakub Wojciech Klama } 6895c734b04SJakub Wojciech Klama 6905c734b04SJakub Wojciech Klama return (0); 6915c734b04SJakub Wojciech Klama } 6925c734b04SJakub Wojciech Klama 6935c734b04SJakub Wojciech Klama static int 6945c734b04SJakub Wojciech Klama uclparse_target(const char *name, const ucl_object_t *top) 6955c734b04SJakub Wojciech Klama { 6965c734b04SJakub Wojciech Klama struct target *target; 6975c734b04SJakub Wojciech Klama ucl_object_iter_t it = NULL, it2 = NULL; 6985c734b04SJakub Wojciech Klama const ucl_object_t *obj = NULL, *tmp = NULL; 6995c734b04SJakub Wojciech Klama const char *key; 7005c734b04SJakub Wojciech Klama 7015c734b04SJakub Wojciech Klama target = target_new(conf, name); 702a6aeb2b6SBaptiste Daroussin if (target == NULL) 703a6aeb2b6SBaptiste Daroussin return (1); 7045c734b04SJakub Wojciech Klama 7055c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 7065c734b04SJakub Wojciech Klama key = ucl_object_key(obj); 7075c734b04SJakub Wojciech Klama 7085c734b04SJakub Wojciech Klama if (!strcmp(key, "alias")) { 7095c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 7105c734b04SJakub Wojciech Klama log_warnx("\"alias\" property of target " 7115c734b04SJakub Wojciech Klama "\"%s\" is not a string", target->t_name); 7125c734b04SJakub Wojciech Klama return (1); 7135c734b04SJakub Wojciech Klama } 7145c734b04SJakub Wojciech Klama 7155c734b04SJakub Wojciech Klama target->t_alias = strdup(ucl_object_tostring(obj)); 7165c734b04SJakub Wojciech Klama } 7175c734b04SJakub Wojciech Klama 7185c734b04SJakub Wojciech Klama if (!strcmp(key, "auth-group")) { 7195c734b04SJakub Wojciech Klama if (target->t_auth_group != NULL) { 7205c734b04SJakub Wojciech Klama if (target->t_auth_group->ag_name != NULL) 7215c734b04SJakub Wojciech Klama log_warnx("auth-group for target \"%s\" " 7225c734b04SJakub Wojciech Klama "specified more than once", 7235c734b04SJakub Wojciech Klama target->t_name); 7245c734b04SJakub Wojciech Klama else 7255c734b04SJakub Wojciech Klama log_warnx("cannot use both auth-group " 7265c734b04SJakub Wojciech Klama "and explicit authorisations for " 7275c734b04SJakub Wojciech Klama "target \"%s\"", target->t_name); 7285c734b04SJakub Wojciech Klama return (1); 7295c734b04SJakub Wojciech Klama } 7305c734b04SJakub Wojciech Klama target->t_auth_group = auth_group_find(conf, 7315c734b04SJakub Wojciech Klama ucl_object_tostring(obj)); 7325c734b04SJakub Wojciech Klama if (target->t_auth_group == NULL) { 7335c734b04SJakub Wojciech Klama log_warnx("unknown auth-group \"%s\" for target " 7345c734b04SJakub Wojciech Klama "\"%s\"", ucl_object_tostring(obj), 7355c734b04SJakub Wojciech Klama target->t_name); 7365c734b04SJakub Wojciech Klama return (1); 7375c734b04SJakub Wojciech Klama } 7385c734b04SJakub Wojciech Klama } 7395c734b04SJakub Wojciech Klama 7405c734b04SJakub Wojciech Klama if (!strcmp(key, "auth-type")) { 7415c734b04SJakub Wojciech Klama int error; 7425c734b04SJakub Wojciech Klama 7435c734b04SJakub Wojciech Klama if (target->t_auth_group != NULL) { 7445c734b04SJakub Wojciech Klama if (target->t_auth_group->ag_name != NULL) { 7455c734b04SJakub Wojciech Klama log_warnx("cannot use both auth-group and " 7465c734b04SJakub Wojciech Klama "auth-type for target \"%s\"", 7475c734b04SJakub Wojciech Klama target->t_name); 7485c734b04SJakub Wojciech Klama return (1); 7495c734b04SJakub Wojciech Klama } 7505c734b04SJakub Wojciech Klama } else { 7515c734b04SJakub Wojciech Klama target->t_auth_group = auth_group_new(conf, NULL); 7525c734b04SJakub Wojciech Klama if (target->t_auth_group == NULL) 7535c734b04SJakub Wojciech Klama return (1); 7545c734b04SJakub Wojciech Klama 7555c734b04SJakub Wojciech Klama target->t_auth_group->ag_target = target; 7565c734b04SJakub Wojciech Klama } 7575c734b04SJakub Wojciech Klama error = auth_group_set_type(target->t_auth_group, 7585c734b04SJakub Wojciech Klama ucl_object_tostring(obj)); 7595c734b04SJakub Wojciech Klama if (error != 0) 7605c734b04SJakub Wojciech Klama return (1); 7615c734b04SJakub Wojciech Klama } 7625c734b04SJakub Wojciech Klama 7635c734b04SJakub Wojciech Klama if (!strcmp(key, "chap")) { 7645c734b04SJakub Wojciech Klama if (uclparse_chap(target->t_auth_group, obj) != 0) 7655c734b04SJakub Wojciech Klama return (1); 7665c734b04SJakub Wojciech Klama } 7675c734b04SJakub Wojciech Klama 7685c734b04SJakub Wojciech Klama if (!strcmp(key, "chap-mutual")) { 7695c734b04SJakub Wojciech Klama if (uclparse_chap_mutual(target->t_auth_group, obj) != 0) 7705c734b04SJakub Wojciech Klama return (1); 7715c734b04SJakub Wojciech Klama } 7725c734b04SJakub Wojciech Klama 7735c734b04SJakub Wojciech Klama if (!strcmp(key, "initiator-name")) { 7745c734b04SJakub Wojciech Klama const struct auth_name *an; 7755c734b04SJakub Wojciech Klama 7765c734b04SJakub Wojciech Klama if (target->t_auth_group != NULL) { 7775c734b04SJakub Wojciech Klama if (target->t_auth_group->ag_name != NULL) { 7785c734b04SJakub Wojciech Klama log_warnx("cannot use both auth-group and " 7795c734b04SJakub Wojciech Klama "initiator-name for target \"%s\"", 7805c734b04SJakub Wojciech Klama target->t_name); 7815c734b04SJakub Wojciech Klama return (1); 7825c734b04SJakub Wojciech Klama } 7835c734b04SJakub Wojciech Klama } else { 7845c734b04SJakub Wojciech Klama target->t_auth_group = auth_group_new(conf, NULL); 7855c734b04SJakub Wojciech Klama if (target->t_auth_group == NULL) 7865c734b04SJakub Wojciech Klama return (1); 7875c734b04SJakub Wojciech Klama 7885c734b04SJakub Wojciech Klama target->t_auth_group->ag_target = target; 7895c734b04SJakub Wojciech Klama } 7905c734b04SJakub Wojciech Klama an = auth_name_new(target->t_auth_group, 7915c734b04SJakub Wojciech Klama ucl_object_tostring(obj)); 7925c734b04SJakub Wojciech Klama if (an == NULL) 7935c734b04SJakub Wojciech Klama return (1); 7945c734b04SJakub Wojciech Klama } 7955c734b04SJakub Wojciech Klama 7965c734b04SJakub Wojciech Klama if (!strcmp(key, "initiator-portal")) { 7975c734b04SJakub Wojciech Klama const struct auth_portal *ap; 7985c734b04SJakub Wojciech Klama 7995c734b04SJakub Wojciech Klama if (target->t_auth_group != NULL) { 8005c734b04SJakub Wojciech Klama if (target->t_auth_group->ag_name != NULL) { 8015c734b04SJakub Wojciech Klama log_warnx("cannot use both auth-group and " 8025c734b04SJakub Wojciech Klama "initiator-portal for target \"%s\"", 8035c734b04SJakub Wojciech Klama target->t_name); 8045c734b04SJakub Wojciech Klama return (1); 8055c734b04SJakub Wojciech Klama } 8065c734b04SJakub Wojciech Klama } else { 8075c734b04SJakub Wojciech Klama target->t_auth_group = auth_group_new(conf, NULL); 8085c734b04SJakub Wojciech Klama if (target->t_auth_group == NULL) 8095c734b04SJakub Wojciech Klama return (1); 8105c734b04SJakub Wojciech Klama 8115c734b04SJakub Wojciech Klama target->t_auth_group->ag_target = target; 8125c734b04SJakub Wojciech Klama } 8135c734b04SJakub Wojciech Klama ap = auth_portal_new(target->t_auth_group, 8145c734b04SJakub Wojciech Klama ucl_object_tostring(obj)); 8155c734b04SJakub Wojciech Klama if (ap == NULL) 8165c734b04SJakub Wojciech Klama return (1); 8175c734b04SJakub Wojciech Klama } 8185c734b04SJakub Wojciech Klama 8195c734b04SJakub Wojciech Klama if (!strcmp(key, "portal-group")) { 8205c734b04SJakub Wojciech Klama if (obj->type == UCL_OBJECT) { 8215c734b04SJakub Wojciech Klama if (uclparse_target_portal_group(target, obj) != 0) 8225c734b04SJakub Wojciech Klama return (1); 8235c734b04SJakub Wojciech Klama } 8245c734b04SJakub Wojciech Klama 8255c734b04SJakub Wojciech Klama if (obj->type == UCL_ARRAY) { 8265c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, 8275c734b04SJakub Wojciech Klama true))) { 8285c734b04SJakub Wojciech Klama if (uclparse_target_portal_group(target, 8295c734b04SJakub Wojciech Klama tmp) != 0) 8305c734b04SJakub Wojciech Klama return (1); 8315c734b04SJakub Wojciech Klama } 8325c734b04SJakub Wojciech Klama } 8335c734b04SJakub Wojciech Klama } 8345c734b04SJakub Wojciech Klama 8355c734b04SJakub Wojciech Klama if (!strcmp(key, "port")) { 8365c734b04SJakub Wojciech Klama struct pport *pp; 8375c734b04SJakub Wojciech Klama struct port *tp; 8385c734b04SJakub Wojciech Klama const char *value = ucl_object_tostring(obj); 8398951f055SMarcelo Araujo int ret, i_pp, i_vp = 0; 8408951f055SMarcelo Araujo 8418951f055SMarcelo Araujo ret = sscanf(value, "ioctl/%d/%d", &i_pp, &i_vp); 8428951f055SMarcelo Araujo if (ret > 0) { 8438951f055SMarcelo Araujo tp = port_new_ioctl(conf, target, i_pp, i_vp); 8448951f055SMarcelo Araujo if (tp == NULL) { 8458951f055SMarcelo Araujo log_warnx("can't create new ioctl port " 8468951f055SMarcelo Araujo "for target \"%s\"", target->t_name); 8478951f055SMarcelo Araujo return (1); 8488951f055SMarcelo Araujo } 8498951f055SMarcelo Araujo 8508951f055SMarcelo Araujo return (0); 8518951f055SMarcelo Araujo } 8525c734b04SJakub Wojciech Klama 8535c734b04SJakub Wojciech Klama pp = pport_find(conf, value); 8545c734b04SJakub Wojciech Klama if (pp == NULL) { 8555c734b04SJakub Wojciech Klama log_warnx("unknown port \"%s\" for target \"%s\"", 8565c734b04SJakub Wojciech Klama value, target->t_name); 8575c734b04SJakub Wojciech Klama return (1); 8585c734b04SJakub Wojciech Klama } 8595c734b04SJakub Wojciech Klama if (!TAILQ_EMPTY(&pp->pp_ports)) { 8605c734b04SJakub Wojciech Klama log_warnx("can't link port \"%s\" to target \"%s\", " 8615c734b04SJakub Wojciech Klama "port already linked to some target", 8625c734b04SJakub Wojciech Klama value, target->t_name); 8635c734b04SJakub Wojciech Klama return (1); 8645c734b04SJakub Wojciech Klama } 8655c734b04SJakub Wojciech Klama tp = port_new_pp(conf, target, pp); 8665c734b04SJakub Wojciech Klama if (tp == NULL) { 8675c734b04SJakub Wojciech Klama log_warnx("can't link port \"%s\" to target \"%s\"", 8685c734b04SJakub Wojciech Klama value, target->t_name); 8695c734b04SJakub Wojciech Klama return (1); 8705c734b04SJakub Wojciech Klama } 8715c734b04SJakub Wojciech Klama } 8725c734b04SJakub Wojciech Klama 8735c734b04SJakub Wojciech Klama if (!strcmp(key, "redirect")) { 8745c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 8755c734b04SJakub Wojciech Klama log_warnx("\"redirect\" property of target " 8765c734b04SJakub Wojciech Klama "\"%s\" is not a string", target->t_name); 8775c734b04SJakub Wojciech Klama return (1); 8785c734b04SJakub Wojciech Klama } 8795c734b04SJakub Wojciech Klama 8805c734b04SJakub Wojciech Klama if (target_set_redirection(target, 8815c734b04SJakub Wojciech Klama ucl_object_tostring(obj)) != 0) 8825c734b04SJakub Wojciech Klama return (1); 8835c734b04SJakub Wojciech Klama } 8845c734b04SJakub Wojciech Klama 8855c734b04SJakub Wojciech Klama if (!strcmp(key, "lun")) { 8865c734b04SJakub Wojciech Klama while ((tmp = ucl_iterate_object(obj, &it2, true))) { 8875c734b04SJakub Wojciech Klama if (uclparse_target_lun(target, tmp) != 0) 8885c734b04SJakub Wojciech Klama return (1); 8895c734b04SJakub Wojciech Klama } 8905c734b04SJakub Wojciech Klama } 8915c734b04SJakub Wojciech Klama } 8925c734b04SJakub Wojciech Klama 8935c734b04SJakub Wojciech Klama return (0); 8945c734b04SJakub Wojciech Klama } 8955c734b04SJakub Wojciech Klama 8965c734b04SJakub Wojciech Klama static int 8975c734b04SJakub Wojciech Klama uclparse_lun(const char *name, const ucl_object_t *top) 8985c734b04SJakub Wojciech Klama { 8995c734b04SJakub Wojciech Klama struct lun *lun; 9005c734b04SJakub Wojciech Klama ucl_object_iter_t it = NULL, child_it = NULL; 9015c734b04SJakub Wojciech Klama const ucl_object_t *obj = NULL, *child = NULL; 9025c734b04SJakub Wojciech Klama const char *key; 9035c734b04SJakub Wojciech Klama 9045c734b04SJakub Wojciech Klama lun = lun_new(conf, name); 905a6aeb2b6SBaptiste Daroussin if (lun == NULL) 906a6aeb2b6SBaptiste Daroussin return (1); 9075c734b04SJakub Wojciech Klama 9085c734b04SJakub Wojciech Klama while ((obj = ucl_iterate_object(top, &it, true))) { 9095c734b04SJakub Wojciech Klama key = ucl_object_key(obj); 9105c734b04SJakub Wojciech Klama 9115c734b04SJakub Wojciech Klama if (!strcmp(key, "backend")) { 9125c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 9135c734b04SJakub Wojciech Klama log_warnx("\"backend\" property of lun " 9145c734b04SJakub Wojciech Klama "\"%s\" is not a string", 9155c734b04SJakub Wojciech Klama lun->l_name); 9165c734b04SJakub Wojciech Klama return (1); 9175c734b04SJakub Wojciech Klama } 9185c734b04SJakub Wojciech Klama 9195c734b04SJakub Wojciech Klama lun_set_backend(lun, ucl_object_tostring(obj)); 9205c734b04SJakub Wojciech Klama } 9215c734b04SJakub Wojciech Klama 9225c734b04SJakub Wojciech Klama if (!strcmp(key, "blocksize")) { 9235c734b04SJakub Wojciech Klama if (obj->type != UCL_INT) { 9245c734b04SJakub Wojciech Klama log_warnx("\"blocksize\" property of lun " 9255c734b04SJakub Wojciech Klama "\"%s\" is not an integer", lun->l_name); 9265c734b04SJakub Wojciech Klama return (1); 9275c734b04SJakub Wojciech Klama } 9285c734b04SJakub Wojciech Klama 9295c734b04SJakub Wojciech Klama lun_set_blocksize(lun, ucl_object_toint(obj)); 9305c734b04SJakub Wojciech Klama } 9315c734b04SJakub Wojciech Klama 9325c734b04SJakub Wojciech Klama if (!strcmp(key, "device-id")) { 9335c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 9345c734b04SJakub Wojciech Klama log_warnx("\"device-id\" property of lun " 9355c734b04SJakub Wojciech Klama "\"%s\" is not an integer", lun->l_name); 9365c734b04SJakub Wojciech Klama return (1); 9375c734b04SJakub Wojciech Klama } 9385c734b04SJakub Wojciech Klama 9395c734b04SJakub Wojciech Klama lun_set_device_id(lun, ucl_object_tostring(obj)); 9405c734b04SJakub Wojciech Klama } 9415c734b04SJakub Wojciech Klama 9425c734b04SJakub Wojciech Klama if (!strcmp(key, "options")) { 9435c734b04SJakub Wojciech Klama if (obj->type != UCL_OBJECT) { 9445c734b04SJakub Wojciech Klama log_warnx("\"options\" property of lun " 9455c734b04SJakub Wojciech Klama "\"%s\" is not an object", lun->l_name); 9465c734b04SJakub Wojciech Klama return (1); 9475c734b04SJakub Wojciech Klama } 9485c734b04SJakub Wojciech Klama 9495c734b04SJakub Wojciech Klama while ((child = ucl_iterate_object(obj, &child_it, 9505c734b04SJakub Wojciech Klama true))) { 9515c734b04SJakub Wojciech Klama option_new(&lun->l_options, 9525c734b04SJakub Wojciech Klama ucl_object_key(child), 9535c734b04SJakub Wojciech Klama ucl_object_tostring_forced(child)); 9545c734b04SJakub Wojciech Klama } 9555c734b04SJakub Wojciech Klama } 9565c734b04SJakub Wojciech Klama 9575c734b04SJakub Wojciech Klama if (!strcmp(key, "path")) { 9585c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 9595c734b04SJakub Wojciech Klama log_warnx("\"path\" property of lun " 9605c734b04SJakub Wojciech Klama "\"%s\" is not a string", lun->l_name); 9615c734b04SJakub Wojciech Klama return (1); 9625c734b04SJakub Wojciech Klama } 9635c734b04SJakub Wojciech Klama 9645c734b04SJakub Wojciech Klama lun_set_path(lun, ucl_object_tostring(obj)); 9655c734b04SJakub Wojciech Klama } 9665c734b04SJakub Wojciech Klama 9675c734b04SJakub Wojciech Klama if (!strcmp(key, "serial")) { 9685c734b04SJakub Wojciech Klama if (obj->type != UCL_STRING) { 9695c734b04SJakub Wojciech Klama log_warnx("\"serial\" property of lun " 9705c734b04SJakub Wojciech Klama "\"%s\" is not a string", lun->l_name); 9715c734b04SJakub Wojciech Klama return (1); 9725c734b04SJakub Wojciech Klama } 9735c734b04SJakub Wojciech Klama 9745c734b04SJakub Wojciech Klama lun_set_serial(lun, ucl_object_tostring(obj)); 9755c734b04SJakub Wojciech Klama } 9765c734b04SJakub Wojciech Klama 9775c734b04SJakub Wojciech Klama if (!strcmp(key, "size")) { 9785c734b04SJakub Wojciech Klama if (obj->type != UCL_INT) { 9795c734b04SJakub Wojciech Klama log_warnx("\"size\" property of lun " 9805c734b04SJakub Wojciech Klama "\"%s\" is not an integer", lun->l_name); 9815c734b04SJakub Wojciech Klama return (1); 9825c734b04SJakub Wojciech Klama } 9835c734b04SJakub Wojciech Klama 9845c734b04SJakub Wojciech Klama lun_set_size(lun, ucl_object_toint(obj)); 9855c734b04SJakub Wojciech Klama } 9865c734b04SJakub Wojciech Klama } 9875c734b04SJakub Wojciech Klama 9885c734b04SJakub Wojciech Klama return (0); 9895c734b04SJakub Wojciech Klama } 9905c734b04SJakub Wojciech Klama 9915c734b04SJakub Wojciech Klama int 9925c734b04SJakub Wojciech Klama uclparse_conf(struct conf *newconf, const char *path) 9935c734b04SJakub Wojciech Klama { 9945c734b04SJakub Wojciech Klama struct ucl_parser *parser; 995dd8b877eSMark Johnston ucl_object_t *top; 9965c734b04SJakub Wojciech Klama int error; 9975c734b04SJakub Wojciech Klama 9985c734b04SJakub Wojciech Klama conf = newconf; 9995c734b04SJakub Wojciech Klama parser = ucl_parser_new(0); 10005c734b04SJakub Wojciech Klama 1001bb3844b3SJakub Wojciech Klama if (!ucl_parser_add_file(parser, path)) { 10025c734b04SJakub Wojciech Klama log_warn("unable to parse configuration file %s: %s", path, 10035c734b04SJakub Wojciech Klama ucl_parser_get_error(parser)); 1004dd8b877eSMark Johnston ucl_parser_free(parser); 10055c734b04SJakub Wojciech Klama return (1); 10065c734b04SJakub Wojciech Klama } 10075c734b04SJakub Wojciech Klama 1008dd8b877eSMark Johnston top = ucl_parser_get_object(parser); 1009dd8b877eSMark Johnston error = uclparse_toplevel(top); 1010dd8b877eSMark Johnston ucl_object_unref(top); 1011dd8b877eSMark Johnston ucl_parser_free(parser); 10125c734b04SJakub Wojciech Klama 10135c734b04SJakub Wojciech Klama return (error); 10145c734b04SJakub Wojciech Klama } 1015