xref: /freebsd/usr.sbin/ctld/uclparse.c (revision ea8f1280a206a662b8afb343522adf5cc34e4569)
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