Deleted Added
sdiff udiff text old ( 279006 ) new ( 279055 )
full compact
1/*-
2 * Copyright (c) 2012 The FreeBSD Foundation
3 * All rights reserved.
4 *
5 * This software was developed by Edward Tomasz Napierala under sponsorship
6 * from the FreeBSD Foundation.
7 *
8 * Redistribution and use in source and binary forms, with or without

--- 15 unchanged lines hidden (view full) ---

24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 */
30
31#include <sys/cdefs.h>
32__FBSDID("$FreeBSD: stable/10/usr.sbin/ctld/ctld.c 279055 2015-02-20 17:09:49Z mav $");
33
34#include <sys/types.h>
35#include <sys/time.h>
36#include <sys/socket.h>
37#include <sys/wait.h>
38#include <netinet/in.h>
39#include <arpa/inet.h>
40#include <assert.h>

--- 47 unchanged lines hidden (view full) ---

88 conf = calloc(1, sizeof(*conf));
89 if (conf == NULL)
90 log_err(1, "calloc");
91 TAILQ_INIT(&conf->conf_luns);
92 TAILQ_INIT(&conf->conf_targets);
93 TAILQ_INIT(&conf->conf_auth_groups);
94 TAILQ_INIT(&conf->conf_ports);
95 TAILQ_INIT(&conf->conf_portal_groups);
96 TAILQ_INIT(&conf->conf_pports);
97 TAILQ_INIT(&conf->conf_isns);
98
99 conf->conf_isns_period = 900;
100 conf->conf_isns_timeout = 5;
101 conf->conf_debug = 0;
102 conf->conf_timeout = 60;
103 conf->conf_maxproc = 30;
104
105 return (conf);
106}
107
108void
109conf_delete(struct conf *conf)
110{
111 struct lun *lun, *ltmp;
112 struct target *targ, *tmp;
113 struct auth_group *ag, *cagtmp;
114 struct portal_group *pg, *cpgtmp;
115 struct pport *pp, *pptmp;
116 struct isns *is, *istmp;
117
118 assert(conf->conf_pidfh == NULL);
119
120 TAILQ_FOREACH_SAFE(lun, &conf->conf_luns, l_next, ltmp)
121 lun_delete(lun);
122 TAILQ_FOREACH_SAFE(targ, &conf->conf_targets, t_next, tmp)
123 target_delete(targ);
124 TAILQ_FOREACH_SAFE(ag, &conf->conf_auth_groups, ag_next, cagtmp)
125 auth_group_delete(ag);
126 TAILQ_FOREACH_SAFE(pg, &conf->conf_portal_groups, pg_next, cpgtmp)
127 portal_group_delete(pg);
128 TAILQ_FOREACH_SAFE(pp, &conf->conf_pports, pp_next, pptmp)
129 pport_delete(pp);
130 TAILQ_FOREACH_SAFE(is, &conf->conf_isns, i_next, istmp)
131 isns_delete(is);
132 assert(TAILQ_EMPTY(&conf->conf_ports));
133 free(conf->conf_pidfile_path);
134 free(conf);
135}
136
137static struct auth *

--- 994 unchanged lines hidden (view full) ---

1132 } else {
1133 log_warnx("invalid target name \"%s\"; should start with "
1134 "either \".iqn\", \"eui.\", or \"naa.\"",
1135 name);
1136 }
1137 return (true);
1138}
1139
1140struct pport *
1141pport_new(struct conf *conf, const char *name, uint32_t ctl_port)
1142{
1143 struct pport *pp;
1144
1145 pp = calloc(1, sizeof(*pp));
1146 if (pp == NULL)
1147 log_err(1, "calloc");
1148 pp->pp_conf = conf;
1149 pp->pp_name = checked_strdup(name);
1150 pp->pp_ctl_port = ctl_port;
1151 TAILQ_INIT(&pp->pp_ports);
1152 TAILQ_INSERT_TAIL(&conf->conf_pports, pp, pp_next);
1153 return (pp);
1154}
1155
1156struct pport *
1157pport_find(const struct conf *conf, const char *name)
1158{
1159 struct pport *pp;
1160
1161 TAILQ_FOREACH(pp, &conf->conf_pports, pp_next) {
1162 if (strcasecmp(pp->pp_name, name) == 0)
1163 return (pp);
1164 }
1165 return (NULL);
1166}
1167
1168struct pport *
1169pport_copy(struct pport *pp, struct conf *conf)
1170{
1171 struct pport *ppnew;
1172
1173 ppnew = pport_new(conf, pp->pp_name, pp->pp_ctl_port);
1174 return (ppnew);
1175}
1176
1177void
1178pport_delete(struct pport *pp)
1179{
1180 struct port *port, *tport;
1181
1182 TAILQ_FOREACH_SAFE(port, &pp->pp_ports, p_ts, tport)
1183 port_delete(port);
1184 TAILQ_REMOVE(&pp->pp_conf->conf_pports, pp, pp_next);
1185 free(pp->pp_name);
1186 free(pp);
1187}
1188
1189struct port *
1190port_new(struct conf *conf, struct target *target, struct portal_group *pg)
1191{
1192 struct port *port;
1193 char *name;
1194
1195 asprintf(&name, "%s-%s", pg->pg_name, target->t_name);
1196 if (port_find(conf, name) != NULL) {
1197 log_warnx("duplicate port \"%s\"", name);
1198 free(name);
1199 return (NULL);
1200 }
1201 port = calloc(1, sizeof(*port));
1202 if (port == NULL)
1203 log_err(1, "calloc");
1204 port->p_conf = conf;
1205 port->p_name = name;
1206 TAILQ_INSERT_TAIL(&conf->conf_ports, port, p_next);
1207 TAILQ_INSERT_TAIL(&target->t_ports, port, p_ts);
1208 port->p_target = target;
1209 TAILQ_INSERT_TAIL(&pg->pg_ports, port, p_pgs);
1210 port->p_portal_group = pg;
1211 return (port);
1212}
1213
1214struct port *
1215port_new_pp(struct conf *conf, struct target *target, struct pport *pp)
1216{
1217 struct port *port;
1218 char *name;
1219
1220 asprintf(&name, "%s-%s", pp->pp_name, target->t_name);
1221 if (port_find(conf, name) != NULL) {
1222 log_warnx("duplicate port \"%s\"", name);
1223 free(name);
1224 return (NULL);
1225 }
1226 port = calloc(1, sizeof(*port));
1227 if (port == NULL)
1228 log_err(1, "calloc");
1229 port->p_conf = conf;
1230 port->p_name = name;
1231 TAILQ_INSERT_TAIL(&conf->conf_ports, port, p_next);
1232 TAILQ_INSERT_TAIL(&target->t_ports, port, p_ts);
1233 port->p_target = target;
1234 TAILQ_INSERT_TAIL(&pp->pp_ports, port, p_pps);
1235 port->p_pport = pp;
1236 return (port);
1237}
1238
1239struct port *
1240port_find(const struct conf *conf, const char *name)
1241{
1242 struct port *port;
1243
1244 TAILQ_FOREACH(port, &conf->conf_ports, p_next) {
1245 if (strcasecmp(port->p_name, name) == 0)
1246 return (port);
1247 }

--- 15 unchanged lines hidden (view full) ---

1263}
1264
1265void
1266port_delete(struct port *port)
1267{
1268
1269 if (port->p_portal_group)
1270 TAILQ_REMOVE(&port->p_portal_group->pg_ports, port, p_pgs);
1271 if (port->p_pport)
1272 TAILQ_REMOVE(&port->p_pport->pp_ports, port, p_pps);
1273 if (port->p_target)
1274 TAILQ_REMOVE(&port->p_target->t_ports, port, p_ts);
1275 TAILQ_REMOVE(&port->p_conf->conf_ports, port, p_next);
1276 free(port->p_name);
1277 free(port);
1278}
1279
1280struct target *

--- 557 unchanged lines hidden (view full) ---

1838 /*
1839 * First, remove any ports present in the old configuration
1840 * and missing in the new one.
1841 */
1842 TAILQ_FOREACH_SAFE(oldport, &oldconf->conf_ports, p_next, tmpport) {
1843 newport = port_find(newconf, oldport->p_name);
1844 if (newport != NULL)
1845 continue;
1846 log_debugx("removing port \"%s\"", oldport->p_name);
1847 error = kernel_port_remove(oldport);
1848 if (error != 0) {
1849 log_warnx("failed to remove port %s",
1850 oldport->p_name);
1851 /*
1852 * XXX: Uncomment after fixing the root cause.
1853 *
1854 * cumulated_error++;

--- 108 unchanged lines hidden (view full) ---

1963
1964 /*
1965 * Now add new ports or modify existing ones.
1966 */
1967 TAILQ_FOREACH(newport, &newconf->conf_ports, p_next) {
1968 oldport = port_find(oldconf, newport->p_name);
1969
1970 if (oldport == NULL) {
1971 log_debugx("adding port \"%s\"", newport->p_name);
1972 error = kernel_port_add(newport);
1973 } else {
1974 log_debugx("updating port \"%s\"", newport->p_name);
1975 newport->p_ctl_port = oldport->p_ctl_port;
1976 error = kernel_port_update(newport);
1977 }
1978 if (error != 0) {
1979 log_warnx("failed to %s port %s",
1980 (oldport == NULL) ? "add" : "update",
1981 newport->p_name);
1982 /*

--- 495 unchanged lines hidden (view full) ---

2478 argc -= optind;
2479 if (argc != 0)
2480 usage();
2481
2482 log_init(debug);
2483 kernel_init();
2484
2485 oldconf = conf_new_from_kernel();
2486 newconf = conf_new_from_file(config_path, oldconf);
2487 if (newconf == NULL)
2488 log_errx(1, "configuration error; exiting");
2489 if (debug > 0) {
2490 oldconf->conf_debug = debug;
2491 newconf->conf_debug = debug;
2492 }
2493
2494 error = conf_apply(oldconf, newconf);

--- 18 unchanged lines hidden (view full) ---

2513 if (!TAILQ_EMPTY(&newconf->conf_isns))
2514 set_timeout((newconf->conf_isns_period + 2) / 3, false);
2515
2516 for (;;) {
2517 main_loop(newconf, dont_daemonize);
2518 if (sighup_received) {
2519 sighup_received = false;
2520 log_debugx("received SIGHUP, reloading configuration");
2521 tmpconf = conf_new_from_file(config_path, newconf);
2522 if (tmpconf == NULL) {
2523 log_warnx("configuration error, "
2524 "continuing with old configuration");
2525 } else {
2526 if (debug > 0)
2527 tmpconf->conf_debug = debug;
2528 oldconf = newconf;
2529 newconf = tmpconf;

--- 44 unchanged lines hidden ---