Allow "local" filenames. e.g.
[freeradius.git] / src / main / conffile.c
1 /*
2  * conffile.c   Read the radiusd.conf file.
3  *
4  *              Yep I should learn to use lex & yacc, or at least
5  *              write a decent parser. I know how to do that, really :)
6  *              miquels@cistron.nl
7  *
8  * Version:     $Id$
9  *
10  *   This program is free software; you can redistribute it and/or modify
11  *   it under the terms of the GNU General Public License as published by
12  *   the Free Software Foundation; either version 2 of the License, or
13  *   (at your option) any later version.
14  *
15  *   This program is distributed in the hope that it will be useful,
16  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
17  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  *   GNU General Public License for more details.
19  *
20  *   You should have received a copy of the GNU General Public License
21  *   along with this program; if not, write to the Free Software
22  *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23  *
24  * Copyright 2000,2006  The FreeRADIUS server project
25  * Copyright 2000  Miquel van Smoorenburg <miquels@cistron.nl>
26  * Copyright 2000  Alan DeKok <aland@ox.org>
27  */
28
29 #include <freeradius-devel/ident.h>
30 RCSID("$Id$")
31
32 #include <freeradius-devel/radiusd.h>
33 #include <freeradius-devel/rad_assert.h>
34
35 #ifdef HAVE_DIRENT_H
36 #include <dirent.h>
37
38 #ifdef HAVE_SYS_STAT_H
39 #include <sys/stat.h>
40 #endif
41 #endif
42
43 #include <ctype.h>
44
45 typedef enum conf_type {
46         CONF_ITEM_INVALID = 0,
47         CONF_ITEM_PAIR,
48         CONF_ITEM_SECTION,
49         CONF_ITEM_DATA
50 } CONF_ITEM_TYPE;
51
52 struct conf_item {
53         struct conf_item *next;
54         struct conf_part *parent;
55         int lineno;
56         const char *filename;
57         CONF_ITEM_TYPE type;
58 };
59 struct conf_pair {
60         CONF_ITEM item;
61         char *attr;
62         char *value;
63         LRAD_TOKEN operator;
64         LRAD_TOKEN value_type;
65 };
66 struct conf_part {
67         CONF_ITEM item;
68         const char *name1;
69         const char *name2;
70         struct conf_item *children;
71         struct conf_item *tail; /* for speed */
72         CONF_SECTION    *template;
73         rbtree_t        *pair_tree; /* and a partridge.. */
74         rbtree_t        *section_tree; /* no jokes here */
75         rbtree_t        *name2_tree; /* for sections of the same name2 */
76         rbtree_t        *data_tree;
77         void            *base;
78         int depth;
79         const CONF_PARSER *variables;
80 };
81
82
83 /*
84  *      Internal data that is associated with a configuration section,
85  *      so that we don't have to track it separately.
86  */
87 struct conf_data {
88         CONF_ITEM  item;
89         const char *name;
90         int        flag;
91         void       *data;       /* user data */
92         void       (*free)(void *); /* free user data function */
93 };
94
95
96 static int cf_data_add_internal(CONF_SECTION *cs, const char *name,
97                                 void *data, void (*data_free)(void *),
98                                 int flag);
99 static void *cf_data_find_internal(CONF_SECTION *cs, const char *name,
100                                    int flag);
101
102 /*
103  *      Isolate the scary casts in these tiny provably-safe functions
104  */
105 CONF_PAIR *cf_itemtopair(CONF_ITEM *ci)
106 {
107         if (ci == NULL)
108                 return NULL;
109         rad_assert(ci->type == CONF_ITEM_PAIR);
110         return (CONF_PAIR *)ci;
111 }
112 CONF_SECTION *cf_itemtosection(CONF_ITEM *ci)
113 {
114         if (ci == NULL)
115                 return NULL;
116         rad_assert(ci->type == CONF_ITEM_SECTION);
117         return (CONF_SECTION *)ci;
118 }
119 CONF_ITEM *cf_pairtoitem(CONF_PAIR *cp)
120 {
121         if (cp == NULL)
122                 return NULL;
123         return (CONF_ITEM *)cp;
124 }
125 CONF_ITEM *cf_sectiontoitem(CONF_SECTION *cs)
126 {
127         if (cs == NULL)
128                 return NULL;
129         return (CONF_ITEM *)cs;
130 }
131
132 static CONF_DATA *cf_itemtodata(CONF_ITEM *ci)
133 {
134         if (ci == NULL)
135                 return NULL;
136         rad_assert(ci->type == CONF_ITEM_DATA);
137         return (CONF_DATA *)ci;
138 }
139 static CONF_ITEM *cf_datatoitem(CONF_DATA *cd)
140 {
141         if (cd == NULL)
142                 return NULL;
143         return (CONF_ITEM *)cd;
144 }
145
146 /*
147  *      Create a new CONF_PAIR
148  */
149 static CONF_PAIR *cf_pair_alloc(const char *attr, const char *value,
150                                 LRAD_TOKEN operator, LRAD_TOKEN value_type,
151                                 CONF_SECTION *parent)
152 {
153         CONF_PAIR *cp;
154
155         cp = rad_malloc(sizeof(*cp));
156         memset(cp, 0, sizeof(*cp));
157         cp->item.type = CONF_ITEM_PAIR;
158         cp->item.parent = parent;
159         cp->attr = strdup(attr);
160         if (value) cp->value = strdup(value);
161         cp->value_type = value_type;
162         cp->operator = operator;
163
164         return cp;
165 }
166
167 /*
168  *      Free a CONF_PAIR
169  */
170 void cf_pair_free(CONF_PAIR **cp)
171 {
172         if (!cp || !*cp) return;
173
174         if ((*cp)->attr)
175                 free((*cp)->attr);
176         if ((*cp)->value)
177                 free((*cp)->value);
178
179 #ifndef NDEBUG
180         memset(*cp, 0, sizeof(*cp));
181 #endif
182         free(*cp);
183
184         *cp = NULL;
185 }
186
187
188 static void cf_data_free(CONF_DATA **cd)
189 {
190         if (!cd || !*cd) return;
191
192         if ((*cd)->flag != 0) free((*cd)->name);
193         if (!(*cd)->free) {
194                 free((*cd)->data);
195         } else {
196                 ((*cd)->free)((*cd)->data);
197         }
198 #ifndef NDEBUG
199         memset(*cd, 0, sizeof(*cd));
200 #endif
201         free(*cd);
202         *cd = NULL;
203 }
204
205 /*
206  *      rbtree callback function
207  */
208 static int pair_cmp(const void *a, const void *b)
209 {
210         const CONF_PAIR *one = a;
211         const CONF_PAIR *two = b;
212
213         return strcmp(one->attr, two->attr);
214 }
215
216
217 /*
218  *      rbtree callback function
219  */
220 static int section_cmp(const void *a, const void *b)
221 {
222         const CONF_SECTION *one = a;
223         const CONF_SECTION *two = b;
224
225         return strcmp(one->name1, two->name1);
226 }
227
228
229 /*
230  *      rbtree callback function
231  */
232 static int name2_cmp(const void *a, const void *b)
233 {
234         const CONF_SECTION *one = a;
235         const CONF_SECTION *two = b;
236
237         rad_assert(strcmp(one->name1, two->name1) == 0);
238
239         if (!one->name2 && !two->name2) return 0;
240         if (!one->name2) return -1;
241         if (!two->name2) return +1;
242
243         return strcmp(one->name2, two->name2);
244 }
245
246
247 /*
248  *      rbtree callback function
249  */
250 static int data_cmp(const void *a, const void *b)
251 {
252         int rcode;
253
254         const CONF_DATA *one = a;
255         const CONF_DATA *two = b;
256
257         rcode = one->flag - two->flag;
258         if (rcode != 0) return rcode;
259
260         return strcmp(one->name, two->name);
261 }
262
263
264 /*
265  *      Free strings we've parsed into data structures.
266  */
267 static void cf_section_parse_free(void *base, const CONF_PARSER *variables)
268 {
269         int i;
270
271         /*
272          *      Don't automatically free the strings if we're being
273          *      called from a module.  This is also for clients.c,
274          *      where client_free() expects to be able to free the
275          *      client structure.  If we moved everything to key off
276          *      of the config files, we might solve some problems...
277          */
278         if (!variables) return;
279
280         /*
281          *      Free up dynamically allocated string pointers.
282          */
283         for (i = 0; variables[i].name != NULL; i++) {
284                 char **p;
285
286                 if ((variables[i].type != PW_TYPE_STRING_PTR) &&
287                     (variables[i].type != PW_TYPE_FILENAME)) {
288                         continue;
289                 }
290
291                 /*
292                  *      No base struct offset, data must be the pointer.
293                  *      If data doesn't exist, ignore the entry, there
294                  *      must be something wrong.
295                  */
296                 if (!base) {
297                         if (!variables[i].data) {
298                                 continue;
299                         }
300
301                         p = (char **) variables[i].data;;
302
303                 } else if (variables[i].data) {
304                         p = (char **) variables[i].data;;
305
306                 } else {
307                         p = (char **) (((char *)base) + variables[i].offset);
308                 }
309
310                 free(*p);
311                 *p = NULL;
312         }
313 }
314
315
316 /*
317  *      Free a CONF_SECTION
318  */
319 void cf_section_free(CONF_SECTION **cs)
320 {
321         CONF_ITEM       *ci, *next;
322
323         if (!cs || !*cs) return;
324
325         if ((*cs)->variables) {
326                 cf_section_parse_free((*cs)->base, (*cs)->variables);
327         }
328
329         for (ci = (*cs)->children; ci; ci = next) {
330                 next = ci->next;
331
332                 switch (ci->type) {
333                 case CONF_ITEM_PAIR: {
334                                 CONF_PAIR *pair = cf_itemtopair(ci);
335                                 cf_pair_free(&pair);
336                         }
337                         break;
338
339                 case CONF_ITEM_SECTION: {
340                                 CONF_SECTION *section = cf_itemtosection(ci);
341                                 cf_section_free(&section);
342                         }
343                         break;
344
345                 case CONF_ITEM_DATA: {
346                                 CONF_DATA *data = cf_itemtodata(ci);
347                                 cf_data_free(&data);
348                         }
349                         break;
350
351                 default:        /* should really be an error. */
352                         break;
353                 }
354         }
355
356         if ((*cs)->name1)
357                 free((*cs)->name1);
358         if ((*cs)->name2)
359                 free((*cs)->name2);
360         if ((*cs)->pair_tree)
361                 rbtree_free((*cs)->pair_tree);
362         if ((*cs)->section_tree)
363                 rbtree_free((*cs)->section_tree);
364         if ((*cs)->name2_tree)
365                 rbtree_free((*cs)->name2_tree);
366         if ((*cs)->data_tree)
367                 rbtree_free((*cs)->data_tree);
368
369         /*
370          * And free the section
371          */
372 #ifndef NDEBUG
373         memset(*cs, 0, sizeof(*cs));
374 #endif
375         free(*cs);
376
377         *cs = NULL;
378 }
379
380
381 /*
382  *      Allocate a CONF_SECTION
383  */
384 static CONF_SECTION *cf_section_alloc(const char *name1, const char *name2,
385                                       CONF_SECTION *parent)
386 {
387         CONF_SECTION    *cs;
388
389         if (!name1) return NULL;
390
391         cs = rad_malloc(sizeof(*cs));
392         memset(cs, 0, sizeof(*cs));
393         cs->item.type = CONF_ITEM_SECTION;
394         cs->item.parent = parent;
395         cs->name1 = strdup(name1);
396         if (!cs->name1) {
397                 cf_section_free(&cs);
398                 return NULL;
399         }
400
401         if (name2 && *name2) {
402                 cs->name2 = strdup(name2);
403                 if (!cs->name2) {
404                         cf_section_free(&cs);
405                         return NULL;
406                 }
407         }
408         cs->pair_tree = rbtree_create(pair_cmp, NULL, 0);
409         if (!cs->pair_tree) {
410                 cf_section_free(&cs);
411                 return NULL;
412         }
413
414         /*
415          *      Don't create a data tree, it may not be needed.
416          */
417
418         /*
419          *      Don't create the section tree here, it may not
420          *      be needed.
421          */
422
423         if (parent) cs->depth = parent->depth + 1;
424
425         return cs;
426 }
427
428
429 /*
430  *      Add an item to a configuration section.
431  */
432 static void cf_item_add(CONF_SECTION *cs, CONF_ITEM *ci)
433 {
434         if (!cs->children) {
435                 rad_assert(cs->tail == NULL);
436                 cs->children = ci;
437         } else {
438                 rad_assert(cs->tail != NULL);
439                 cs->tail->next = ci;
440         }
441
442         /*
443          *      Update the trees (and tail) for each item added.
444          */
445         for (/* nothing */; ci != NULL; ci = ci->next) {
446                 cs->tail = ci;
447
448                 /*
449                  *      For fast lookups, pair's and sections get
450                  *      added to rbtree's.
451                  */
452                 switch (ci->type) {
453                         case CONF_ITEM_PAIR:
454                                 rbtree_insert(cs->pair_tree, ci);
455                                 break;
456
457                         case CONF_ITEM_SECTION: {
458                                 const CONF_SECTION *cs_new = cf_itemtosection(ci);
459
460                                 if (!cs->section_tree) {
461                                         cs->section_tree = rbtree_create(section_cmp, NULL, 0);
462                                         /* ignore any errors */
463                                 }
464
465                                 if (cs->section_tree) {
466                                         rbtree_insert(cs->section_tree, cs_new);                                }
467
468                                 /*
469                                  *      Two names: find the named instance.
470                                  */
471                                 {
472                                         CONF_SECTION *old_cs;
473
474                                         /*
475                                          *      Find the FIRST
476                                          *      CONF_SECTION having
477                                          *      the given name1, and
478                                          *      create a new tree
479                                          *      under it.
480                                          */
481                                         old_cs = rbtree_finddata(cs->section_tree, cs_new);
482                                         if (!old_cs) return; /* this is a bad error! */
483
484                                         if (!old_cs->name2_tree) {
485                                                 old_cs->name2_tree = rbtree_create(name2_cmp,
486                                                                                    NULL, 0);
487                                         }
488                                         if (old_cs->name2_tree) {
489                                                 rbtree_insert(old_cs->name2_tree, cs_new);
490                                         }
491                                 } /* had a name2 */
492                                 break;
493                         } /* was a section */
494
495                         case CONF_ITEM_DATA:
496                                 if (!cs->data_tree) {
497                                         cs->data_tree = rbtree_create(data_cmp, NULL, 0);
498                                 }
499                                 if (cs->data_tree) {
500                                         rbtree_insert(cs->data_tree, ci);
501                                 }
502                                 break;
503
504                         default: /* FIXME: assert & error! */
505                                 break;
506
507                 } /* switch over conf types */
508         } /* loop over ci */
509 }
510
511
512 static const CONF_ITEM *cf_reference_item(const CONF_SECTION *parentcs,
513                                           const CONF_SECTION *outercs,
514                                           const char *ptr)
515 {
516         CONF_PAIR *cp;
517         const CONF_SECTION *cs = outercs, *next;
518         char name[8192];
519         char *p;
520
521         strlcpy(name, ptr, sizeof(name));
522         p = name;
523
524         /*
525          *      ".foo" means "foo from the current section"
526          */
527         if (*p == '.') {
528                 p++;
529                 
530                 /*
531                  *      ..foo means "foo from the section
532                  *      enclosing this section" (etc.)
533                  */
534                 while (*p == '.') {
535                         if (cs->item.parent)
536                                 cs = cs->item.parent;
537                         p++;
538                 }
539
540                 /*
541                  *      "foo.bar.baz" means "from the root"
542                  */
543         } else if (strchr(p, '.') != NULL) {
544                 cs = parentcs;
545         }
546
547         while (*p) {
548                 char *q = strchr(p, '.');
549
550                 if (!q) break;
551
552                 *q = '\0';
553                 next = cf_section_sub_find(cs, p);
554                 *q = '.';
555
556                 if (!next) break; /* it MAY be a pair in this section! */
557
558                 cs = next;
559                 p = q + 1;
560         }
561
562         if (!*p) return NULL;
563
564  retry:
565         /*
566          *      Find it in the current referenced
567          *      section.
568          */
569         cp = cf_pair_find(cs, p);
570         if (cp) return cf_pairtoitem(cp);
571
572         next = cf_section_sub_find(cs, p);
573         if (next) return cf_sectiontoitem(next);
574         
575         /*
576          *      "foo" is "in the current section, OR in main".
577          */
578         if ((p == name) && (cs != parentcs)) {
579                 cs = parentcs;
580                 goto retry;
581         }
582
583         return NULL;
584 }
585
586
587 CONF_SECTION *cf_top_section(const CONF_SECTION *cs)
588 {
589         while (cs->item.parent != NULL) {
590                 cs = cs->item.parent;
591         }
592
593         return cs;
594 }
595
596
597 /*
598  *      Expand the variables in an input string.
599  */
600 static const char *cf_expand_variables(const char *cf, int *lineno,
601                                        const CONF_SECTION *outercs,
602                                        char *output, const char *input)
603 {
604         char *p;
605         const char *end, *ptr;
606         const CONF_SECTION *parentcs;
607         char name[8192];
608
609         /*
610          *      Find the master parent conf section.
611          *      We can't use mainconfig.config, because we're in the
612          *      process of re-building it, and it isn't set up yet...
613          */
614         parentcs = cf_top_section(outercs);
615
616         p = output;
617         ptr = input;
618         while (*ptr) {
619                 /*
620                  *      Ignore anything other than "${"
621                  */
622                 if ((*ptr == '$') && (ptr[1] == '{')) {
623                         CONF_ITEM *ci;
624                         CONF_PAIR *cp;
625
626                         /*
627                          *      FIXME: Add support for ${foo:-bar},
628                          *      like in xlat.c
629                          */
630
631                         /*
632                          *      Look for trailing '}', and log a
633                          *      warning for anything that doesn't match,
634                          *      and exit with a fatal error.
635                          */
636                         end = strchr(ptr, '}');
637                         if (end == NULL) {
638                                 *p = '\0';
639                                 radlog(L_INFO, "%s[%d]: Variable expansion missing }",
640                                        cf, *lineno);
641                                 return NULL;
642                         }
643
644                         ptr += 2;
645
646                         /*
647                          *      Can't really happen because input lines are
648                          *      capped at 8k, which is sizeof(name)
649                          */
650                         if ((end - ptr) >= sizeof(name)) {
651                                 radlog(L_ERR, "%s[%d]: Reference string is too large",
652                                        cf, *lineno);
653                                 return NULL;
654                         }
655
656                         memcpy(name, ptr, end - ptr);
657                         name[end - ptr] = '\0';
658
659                         ci = cf_reference_item(parentcs, outercs, name);
660                         if (!ci || (ci->type != CONF_ITEM_PAIR)) {
661                                 radlog(L_ERR, "%s[%d]: Reference \"%s\" not found",
662                                        cf, *lineno, input);
663                                 return NULL;
664                         }
665
666                         /*
667                          *  Substitute the value of the variable.
668                          */
669                         cp = cf_itemtopair(ci);
670                         strcpy(p, cp->value);
671                         p += strlen(p);
672                         ptr = end + 1;
673
674                 } else if (memcmp(ptr, "$ENV{", 5) == 0) {
675                         char *env;
676
677                         ptr += 5;
678
679                         /*
680                          *      Look for trailing '}', and log a
681                          *      warning for anything that doesn't match,
682                          *      and exit with a fatal error.
683                          */
684                         end = strchr(ptr, '}');
685                         if (end == NULL) {
686                                 *p = '\0';
687                                 radlog(L_INFO, "%s[%d]: Environment variable expansion missing }",
688                                        cf, *lineno);
689                                 return NULL;
690                         }
691
692                         /*
693                          *      Can't really happen because input lines are
694                          *      capped at 8k, which is sizeof(name)
695                          */
696                         if ((end - ptr) >= sizeof(name)) {
697                                 radlog(L_ERR, "%s[%d]: Environment variable name is too large",
698                                        cf, *lineno);
699                                 return NULL;
700                         }
701
702                         memcpy(name, ptr, end - ptr);
703                         name[end - ptr] = '\0';
704
705                         /*
706                          *      Get the environment variable.
707                          *      If none exists, then make it an empty string.
708                          */
709                         env = getenv(name);
710                         if (env == NULL) {
711                                 *name = '\0';
712                                 env = name;
713                         }
714
715                         strcpy(p, env);
716                         p += strlen(p);
717                         ptr = end + 1;
718
719                 } else {
720                         /*
721                          *      Copy it over verbatim.
722                          */
723                         *(p++) = *(ptr++);
724                 }
725         } /* loop over all of the input string. */
726
727         *p = '\0';
728
729         return output;
730 }
731
732
733 /*
734  *      Parses an item (not a CONF_ITEM) into the specified format,
735  *      with a default value.
736  *
737  *      Returns -1 on error, 0 for correctly parsed, and 1 if the
738  *      default value was used.  Note that the default value will be
739  *      used ONLY if the CONF_PAIR is NULL.
740  */
741 int cf_item_parse(CONF_SECTION *cs, const char *name,
742                   int type, void *data, const char *dflt)
743 {
744         int rcode = 0;
745         char **q;
746         const char *value;
747         lrad_ipaddr_t ipaddr;
748         const CONF_PAIR *cp;
749         char ipbuf[128];
750
751         cp = cf_pair_find(cs, name);
752         if (cp) {
753                 value = cp->value;
754
755         } else if (!dflt) {
756                 return 1;       /* nothing to parse, return default value */
757
758         } else {
759                 rcode = 1;
760                 value = dflt;
761         }
762
763         if (!value) {
764                 return 0;
765         }
766
767         switch (type) {
768         case PW_TYPE_BOOLEAN:
769                 /*
770                  *      Allow yes/no and on/off
771                  */
772                 if ((strcasecmp(value, "yes") == 0) ||
773                     (strcasecmp(value, "on") == 0)) {
774                         *(int *)data = 1;
775                 } else if ((strcasecmp(value, "no") == 0) ||
776                            (strcasecmp(value, "off") == 0)) {
777                         *(int *)data = 0;
778                 } else {
779                         *(int *)data = 0;
780                         radlog(L_ERR, "Bad value \"%s\" for boolean variable %s", value, name);
781                         return -1;
782                 }
783                 DEBUG2("\t%s = %s", name, value);
784                 break;
785
786         case PW_TYPE_INTEGER:
787                 *(int *)data = strtol(value, 0, 0);
788                 DEBUG2("\t%s = %d", name, *(int *)data);
789                 break;
790
791         case PW_TYPE_STRING_PTR:
792                 q = (char **) data;
793                 if (*q != NULL) {
794                         free(*q);
795                 }
796
797                 /*
798                  *      Expand variables which haven't already been
799                  *      expanded automagically when the configuration
800                  *      file was read.
801                  */
802                 if (value == dflt) {
803                         char buffer[8192];
804
805                         int lineno = cs->item.lineno;
806
807                         /*
808                          *      FIXME: sizeof(buffer)?
809                          */
810                         value = cf_expand_variables("?",
811                                                     &lineno,
812                                                     cs, buffer, value);
813                         if (!value) return -1;
814                 }
815
816                 DEBUG2("\t%s = \"%s\"", name, value ? value : "(null)");
817                 *q = value ? strdup(value) : NULL;
818                 break;
819
820                 /*
821                  *      This is the same as PW_TYPE_STRING_PTR,
822                  *      except that we also "stat" the file, and
823                  *      cache the result.
824                  */
825         case PW_TYPE_FILENAME:
826                 q = (char **) data;
827                 if (*q != NULL) {
828                         free(*q);
829                 }
830
831                 /*
832                  *      Expand variables which haven't already been
833                  *      expanded automagically when the configuration
834                  *      file was read.
835                  */
836                 if (value == dflt) {
837                         char buffer[8192];
838
839                         int lineno = cs->item.lineno;
840
841                         /*
842                          *      FIXME: sizeof(buffer)?
843                          */
844                         value = cf_expand_variables("?",
845                                                     &lineno,
846                                                     cs, buffer, value);
847                         if (!value) return -1;
848                 }
849
850                 DEBUG2("\t%s = \"%s\"", name, value ? value : "(null)");
851                 *q = value ? strdup(value) : NULL;
852
853                 /*
854                  *      And now we "stat" the file.
855                  */
856                 if (*q) {
857                         struct stat buf;
858
859                         if (stat(*q, &buf) == 0) {
860                                 time_t *mtime;
861
862                                 mtime = rad_malloc(sizeof(*mtime));
863                                 *mtime = buf.st_mtime;
864                                 /* FIXME: error? */
865                                 cf_data_add_internal(cs, *q, mtime, free,
866                                                      PW_TYPE_FILENAME);
867                         }
868                 }
869                 break;
870
871         case PW_TYPE_IPADDR:
872                 /*
873                  *      Allow '*' as any address
874                  */
875                 if (strcmp(value, "*") == 0) {
876                         *(uint32_t *) data = htonl(INADDR_ANY);
877                         DEBUG2("\t%s = *", name);
878                         break;
879                 }
880                 if (ip_hton(value, AF_INET, &ipaddr) < 0) {
881                         radlog(L_ERR, "Can't find IP address for host %s", value);
882                         return -1;
883                 }
884                 
885                 if (strspn(value, "0123456789.") == strlen(value)) {
886                         DEBUG2("\t%s = %s", name, value);
887                 } else {
888                         DEBUG2("\t%s = %s IP address [%s]", name, value,
889                                ip_ntoh(&ipaddr, ipbuf, sizeof(ipbuf)));
890                 }
891                 *(uint32_t *) data = ipaddr.ipaddr.ip4addr.s_addr;
892                 break;
893
894         case PW_TYPE_IPV6ADDR:
895                 if (ip_hton(value, AF_INET6, &ipaddr) < 0) {
896                         radlog(L_ERR, "Can't find IPv6 address for host %s", value);
897                         return -1;
898                 }
899                 DEBUG2("\t%s = %s IPv6 address [%s]", name, value,
900                                ip_ntoh(&ipaddr, ipbuf, sizeof(ipbuf)));
901                 memcpy(data, &ipaddr.ipaddr.ip6addr,
902                        sizeof(ipaddr.ipaddr.ip6addr));
903                 break;
904
905         default:
906                 radlog(L_ERR, "type %d not supported yet", type);
907                 return -1;
908                 break;
909         } /* switch over variable type */
910
911         return rcode;
912 }
913
914 static const char *parse_spaces = "                                                                                                                                                                                                                                                                ";
915
916 /*
917  *      Parse a configuration section into user-supplied variables.
918  */
919 int cf_section_parse(CONF_SECTION *cs, void *base,
920                      const CONF_PARSER *variables)
921 {
922         int i;
923         void *data;
924
925         if (!cs->name2) {
926                 DEBUG2("%.*s%s {", cs->depth, parse_spaces,
927                        cs->name1);
928         } else {
929                 DEBUG2("%.*s%s %s {", cs->depth, parse_spaces,
930                        cs->name1, cs->name2);
931         }
932
933         /*
934          *      Handle the known configuration parameters.
935          */
936         for (i = 0; variables[i].name != NULL; i++) {
937                 /*
938                  *      Handle subsections specially
939                  */
940                 if (variables[i].type == PW_TYPE_SUBSECTION) {
941                         const CONF_SECTION *subcs;
942                         subcs = cf_section_sub_find(cs, variables[i].name);
943
944                         /*
945                          *      If the configuration section is NOT there,
946                          *      then ignore it.
947                          *
948                          *      FIXME! This is probably wrong... we should
949                          *      probably set the items to their default values.
950                          */
951                         if (!subcs) continue;
952
953                         if (!variables[i].dflt) {
954                                 DEBUG2("Internal sanity check 1 failed in cf_section_parse");
955                                 goto error;
956                         }
957
958                         if (cf_section_parse(subcs, base,
959                                              (const CONF_PARSER *) variables[i].dflt) < 0) {
960                                 goto error;
961                         }
962                         continue;
963                 } /* else it's a CONF_PAIR */
964
965                 if (variables[i].data) {
966                         data = variables[i].data; /* prefer this. */
967                 } else if (base) {
968                         data = ((char *)base) + variables[i].offset;
969                 } else {
970                         DEBUG2("Internal sanity check 2 failed in cf_section_parse");
971                         goto error;
972                 }
973
974                 /*
975                  *      Parse the pair we found, or a default value.
976                  */
977                 if (cf_item_parse(cs, variables[i].name, variables[i].type,
978                                   data, variables[i].dflt) < 0) {
979                         goto error;
980                 }
981         } /* for all variables in the configuration section */
982
983         DEBUG2("%.*s}", cs->depth, parse_spaces);
984
985         cs->base = base;
986         cs->variables = variables;
987
988         return 0;
989
990  error:
991         DEBUG2("%.*s}", cs->depth, parse_spaces);
992         cf_section_parse_free(base, variables);
993         return -1;
994 }
995
996
997 /*
998  *      Sanity check the "if" or "elsif", presuming that the first '('
999  *      has already been eaten.
1000  *
1001  *      We're not really parsing it here, just checking if it's mostly
1002  *      well-formed.
1003  */
1004 static int condition_looks_ok(const char **ptr)
1005 {
1006         int num_braces = 1;
1007         int quote = 0;
1008         const char *p = *ptr;
1009
1010         while (*p) {
1011                 if (quote) {
1012                         if (*p == quote) {
1013                                 p++;
1014                                 quote = 0;
1015                                 continue;
1016                         }
1017
1018                         if (*p == '\\') {
1019                                 if (!p[1]) {
1020                                         return 0; /* no trailing slash */
1021                                 }
1022                                 p += 2;
1023                                 continue;
1024                         }
1025                         p++;
1026                         continue;
1027                 }
1028
1029                 switch (*p) {
1030                 case '\\':
1031                         if (!p[1]) {
1032                                 return 0; /* no trailing slash */
1033                         }
1034                         p += 2;
1035                         continue;
1036
1037                 case '(':
1038                         num_braces++;
1039                         p++;
1040                         continue;
1041
1042                 case ')':
1043                         if (num_braces == 1) {
1044                                 const char *q = p + 1;
1045
1046                                 /*
1047                                  *      Validate that there isn't much
1048                                  *      else after the closing brace.
1049                                  */
1050                                 while ((*q == ' ') || (*q == '\t')) q++;
1051
1052                                 /*
1053                                  *      Parse error.
1054                                  */
1055                                 if (*q != '{') {
1056                                         return 0;
1057                                 }
1058
1059                                 *ptr = p + 1; /* include the trailing ')' */
1060                                 return 1;
1061                         }
1062                         num_braces--;
1063                         p++;
1064                         continue;
1065
1066                 case '"':
1067                 case '\'':
1068                 case '/':
1069                 case '`':
1070                         quote = *p;
1071                         /* FALL-THROUGH */
1072
1073                 default:
1074                         p++;
1075                         break;
1076                 }
1077         }
1078
1079         return 0;
1080 }
1081
1082
1083 static const char *cf_local_file(CONF_SECTION *cs, const char *local,
1084                                  char *buffer, size_t bufsize)
1085 {
1086         size_t dirsize;
1087         const char *p;
1088         CONF_SECTION *parentcs = cf_top_section(cs);
1089
1090         p = strrchr(parentcs->item.filename, '/');
1091         if (!p) return local;
1092
1093         dirsize = (p - parentcs->item.filename);
1094
1095         if ((dirsize + strlen(local)) >= bufsize) {
1096                 return NULL;
1097         }
1098
1099         memcpy(buffer, parentcs->item.filename, dirsize);
1100         strlcpy(buffer + dirsize, local, bufsize - dirsize);
1101
1102         return buffer;
1103 }
1104
1105
1106 /*
1107  *      Read a part of the config file.
1108  */
1109 static int cf_section_read(const char *filename, int *lineno, FILE *fp,
1110                            CONF_SECTION *current)
1111
1112 {
1113         CONF_SECTION *this, *css;
1114         CONF_PAIR *cpn;
1115         char *ptr;
1116         const char *value;
1117         char buf[8192];
1118         char buf1[8192];
1119         char buf2[8192];
1120         char buf3[8192];
1121         int t1, t2, t3;
1122         char *cbuf = buf;
1123         int len;
1124
1125         this = current;         /* add items here */
1126
1127         /*
1128          *      Read, checking for line continuations ('\\' at EOL)
1129          */
1130         for (;;) {
1131                 int eof;
1132
1133                 /*
1134                  *      Get data, and remember if we are at EOF.
1135                  */
1136                 eof = (fgets(cbuf, sizeof(buf) - (cbuf - buf), fp) == NULL);
1137                 (*lineno)++;
1138
1139                 len = strlen(cbuf);
1140
1141                 /*
1142                  *      We've filled the buffer, and there isn't
1143                  *      a CR in it.  Die!
1144                  */
1145                 if ((cbuf[len - 1] != '\n') && !feof(fp)) {
1146                         radlog(L_ERR, "%s[%d]: Line too long",
1147                                filename, *lineno);
1148                         return -1;
1149                 }
1150
1151                 /*
1152                  *  Check for continuations.
1153                  */
1154                 if (cbuf[len - 1] == '\n') len--;
1155
1156                 /*
1157                  *      Last character is '\\'.  Over-write it,
1158                  *      and read another line.
1159                  */
1160                 if ((len > 0) && (cbuf[len - 1] == '\\')) {
1161                         if (len >= (sizeof(buf) - 5)) {
1162                                 radlog(L_ERR, "%s[%d]: Line too long",
1163                                        filename, *lineno);
1164                                 return -1;
1165                         }
1166
1167                         cbuf[len - 1] = '\0';
1168                         cbuf += len - 1;
1169                         continue;
1170                 }
1171
1172                 /*
1173                  *  We're at EOF, and haven't read anything.  Stop.
1174                  */
1175                 if (eof && (cbuf == buf)) {
1176                         break;
1177                 }
1178
1179                 ptr = cbuf = buf;
1180                 t1 = gettoken(&ptr, buf1, sizeof(buf1));
1181
1182                 if ((*buf1 == '#') || (*buf1 == '\0')) {
1183                         continue;
1184                 }
1185
1186                 /*
1187                  *      The caller eats "name1 name2 {", and calls us
1188                  *      for the data inside of the section.  So if we
1189                  *      receive a closing brace, then it must mean the
1190                  *      end of the section.
1191                  */
1192                if (t1 == T_RCBRACE) {
1193                        if (this == current) {
1194                                radlog(L_ERR, "%s[%d]: Too many closing braces",
1195                                       filename, *lineno);
1196                                return -1;
1197
1198                        }
1199                        this = this->item.parent;
1200                        continue;
1201                 }
1202
1203                 /*
1204                  *      Allow for $INCLUDE files
1205                  *
1206                  *      This *SHOULD* work for any level include.
1207                  *      I really really really hate this file.  -cparker
1208                  */
1209                if ((strcasecmp(buf1, "$INCLUDE") == 0) ||
1210                    (strcasecmp(buf1, "$-INCLUDE") == 0)) {
1211                         t2 = getword(&ptr, buf2, sizeof(buf2));
1212
1213                         value = cf_expand_variables(filename, lineno, this, buf, buf2);
1214                         if (!value) return -1;
1215
1216                         if (value[0] != '/') {
1217                                 value = cf_local_file(current, value, buf3,
1218                                                       sizeof(buf3));
1219                                 if (!value) {
1220                                         radlog(L_ERR, "%s[%d]: Directories too deep.",
1221                                                filename, *lineno);
1222                                         return -1;
1223                                 }
1224                         }
1225
1226
1227 #ifdef HAVE_DIRENT_H
1228                         /*
1229                          *      $INCLUDE foo/
1230                          *
1231                          *      Include ALL non-"dot" files in the directory.
1232                          *      careful!
1233                          */
1234                         if (value[strlen(value) - 1] == '/') {
1235                                 DIR             *dir;
1236                                 struct dirent   *dp;
1237                                 struct stat stat_buf;
1238
1239                                 DEBUG2("including files in directory %s", value );
1240                                 dir = opendir(value);
1241                                 if (!dir) {
1242                                         radlog(L_ERR, "%s[%d]: Error reading directory %s: %s",
1243                                                filename, *lineno, value,
1244                                                strerror(errno));
1245                                         return -1;
1246                                 }
1247
1248                                 /*
1249                                  *      Read the directory, ignoring "." files.
1250                                  */
1251                                 while ((dp = readdir(dir)) != NULL) {
1252                                         const char *p;
1253
1254                                         if (dp->d_name[0] == '.') continue;
1255
1256                                         /*
1257                                          *      Check for valid characters
1258                                          */
1259                                         for (p = dp->d_name; *p != '\0'; p++) {
1260                                                 if (isalpha((int)*p) ||
1261                                                     isdigit((int)*p) ||
1262                                                     (*p == '-') ||
1263                                                     (*p == '_') ||
1264                                                     (*p == '.')) continue;
1265                                                 break;
1266                                         }
1267                                         if (*p != '\0') continue;
1268
1269                                         snprintf(buf2, sizeof(buf2), "%s%s",
1270                                                  value, dp->d_name);
1271                                         if ((stat(buf2, &stat_buf) != 0) ||
1272                                             S_ISDIR(stat_buf.st_mode)) continue;
1273                                         /*
1274                                          *      Read the file into the current
1275                                          *      configuration sectoin.
1276                                          */
1277                                         if (cf_file_include(buf2, this) < 0) {
1278                                                 closedir(dir);
1279                                                 return -1;
1280                                         }
1281                                 }
1282                                 closedir(dir);
1283                         }  else
1284 #endif
1285                         { /* it was a normal file */
1286                                 if (buf1[1] == '-') {
1287                                         struct stat statbuf;
1288
1289                                         if (stat(value, &statbuf) < 0) {
1290                                                 DEBUG("WARNING: Not including file %s: %s", value, strerror(errno));
1291                                                 continue;
1292                                         }
1293                                 }
1294
1295                                 if (cf_file_include(value, this) < 0) {
1296                                         return -1;
1297                                 }
1298                         }
1299                         continue;
1300                 } /* we were in an include */
1301
1302                if (strcasecmp(buf1, "$template") == 0) {
1303                        CONF_ITEM *ci;
1304                        CONF_SECTION *parentcs;
1305                        t2 = getword(&ptr, buf2, sizeof(buf2));
1306
1307                        parentcs = cf_top_section(current);
1308
1309                        ci = cf_reference_item(parentcs, this, buf2);
1310                        if (!ci || (ci->type != CONF_ITEM_SECTION)) {
1311                                 radlog(L_ERR, "%s[%d]: Reference \"%s\" not found",
1312                                        filename, *lineno, buf2);
1313                                 return -1;
1314                        }
1315                        
1316                        if (this->template) {
1317                                 radlog(L_ERR, "%s[%d]: Section already has a template",
1318                                        filename, *lineno);
1319                                 return -1;
1320                        }
1321
1322                        this->template = cf_itemtosection(ci);
1323                        continue;
1324                }
1325
1326                 /*
1327                  *      Ensure that the user can't add CONF_PAIRs
1328                  *      with 'internal' names;
1329                  */
1330                 if (buf1[0] == '_') {
1331                         radlog(L_ERR, "%s[%d]: Illegal configuration pair name \"%s\"",
1332                                         filename, *lineno, buf1);
1333                         return -1;
1334                 }
1335
1336                 /*
1337                  *      Grab the next token.
1338                  */
1339                 t2 = gettoken(&ptr, buf2, sizeof(buf2));
1340                 switch (t2) {
1341                 case T_EOL:
1342                 case T_HASH:
1343                         t2 = T_OP_EQ;
1344                         value = NULL;
1345                         goto do_set;
1346
1347                 case T_OP_ADD:
1348                 case T_OP_CMP_EQ:
1349                 case T_OP_SUB:
1350                 case T_OP_LE:
1351                 case T_OP_GE:
1352                         if (!this || (strcmp(this->name1, "update") != 0)) {
1353                                 radlog(L_ERR, "%s[%d]: Invalid operator in assignment",
1354                                        filename, *lineno);
1355                                 return -1;
1356                         }
1357
1358                 case T_OP_EQ:
1359                 case T_OP_SET:
1360                 do_set:
1361                         t3 = getstring(&ptr, buf3, sizeof(buf3));
1362
1363                         /*
1364                          *      Handle variable substitution via ${foo}
1365                          */
1366                         if ((t3 == T_BARE_WORD) ||
1367                             (t3 == T_DOUBLE_QUOTED_STRING)) {
1368                                 value = cf_expand_variables(filename, lineno, this,
1369                                                             buf, buf3);
1370                                 if (!value) return -1;
1371                         } else if ((t3 == T_EOL) ||
1372                                    (t3 == T_HASH)) {
1373                                 value = NULL;
1374                         } else {
1375                                 value = buf3;
1376                         }
1377                         
1378                         /*
1379                          *      Add this CONF_PAIR to our CONF_SECTION
1380                          */
1381                         cpn = cf_pair_alloc(buf1, value, t2, t3, this);
1382                         cpn->item.filename = filename;
1383                         cpn->item.lineno = *lineno;
1384                         cf_item_add(this, cf_pairtoitem(cpn));
1385                         continue;
1386
1387                         /*
1388                          *      This horrible code is here to support
1389                          *      if/then/else failover in the
1390                          *      authorize, etc. sections.  It makes no
1391                          *      sense anywhere else.
1392                          */
1393                 case T_LBRACE:
1394                         if ((strcmp(buf1, "if") == 0) ||
1395                             (strcmp(buf1, "elsif") == 0)) {
1396                                 const char *end = ptr;
1397                                 CONF_SECTION *server;
1398
1399                                 if (!condition_looks_ok(&end)) {
1400                                         radlog(L_ERR, "%s[%d]: Parse error in condition at: %s",
1401                                                filename, *lineno, ptr);
1402                                         return -1;
1403                                 }
1404
1405                                 if ((end - ptr) >= (sizeof(buf2) - 1)) {
1406                                         radlog(L_ERR, "%s[%d]: Statement too complicated after \"%s\"",
1407                                                filename, *lineno, buf1);
1408                                         return -1;
1409                                 }
1410
1411                                 /*
1412                                  *      More sanity checking.  This is
1413                                  *      getting to be a horrible hack.
1414                                  */
1415                                 server = this;
1416                                 while (server) {
1417                                         if (strcmp(server->name1, "server") == 0) break;
1418                                         server = server->item.parent;
1419                                 }
1420                                 
1421                                 if (0 && !server) {
1422                                         radlog(L_ERR, "%s[%d]: Processing directives such as \"%s\" cannot be used here.",
1423                                                filename, *lineno, buf1);
1424                                         return -1;
1425                                 }
1426
1427                                 buf2[0] = '(';
1428                                 memcpy(buf2 + 1, ptr, end - ptr);
1429                                 buf2[end - ptr + 1] = '\0';
1430                                 ptr = end + 1;
1431                                 t2 = T_BARE_WORD;
1432                                 goto section_alloc;
1433
1434                         } else {
1435                                 radlog(L_ERR, "%s[%d]: Parse error after \"%s\"",
1436                                        filename, *lineno, buf1);
1437                                 return -1;
1438                         }
1439
1440                         /* FALL-THROUGH */
1441
1442                         /*
1443                          *      No '=', must be a section or sub-section.
1444                          */
1445                 case T_BARE_WORD:
1446                 case T_DOUBLE_QUOTED_STRING:
1447                 case T_SINGLE_QUOTED_STRING:
1448                         t3 = gettoken(&ptr, buf3, sizeof(buf3));
1449                         if (t3 != T_LCBRACE) {
1450                                 radlog(L_ERR, "%s[%d]: Expecting section start brace '{' after \"%s %s\"",
1451                                        filename, *lineno, buf1, buf2);
1452                                 return -1;
1453                         }
1454
1455                 case T_LCBRACE:
1456                 section_alloc:
1457                         css = cf_section_alloc(buf1,
1458                                                t2 == T_LCBRACE ? NULL : buf2,
1459                                                this);
1460                         if (!css) {
1461                                 radlog(L_ERR, "%s[%d]: Failed allocating memory for section",
1462                                                 filename, *lineno);
1463                                 return -1;
1464                         }
1465                         cf_item_add(this, cf_sectiontoitem(css));
1466                         css->item.filename = filename;
1467                         css->item.lineno = *lineno;
1468
1469                         /*
1470                          *      The current section is now the child section.
1471                          */
1472                         this = css;
1473                         continue;
1474
1475                 default:
1476                         radlog(L_ERR, "%s[%d]: Parse error after \"%s\"",
1477                                filename, *lineno, buf1);
1478                         return -1;
1479                 }
1480         }
1481
1482         /*
1483          *      See if EOF was unexpected ..
1484          */
1485         if (feof(fp) && (this != current)) {
1486                 radlog(L_ERR, "%s[%d]: EOF reached without closing brace for section %s starting at line %d",
1487                        filename, *lineno,
1488                        cf_section_name1(this), cf_section_lineno(this));
1489                 return -1;
1490         }
1491
1492         return 0;
1493 }
1494
1495 /*
1496  *      Include one config file in another.
1497  */
1498 int cf_file_include(const char *filename, CONF_SECTION *cs)
1499 {
1500         FILE            *fp;
1501         int             lineno = 0;
1502         struct stat     statbuf;
1503         time_t          *mtime;
1504         CONF_DATA       *cd;
1505
1506         DEBUG2( "including configuration file %s", filename);
1507
1508         if (stat(filename, &statbuf) == 0) {
1509 #ifdef S_IWOTH
1510                 if ((statbuf.st_mode & S_IWOTH) != 0) {
1511                         radlog(L_ERR|L_CONS, "Configuration file %s is globally writable.  Refusing to start due to insecure configuration.",
1512                                filename);
1513                         return -1;
1514                 }
1515 #endif
1516
1517 #ifdef S_IROTH
1518                 if (0 && (statbuf.st_mode & S_IROTH) != 0) {
1519                         radlog(L_ERR|L_CONS, "Configuration file %s is globally readable.  Refusing to start due to insecure configuration.",
1520                                filename);
1521                         return -1;
1522                 }
1523 #endif
1524         }
1525
1526         fp = fopen(filename, "r");
1527         if (!fp) {
1528                 radlog(L_ERR|L_CONS, "Unable to open file \"%s\": %s",
1529                        filename, strerror(errno));
1530                 return -1;
1531         }
1532
1533         /*
1534          *      Add the filename to the section
1535          */
1536         mtime = rad_malloc(sizeof(*mtime));
1537         *mtime = statbuf.st_mtime;
1538
1539         if (cf_data_add_internal(cs, filename, mtime, free,
1540                                  PW_TYPE_FILENAME) < 0) {
1541                 radlog(L_ERR|L_CONS, "Internal error open file \"%s\"",
1542                        filename);
1543                 return -1;
1544         }
1545
1546         cd = cf_data_find_internal(cs, filename, PW_TYPE_FILENAME);
1547         if (!cd) {
1548                 radlog(L_ERR|L_CONS, "Internal error open file \"%s\"",
1549                        filename);
1550                 return -1;
1551         }
1552
1553         if (!cs->item.filename) cs->item.filename = filename;
1554
1555         /*
1556          *      Read the section.  It's OK to have EOF without a
1557          *      matching close brace.
1558          */
1559         if (cf_section_read(cd->name, &lineno, fp, cs) < 0) {
1560                 fclose(fp);
1561                 return -1;
1562         }
1563
1564         fclose(fp);
1565         return 0;
1566 }
1567
1568 /*
1569  *      Bootstrap a config file.
1570  */
1571 CONF_SECTION *cf_file_read(const char *filename)
1572 {
1573         CONF_SECTION *cs;
1574
1575         cs = cf_section_alloc("main", NULL, NULL);
1576         if (!cs) return NULL;
1577
1578         if (cf_file_include(filename, cs) < 0) {
1579                 cf_section_free(&cs);
1580                 return NULL;
1581         }
1582
1583         return cs;
1584 }
1585
1586 /*
1587  * Return a CONF_PAIR within a CONF_SECTION.
1588  */
1589 CONF_PAIR *cf_pair_find(const CONF_SECTION *cs, const char *name)
1590 {
1591         CONF_ITEM       *ci;
1592         CONF_PAIR       *cp = NULL;
1593
1594         if (!cs) return NULL;
1595
1596         /*
1597          *      Find the name in the tree, for speed.
1598          */
1599         if (name) {
1600                 CONF_PAIR mycp;
1601
1602                 mycp.attr = name;
1603                 cp = rbtree_finddata(cs->pair_tree, &mycp);
1604         } else {
1605                 /*
1606                  *      Else find the first one that matches
1607                  */
1608                 for (ci = cs->children; ci; ci = ci->next) {
1609                         if (ci->type == CONF_ITEM_PAIR) {
1610                                 return cf_itemtopair(ci);
1611                         }
1612                 }
1613         }
1614
1615         if (cp || !cs->template) return cp;
1616
1617         return cf_pair_find(cs->template, name);
1618 }
1619
1620 /*
1621  * Return the attr of a CONF_PAIR
1622  */
1623
1624 char *cf_pair_attr(CONF_PAIR *pair)
1625 {
1626         return (pair ? pair->attr : NULL);
1627 }
1628
1629 /*
1630  * Return the value of a CONF_PAIR
1631  */
1632
1633 char *cf_pair_value(CONF_PAIR *pair)
1634 {
1635         return (pair ? pair->value : NULL);
1636 }
1637
1638 /*
1639  *      Copied here for error reporting.
1640  */
1641 extern void librad_log(const char *, ...);
1642
1643 /*
1644  * Turn a CONF_PAIR into a VALUE_PAIR
1645  * For now, ignore the "value_type" field...
1646  */
1647 VALUE_PAIR *cf_pairtovp(CONF_PAIR *pair)
1648 {
1649         DICT_ATTR *da;
1650         VALUE_PAIR *vp;
1651
1652         if (!pair) {
1653                 librad_log("Internal error");
1654                 return NULL;
1655         }
1656
1657         da = dict_attrbyname(pair->attr);
1658         if (!da) {
1659                 librad_log("Unknown attribute %s", pair->attr);
1660                 return NULL;
1661         }
1662
1663         if (!pair->value) {
1664                 librad_log("No value given for attribute %s", pair->attr);
1665                 return NULL;
1666         }
1667
1668         vp = pairalloc(da);
1669         if (!vp) {
1670                 librad_log("Out of memory");
1671                 return NULL;
1672         }
1673
1674         vp->operator = pair->operator;
1675
1676         if ((pair->value_type == T_BARE_WORD) ||
1677             (pair->value_type == T_SINGLE_QUOTED_STRING)) {
1678                 if (!pairparsevalue(vp, pair->value)) {
1679                         pairfree(&vp);
1680                         return NULL;
1681                 }
1682                 vp->flags.do_xlat = 0;
1683         } else {
1684                 vp->flags.do_xlat = 1;
1685         }
1686
1687         return vp;
1688 }
1689
1690 /*
1691  * Return the first label of a CONF_SECTION
1692  */
1693
1694 const char *cf_section_name1(const CONF_SECTION *cs)
1695 {
1696         return (cs ? cs->name1 : NULL);
1697 }
1698
1699 /*
1700  * Return the second label of a CONF_SECTION
1701  */
1702
1703 const char *cf_section_name2(const CONF_SECTION *cs)
1704 {
1705         return (cs ? cs->name2 : NULL);
1706 }
1707
1708 /*
1709  * Find a value in a CONF_SECTION
1710  */
1711 char *cf_section_value_find(const CONF_SECTION *cs, const char *attr)
1712 {
1713         CONF_PAIR       *cp;
1714
1715         cp = cf_pair_find(cs, attr);
1716
1717         return (cp ? cp->value : NULL);
1718 }
1719
1720 /*
1721  * Return the next pair after a CONF_PAIR
1722  * with a certain name (char *attr) If the requested
1723  * attr is NULL, any attr matches.
1724  */
1725
1726 CONF_PAIR *cf_pair_find_next(const CONF_SECTION *cs,
1727                              const CONF_PAIR *pair, const char *attr)
1728 {
1729         CONF_ITEM       *ci;
1730
1731         /*
1732          * If pair is NULL this must be a first time run
1733          * Find the pair with correct name
1734          */
1735
1736         if (pair == NULL){
1737                 return cf_pair_find(cs, attr);
1738         }
1739
1740         ci = cf_pairtoitem(pair)->next;
1741
1742         for (; ci; ci = ci->next) {
1743                 if (ci->type != CONF_ITEM_PAIR)
1744                         continue;
1745                 if (attr == NULL || strcmp(cf_itemtopair(ci)->attr, attr) == 0)
1746                         break;
1747         }
1748
1749         return cf_itemtopair(ci);
1750 }
1751
1752 /*
1753  * Find a CONF_SECTION, or return the root if name is NULL
1754  */
1755
1756 CONF_SECTION *cf_section_find(const char *name)
1757 {
1758         if (name)
1759                 return cf_section_sub_find(mainconfig.config, name);
1760         else
1761                 return mainconfig.config;
1762 }
1763
1764 /*
1765  * Find a sub-section in a section
1766  */
1767
1768 CONF_SECTION *cf_section_sub_find(const CONF_SECTION *cs, const char *name)
1769 {
1770         CONF_ITEM *ci;
1771
1772         /*
1773          *      Do the fast lookup if possible.
1774          */
1775         if (name && cs->section_tree) {
1776                 CONF_SECTION mycs;
1777
1778                 mycs.name1 = name;
1779                 mycs.name2 = NULL;
1780                 return rbtree_finddata(cs->section_tree, &mycs);
1781         }
1782
1783         for (ci = cs->children; ci; ci = ci->next) {
1784                 if (ci->type != CONF_ITEM_SECTION)
1785                         continue;
1786                 if (strcmp(cf_itemtosection(ci)->name1, name) == 0)
1787                         break;
1788         }
1789
1790         return cf_itemtosection(ci);
1791
1792 }
1793
1794
1795 /*
1796  *      Find a CONF_SECTION with both names.
1797  */
1798 CONF_SECTION *cf_section_sub_find_name2(const CONF_SECTION *cs,
1799                                         const char *name1, const char *name2)
1800 {
1801         CONF_ITEM    *ci;
1802
1803         if (!cs) cs = mainconfig.config;
1804
1805         if (name1 && (cs->section_tree)) {
1806                 CONF_SECTION mycs, *master_cs;
1807
1808                 mycs.name1 = name1;
1809                 mycs.name2 = name2;
1810
1811                 master_cs = rbtree_finddata(cs->section_tree, &mycs);
1812                 if (master_cs) {
1813                         return rbtree_finddata(master_cs->name2_tree, &mycs);
1814                 }
1815         }
1816
1817         /*
1818          *      Else do it the old-fashioned way.
1819          */
1820         for (ci = cs->children; ci; ci = ci->next) {
1821                 CONF_SECTION *subcs;
1822
1823                 if (ci->type != CONF_ITEM_SECTION)
1824                         continue;
1825
1826                 subcs = cf_itemtosection(ci);
1827                 if (!name1) {
1828                         if (!subcs->name2) {
1829                                 if (strcmp(subcs->name1, name2) == 0) break;
1830                         } else {
1831                                 if (strcmp(subcs->name2, name2) == 0) break;
1832                         }
1833                         continue; /* don't do the string comparisons below */
1834                 }
1835
1836                 if ((strcmp(subcs->name1, name1) == 0) &&
1837                     (subcs->name2 != NULL) &&
1838                     (strcmp(subcs->name2, name2) == 0))
1839                         break;
1840         }
1841
1842         return cf_itemtosection(ci);
1843 }
1844
1845 /*
1846  * Return the next subsection after a CONF_SECTION
1847  * with a certain name1 (char *name1). If the requested
1848  * name1 is NULL, any name1 matches.
1849  */
1850
1851 CONF_SECTION *cf_subsection_find_next(CONF_SECTION *section,
1852                                       CONF_SECTION *subsection,
1853                                       const char *name1)
1854 {
1855         CONF_ITEM       *ci;
1856
1857         /*
1858          * If subsection is NULL this must be a first time run
1859          * Find the subsection with correct name
1860          */
1861
1862         if (subsection == NULL){
1863                 ci = section->children;
1864         } else {
1865                 ci = cf_sectiontoitem(subsection)->next;
1866         }
1867
1868         for (; ci; ci = ci->next) {
1869                 if (ci->type != CONF_ITEM_SECTION)
1870                         continue;
1871                 if ((name1 == NULL) ||
1872                     (strcmp(cf_itemtosection(ci)->name1, name1) == 0))
1873                         break;
1874         }
1875
1876         return cf_itemtosection(ci);
1877 }
1878
1879
1880 /*
1881  * Return the next section after a CONF_SECTION
1882  * with a certain name1 (char *name1). If the requested
1883  * name1 is NULL, any name1 matches.
1884  */
1885
1886 CONF_SECTION *cf_section_find_next(CONF_SECTION *section,
1887                                    CONF_SECTION *subsection,
1888                                    const char *name1)
1889 {
1890         if (!section->item.parent) return NULL;
1891
1892         return cf_subsection_find_next(section->item.parent, subsection, name1);
1893 }
1894
1895 /*
1896  * Return the next item after a CONF_ITEM.
1897  */
1898
1899 CONF_ITEM *cf_item_find_next(CONF_SECTION *section, CONF_ITEM *item)
1900 {
1901         /*
1902          * If item is NULL this must be a first time run
1903          * Return the first item
1904          */
1905
1906         if (item == NULL) {
1907                 return section->children;
1908         } else {
1909                 return item->next;
1910         }
1911 }
1912
1913 int cf_section_lineno(CONF_SECTION *section)
1914 {
1915         return cf_sectiontoitem(section)->lineno;
1916 }
1917
1918 const char *cf_pair_filename(CONF_PAIR *pair)
1919 {
1920         return cf_pairtoitem(pair)->filename;
1921 }
1922
1923 const char *cf_section_filename(CONF_SECTION *section)
1924 {
1925         return cf_sectiontoitem(section)->filename;
1926 }
1927
1928 int cf_pair_lineno(CONF_PAIR *pair)
1929 {
1930         return cf_pairtoitem(pair)->lineno;
1931 }
1932
1933 int cf_item_is_section(CONF_ITEM *item)
1934 {
1935         return item->type == CONF_ITEM_SECTION;
1936 }
1937 int cf_item_is_pair(CONF_ITEM *item)
1938 {
1939         return item->type == CONF_ITEM_PAIR;
1940 }
1941
1942
1943 static CONF_DATA *cf_data_alloc(CONF_SECTION *parent, const char *name,
1944                                 void *data, void (*data_free)(void *))
1945 {
1946         CONF_DATA *cd;
1947
1948         cd = rad_malloc(sizeof(*cd));
1949         memset(cd, 0, sizeof(*cd));
1950
1951         cd->item.type = CONF_ITEM_DATA;
1952         cd->item.parent = parent;
1953         cd->name = strdup(name);
1954         cd->data = data;
1955         cd->free = data_free;
1956
1957         return cd;
1958 }
1959
1960
1961 static void *cf_data_find_internal(CONF_SECTION *cs, const char *name,
1962                                    int flag)
1963 {
1964         if (!cs || !name) return NULL;
1965
1966         /*
1967          *      Find the name in the tree, for speed.
1968          */
1969         if (cs->data_tree) {
1970                 CONF_DATA mycd;
1971
1972                 mycd.name = name;
1973                 mycd.flag = flag;
1974                 return rbtree_finddata(cs->data_tree, &mycd);
1975         }
1976
1977         return NULL;
1978 }
1979
1980 /*
1981  *      Find data from a particular section.
1982  */
1983 void *cf_data_find(CONF_SECTION *cs, const char *name)
1984 {
1985         CONF_DATA *cd = cf_data_find_internal(cs, name, 0);
1986
1987         if (cd) return cd->data;
1988         return NULL;
1989 }
1990
1991
1992 /*
1993  *      Add named data to a configuration section.
1994  */
1995 static int cf_data_add_internal(CONF_SECTION *cs, const char *name,
1996                                 void *data, void (*data_free)(void *),
1997                                 int flag)
1998 {
1999         CONF_DATA *cd;
2000
2001         if (!cs || !name) return -1;
2002
2003         /*
2004          *      Already exists.  Can't add it.
2005          */
2006         if (cf_data_find_internal(cs, name, flag) != NULL) return -1;
2007
2008         cd = cf_data_alloc(cs, name, data, data_free);
2009         if (!cd) return -1;
2010         cd->flag = flag;
2011
2012         cf_item_add(cs, cf_datatoitem(cd));
2013
2014         return 0;
2015 }
2016
2017 /*
2018  *      Add named data to a configuration section.
2019  */
2020 int cf_data_add(CONF_SECTION *cs, const char *name,
2021                 void *data, void (*data_free)(void *))
2022 {
2023         return cf_data_add_internal(cs, name, data, data_free, 0);
2024 }
2025
2026
2027 /*
2028  *      Copy CONF_DATA from src to dst
2029  */
2030 static void cf_section_copy_data(CONF_SECTION *s, CONF_SECTION *d)
2031 {
2032
2033         CONF_ITEM *cd, *next, **last;
2034
2035         /*
2036          *      Don't check if s->data_tree is NULL.  It's child
2037          *      sections may have data, even if this section doesn't.
2038          */
2039
2040         rad_assert(d->data_tree == NULL);
2041         d->data_tree = s->data_tree;
2042         s->data_tree = NULL;
2043
2044         /*
2045          *      Walk through src, moving CONF_ITEM_DATA
2046          *      to dst, by hand.
2047          */
2048         last = &(s->children);
2049         for (cd = s->children; cd != NULL; cd = next) {
2050                 next = cd->next;
2051
2052                 /*
2053                  *      Recursively copy data from child sections.
2054                  */
2055                 if (cd->type == CONF_ITEM_SECTION) {
2056                         CONF_SECTION *s1, *d1;
2057
2058                         s1 = cf_itemtosection(cd);
2059                         d1 = cf_section_sub_find_name2(d, s1->name1, s1->name2);
2060                         if (d1) {
2061                                 cf_section_copy_data(s1, d1);
2062                         }
2063                         last = &(cd->next);
2064                         continue;
2065                 }
2066
2067                 /*
2068                  *      Not conf data, remember last ptr.
2069                  */
2070                 if (cd->type != CONF_ITEM_DATA) {
2071                         last = &(cd->next);
2072                         continue;
2073                 }
2074
2075                 /*
2076                  *      Remove it from the src list
2077                  */
2078                 *last = cd->next;
2079                 cd->next = NULL;
2080
2081                 /*
2082                  *      Add it to the dst list
2083                  */
2084                 if (!d->children) {
2085                         rad_assert(d->tail == NULL);
2086                         d->children = cd;
2087                 } else {
2088                         rad_assert(d->tail != NULL);
2089                         d->tail->next = cd;
2090                 }
2091                 d->tail = cd;
2092         }
2093 }
2094
2095 /*
2096  *      For a CONF_DATA element, stat the filename, if necessary.
2097  */
2098 static int filename_stat(void *context, void *data)
2099 {
2100         struct stat buf;
2101         CONF_DATA *cd = data;
2102
2103         context = context;      /* -Wunused */
2104
2105         if (cd->flag != PW_TYPE_FILENAME) return 0;
2106
2107         if (stat(cd->name, &buf) < 0) return -1;
2108
2109         if (buf.st_mtime != *(time_t *) cd->data) return -1;
2110
2111         return 0;
2112 }
2113
2114
2115 /*
2116  *      Compare two CONF_SECTIONS.  The items MUST be in the same
2117  *      order.
2118  */
2119 static int cf_section_cmp(CONF_SECTION *a, CONF_SECTION *b)
2120 {
2121         CONF_ITEM *ca = a->children;
2122         CONF_ITEM *cb = b->children;
2123
2124         while (1) {
2125                 CONF_PAIR *pa, *pb;
2126
2127                 /*
2128                  *      Done.  Stop.
2129                  */
2130                 if (!ca && !cb) break;
2131
2132                 /*
2133                  *      Skip CONF_DATA.
2134                  */
2135                 if (ca && ca->type == CONF_ITEM_DATA) {
2136                         ca = ca->next;
2137                         continue;
2138                 }
2139                 if (cb && cb->type == CONF_ITEM_DATA) {
2140                         cb = cb->next;
2141                         continue;
2142                 }
2143
2144                 /*
2145                  *      One is smaller than the other.  Exit.
2146                  */
2147                 if (!ca || !cb) return 0;
2148
2149                 if (ca->type != cb->type) return 0;
2150
2151                 /*
2152                  *      Deal with subsections.
2153                  */
2154                 if (ca->type == CONF_ITEM_SECTION) {
2155                         CONF_SECTION *sa = cf_itemtosection(ca);
2156                         CONF_SECTION *sb = cf_itemtosection(cb);
2157
2158                         if (!cf_section_cmp(sa, sb)) return 0;
2159                         goto next;
2160                 }
2161
2162                 rad_assert(ca->type == CONF_ITEM_PAIR);
2163
2164                 pa = cf_itemtopair(ca);
2165                 pb = cf_itemtopair(cb);
2166
2167                 /*
2168                  *      Different attr and/or value, Exit.
2169                  */
2170                 if ((strcmp(pa->attr, pb->attr) != 0) ||
2171                     (strcmp(pa->value, pb->value) != 0)) return 0;
2172
2173
2174                 /*
2175                  *      And go to the next element.
2176                  */
2177         next:
2178                 ca = ca->next;
2179                 cb = cb->next;
2180         }
2181
2182         /*
2183          *      Walk over the CONF_DATA, stat'ing PW_TYPE_FILENAME.
2184          */
2185         if (a->data_tree &&
2186             (rbtree_walk(a->data_tree, InOrder, filename_stat, NULL) != 0)) {
2187                 return 0;
2188         }
2189
2190         /*
2191          *      They must be the same, say so.
2192          */
2193         return 1;
2194 }
2195
2196
2197 /*
2198  *      Migrate CONF_DATA from one section to another.
2199  */
2200 int cf_section_migrate(CONF_SECTION *dst, CONF_SECTION *src)
2201 {
2202         CONF_ITEM *ci;
2203         CONF_SECTION *s, *d;
2204
2205         for (ci = src->children; ci != NULL; ci = ci->next) {
2206                 if (ci->type != CONF_ITEM_SECTION)
2207                         continue;
2208
2209                 s = cf_itemtosection(ci);
2210                 d = cf_section_sub_find_name2(dst, s->name1, s->name2);
2211
2212                 if (!d) continue; /* not in new one, don't migrate it */
2213
2214                 /*
2215                  *      A section of the same name is in BOTH src & dst,
2216                  *      compare the CONF_PAIR's.  If they're all the same,
2217                  *      then copy the CONF_DATA from one to the other.
2218                  */
2219                 if (cf_section_cmp(s, d)) {
2220                         cf_section_copy_data(s, d);
2221                 }
2222         }
2223
2224         return 1;               /* rcode means anything? */
2225 }
2226
2227 int cf_section_template(CONF_SECTION *cs, CONF_SECTION *template)
2228 {
2229         if (!cs || !template || cs->template || template->template) return -1;
2230
2231         cs->template = template;
2232
2233         return 0;
2234 }
2235
2236
2237 /*
2238  *      This is here to make the rest of the code easier to read.  It
2239  *      ties conffile.c to log.c, but it means we don't have to
2240  *      pollute the 
2241  */
2242 void cf_log_err(CONF_ITEM *ci, const char *fmt, ...)
2243 {
2244         va_list ap;
2245         char buffer[256];
2246
2247         va_start(ap, fmt);
2248         vsnprintf(buffer, sizeof(buffer), fmt, ap);
2249         va_end(ap);
2250
2251         radlog(L_ERR, "%s[%d]: %s", ci->filename, ci->lineno, buffer);
2252 }
2253
2254
2255 #if 0
2256 /*
2257  * JMG dump_config tries to dump the config structure in a readable format
2258  *
2259 */
2260
2261 static int dump_config_section(CONF_SECTION *cs, int indent)
2262 {
2263         CONF_SECTION    *scs;
2264         CONF_PAIR       *cp;
2265         CONF_ITEM       *ci;
2266
2267         /* The DEBUG macro doesn't let me
2268          *   for(i=0;i<indent;++i) debugputchar('\t');
2269          * so I had to get creative. --Pac. */
2270
2271         for (ci = cs->children; ci; ci = ci->next) {
2272                 switch (ci->type) {
2273                 case CONF_ITEM_PAIR:
2274                         cp=cf_itemtopair(ci);
2275                         DEBUG("%.*s%s = %s",
2276                                 indent, "\t\t\t\t\t\t\t\t\t\t\t",
2277                                 cp->attr, cp->value);
2278                         break;
2279
2280                 case CONF_ITEM_SECTION:
2281                         scs=cf_itemtosection(ci);
2282                         DEBUG("%.*s%s %s%s{",
2283                                 indent, "\t\t\t\t\t\t\t\t\t\t\t",
2284                                 scs->name1,
2285                                 scs->name2 ? scs->name2 : "",
2286                                 scs->name2 ?  " " : "");
2287                         dump_config_section(scs, indent+1);
2288                         DEBUG("%.*s}",
2289                                 indent, "\t\t\t\t\t\t\t\t\t\t\t");
2290                         break;
2291
2292                 default:        /* FIXME: Do more! */
2293                         break;
2294                 }
2295         }
2296
2297         return 0;
2298 }
2299
2300 int dump_config(CONF_SECTION *cs)
2301 {
2302         return dump_config_section(cs, 0);
2303 }
2304 #endif