Lines Matching +full:cs +full:- +full:on +full:- +full:ns

1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
137 struct cfstring *s, *vs, *ns; in load_config() local
142 parse_config(cfname, !strcmp(cfname, "-")); in load_config()
148 j->seq = ++jseq; in load_config()
149 if (wild_jail_name(j->name)) in load_config()
156 TAILQ_CONCAT(&opp, &j->params, tq); in load_config()
159 * though they may also be explicitly set later on. After we in load_config()
164 strtol(j->name, &ep, 10) && !*ep ? KP_JID : KP_NAME, in load_config()
165 j->name); in load_config()
173 if (j->seq < wj->seq && !did_self) { in load_config()
178 if (wild_jail_match(j->name, wj->name)) in load_config()
179 TAILQ_FOREACH(p, &wj->params, tq) in load_config()
191 if (j->intparams[KP_NAME] == NULL) in load_config()
192 add_param(j, NULL, KP_NAME, j->name); in load_config()
196 TAILQ_FOREACH(p, &j->params, tq) { in load_config()
197 p->gen = ++pgen; in load_config()
199 TAILQ_FOREACH(s, &p->val, tq) { in load_config()
200 while ((v = STAILQ_FIRST(&s->vars))) { in load_config()
201 TAILQ_FOREACH(vp, &j->params, tq) in load_config()
202 if (!strcmp(vp->name, v->name)) in load_config()
204 if (!vp || TAILQ_EMPTY(&vp->val)) { in load_config()
207 p->name, v->name); in load_config()
209 j->flags |= JF_FAILED; in load_config()
210 TAILQ_FOREACH(vp, &j->params, tq) in load_config()
211 if (vp->gen == pgen) in load_config()
212 vp->flags |= PF_BAD; in load_config()
215 if (vp->flags & PF_BAD) in load_config()
217 if (vp->gen == pgen) { in load_config()
219 v->name); in load_config()
222 TAILQ_FOREACH(vs, &vp->val, tq) in load_config()
223 if (!STAILQ_EMPTY(&vs->vars)) { in load_config()
224 vp->gen = pgen; in load_config()
225 TAILQ_REMOVE(&j->params, vp, in load_config()
231 vs = TAILQ_FIRST(&vp->val); in load_config()
233 (s->s[0] != '\0' || in load_config()
237 p->name); in load_config()
240 s->s = erealloc(s->s, s->len + vs->len + 1); in load_config()
241 memmove(s->s + v->pos + vs->len, in load_config()
242 s->s + v->pos, in load_config()
243 s->len - v->pos + 1); in load_config()
244 memcpy(s->s + v->pos, vs->s, vs->len); in load_config()
247 vv->pos += vs->len; in load_config()
248 s->len += vs->len; in load_config()
250 ns = emalloc(sizeof(struct cfstring)); in load_config()
251 ns->s = estrdup(vs->s); in load_config()
252 ns->len = vs->len; in load_config()
253 STAILQ_INIT(&ns->vars); in load_config()
254 TAILQ_INSERT_AFTER(&p->val, s, ns, tq); in load_config()
255 s = ns; in load_config()
258 free(v->name); in load_config()
259 STAILQ_REMOVE_HEAD(&s->vars, tq); in load_config()
268 TAILQ_FOREACH_SAFE(p, &j->params, tq, tp) in load_config()
269 if (p->flags & PF_VAR) in load_config()
270 free_param(&j->params, p); in load_config()
273 free(wj->name); in load_config()
274 while ((p = TAILQ_FIRST(&wj->params))) in load_config()
275 free_param(&wj->params, p); in load_config()
291 /* Base relative pathnames on the current config file. */ in include_config()
293 const char *outer_cfname = yyget_extra(scanner)->cfname; in include_config()
295 size_t dirlen = (slash - outer_cfname) + 1; in include_config()
305 * Globbing doesn't need to catch any files, but a non-glob in include_config()
317 --depth; in include_config()
351 TAILQ_INIT(&j->params); in add_jail()
352 STAILQ_INIT(&j->dep[DEP_FROM]); in add_jail()
353 STAILQ_INIT(&j->dep[DEP_TO]); in add_jail()
354 j->queue = &cfjails; in add_jail()
368 struct cfstring *s, *ns; in add_param() local
371 char *cs, *tname; in add_param() local
382 name = p->name; in add_param()
383 flags = p->flags; in add_param()
388 TAILQ_FOREACH(s, &p->val, tq) { in add_param()
389 ns = emalloc(sizeof(struct cfstring)); in add_param()
390 ns->s = estrdup(s->s); in add_param()
391 ns->len = s->len; in add_param()
392 STAILQ_INIT(&ns->vars); in add_param()
393 STAILQ_FOREACH(v, &s->vars, tq) { in add_param()
395 nv->name = strdup(v->name); in add_param()
396 nv->pos = v->pos; in add_param()
397 STAILQ_INSERT_TAIL(&ns->vars, nv, tq); in add_param()
399 TAILQ_INSERT_TAIL(&nss, ns, tq); in add_param()
406 } else if ((cs = strchr(value, '='))) { in add_param()
407 tname = alloca(cs - value + 1); in add_param()
408 strlcpy(tname, value, cs - value + 1); in add_param()
410 value = cs + 1; in add_param()
416 ns = emalloc(sizeof(struct cfstring)); in add_param()
417 ns->s = estrdup(value); in add_param()
418 ns->len = strlen(value); in add_param()
419 STAILQ_INIT(&ns->vars); in add_param()
420 TAILQ_INSERT_TAIL(&nss, ns, tq); in add_param()
426 dp = j->intparams[ipnum]; in add_param()
428 TAILQ_FOREACH(dp, &j->params, tq) in add_param()
429 if (!(dp->flags & PF_CONV) && equalopts(dp->name, name)) in add_param()
432 /* Found it - append or replace. */ in add_param()
433 if ((flags ^ dp->flags) & PF_VAR) { in add_param()
436 j->flags |= JF_FAILED; in add_param()
439 if (dp->flags & PF_IMMUTABLE) { in add_param()
441 dp->name); in add_param()
442 j->flags |= JF_FAILED; in add_param()
445 if (strcmp(dp->name, name)) { in add_param()
446 free(dp->name); in add_param()
447 dp->name = estrdup(name); in add_param()
451 TAILQ_CONCAT(&dp->val, &nss, tq); in add_param()
452 dp->flags |= flags; in add_param()
454 /* Not found - add it. */ in add_param()
456 np->name = estrdup(name); in add_param()
457 TAILQ_INIT(&np->val); in add_param()
458 TAILQ_CONCAT(&np->val, &nss, tq); in add_param()
459 np->flags = flags; in add_param()
460 np->gen = 0; in add_param()
461 TAILQ_INSERT_TAIL(&j->params, np, tq); in add_param()
463 j->intparams[ipnum] = np; in add_param()
474 j->flags |= JF_FAILED; in add_param()
477 j->intparams[ipnum] = np; in add_param()
478 np->flags |= intparams[ipnum].flags; in add_param()
490 const char *cs; in bool_param() local
494 cs = strrchr(p->name, '.'); in bool_param()
495 return !strncmp(cs ? cs + 1 : p->name, "no", 2) ^ in bool_param()
496 (TAILQ_EMPTY(&p->val) || in bool_param()
497 !strcasecmp(TAILQ_LAST(&p->val, cfstrings)->s, "true") || in bool_param()
498 (strtol(TAILQ_LAST(&p->val, cfstrings)->s, NULL, 10))); in bool_param()
507 if (p == NULL || TAILQ_EMPTY(&p->val)) in int_param()
509 *ip = strtol(TAILQ_LAST(&p->val, cfstrings)->s, NULL, 10); in int_param()
519 return (p && !TAILQ_EMPTY(&p->val) in string_param()
520 ? TAILQ_LAST(&p->val, cfstrings)->s : NULL); in string_param()
525 * parameters based on the values of others.
534 char *cs, *ep, *ln; in check_intparams() local
556 TAILQ_FOREACH(p, &j->params, tq) { in check_intparams()
557 if (!TAILQ_EMPTY(&p->val) && (p->flags & (PF_BOOL | PF_INT))) { in check_intparams()
558 val = TAILQ_LAST(&p->val, cfstrings)->s; in check_intparams()
559 if (p->flags & PF_BOOL) { in check_intparams()
565 p->name, val); in check_intparams()
566 error = -1; in check_intparams()
572 "%s: non-integer value \"%s\"", in check_intparams()
573 p->name, val); in check_intparams()
574 error = -1; in check_intparams()
585 if (((j->flags & JF_OP_MASK) != JF_STOP || in check_intparams()
586 j->intparams[IP_INTERFACE] != NULL) && in check_intparams()
587 bool_param(j->intparams[IP_IP_HOSTNAME]) && in check_intparams()
588 (hostname = string_param(j->intparams[KP_HOST_HOSTNAME]))) { in check_intparams()
589 j->intparams[IP_IP_HOSTNAME] = NULL; in check_intparams()
624 error = -1; in check_intparams()
631 for (ai = ai0; ai; ai = ai->ai_next) in check_intparams()
632 switch (ai->ai_family) { in check_intparams()
637 (void *)ai->ai_addr)-> in check_intparams()
651 (void *)ai->ai_addr)-> in check_intparams()
668 * IP addresses may include an interface to set that address on, in check_intparams()
671 * so they won't be passed on to jailparam_set. in check_intparams()
673 defif = string_param(j->intparams[IP_INTERFACE]) != NULL; in check_intparams()
675 if (j->intparams[KP_IP4_ADDR] != NULL) { in check_intparams()
676 TAILQ_FOREACH(s, &j->intparams[KP_IP4_ADDR]->val, tq) { in check_intparams()
677 cs = strchr(s->s, '|'); in check_intparams()
678 if (cs || defif) in check_intparams()
679 add_param(j, NULL, IP__IP4_IFADDR, s->s); in check_intparams()
680 if (cs) { in check_intparams()
681 s->len -= cs + 1 - s->s; in check_intparams()
682 memmove(s->s, cs + 1, s->len + 1); in check_intparams()
684 if ((cs = strchr(s->s, '/')) != NULL) { in check_intparams()
685 *cs = '\0'; in check_intparams()
686 s->len = cs - s->s; in check_intparams()
688 if ((cs = strchr(s->s, ' ')) != NULL) { in check_intparams()
689 *cs = '\0'; in check_intparams()
690 s->len = cs - s->s; in check_intparams()
696 if (j->intparams[KP_IP6_ADDR] != NULL) { in check_intparams()
697 TAILQ_FOREACH(s, &j->intparams[KP_IP6_ADDR]->val, tq) { in check_intparams()
698 cs = strchr(s->s, '|'); in check_intparams()
699 if (cs || defif) in check_intparams()
700 add_param(j, NULL, IP__IP6_IFADDR, s->s); in check_intparams()
701 if (cs) { in check_intparams()
702 s->len -= cs + 1 - s->s; in check_intparams()
703 memmove(s->s, cs + 1, s->len + 1); in check_intparams()
705 if ((cs = strchr(s->s, '/')) != NULL) { in check_intparams()
706 *cs = '\0'; in check_intparams()
707 s->len = cs - s->s; in check_intparams()
709 if ((cs = strchr(s->s, ' ')) != NULL) { in check_intparams()
710 *cs = '\0'; in check_intparams()
711 s->len = cs - s->s; in check_intparams()
722 if (j->intparams[IP_MOUNT_FSTAB] != NULL) { in check_intparams()
723 TAILQ_FOREACH(s, &j->intparams[IP_MOUNT_FSTAB]->val, tq) { in check_intparams()
724 if (s->len == 0) in check_intparams()
726 f = fopen(s->s, "r"); in check_intparams()
729 s->s, strerror(errno)); in check_intparams()
730 error = -1; in check_intparams()
734 if ((cs = memchr(ln, '#', lnlen - 1))) in check_intparams()
735 lnlen = cs - ln + 1; in check_intparams()
736 if (ln[lnlen - 1] == '\n' || in check_intparams()
737 ln[lnlen - 1] == '#') in check_intparams()
738 ln[lnlen - 1] = '\0'; in check_intparams()
740 cs = alloca(lnlen + 1); in check_intparams()
741 strlcpy(cs, ln, lnlen + 1); in check_intparams()
742 ln = cs; in check_intparams()
763 char *value, *cs; in import_params() local
768 j->njp = 0; in import_params()
769 TAILQ_FOREACH(p, &j->params, tq) in import_params()
770 if (!(p->flags & PF_INTERNAL)) in import_params()
771 j->njp++; in import_params()
772 j->jp = jp = emalloc(j->njp * sizeof(struct jailparam)); in import_params()
773 TAILQ_FOREACH(p, &j->params, tq) { in import_params()
774 if (p->flags & PF_INTERNAL) in import_params()
776 if (jailparam_init(jp, p->name) < 0) { in import_params()
777 error = -1; in import_params()
782 if (TAILQ_EMPTY(&p->val)) in import_params()
784 else if (!jp->jp_elemlen || in import_params()
785 !TAILQ_NEXT(TAILQ_FIRST(&p->val), tq)) { in import_params()
790 * arrays wthout pre-checking the type. in import_params()
792 value = TAILQ_LAST(&p->val, cfstrings)->s; in import_params()
795 * Convert arrays into comma-separated strings, which in import_params()
799 TAILQ_FOREACH(s, &p->val, tq) in import_params()
800 vallen += s->len + 1; in import_params()
802 cs = value; in import_params()
803 TAILQ_FOREACH_SAFE(s, &p->val, tq, ts) { in import_params()
804 memcpy(cs, s->s, s->len); in import_params()
805 cs += s->len + 1; in import_params()
806 cs[-1] = ','; in import_params()
808 value[vallen - 1] = '\0'; in import_params()
811 error = -1; in import_params()
817 jailparam_free(j->jp, j->njp); in import_params()
818 free(j->jp); in import_params()
819 j->jp = NULL; in import_params()
843 !strncmp(opt1, opt2, ++p - opt1)) { in equalopts()
844 opt2 += p - opt1; in equalopts()
865 * A non-final "*" component in the wild name matches a single jail in wild_jail_match()
871 if (strncmp(jc, wc, jd - jc + 1) && strncmp(wc, "*.", 2)) in wild_jail_match()
885 if ((wc == wname || wc[-1] == '.') && in wild_jail_name()
897 free(p->name); in free_param()
909 while ((s = TAILQ_FIRST(&p->val))) { in free_param_strings()
910 free(s->s); in free_param_strings()
911 while ((v = STAILQ_FIRST(&s->vars))) { in free_param_strings()
912 free(v->name); in free_param_strings()
913 STAILQ_REMOVE_HEAD(&s->vars, tq); in free_param_strings()
916 TAILQ_REMOVE(&p->val, s, tq); in free_param_strings()