Fail safely if the directory exists in rad_mkdir
[freeradius.git] / src / main / util.c
1 /*
2  * util.c       Various utility functions.
3  *
4  * Version:     $Id$
5  *
6  *   This program is free software; you can redistribute it and/or modify
7  *   it under the terms of the GNU General Public License as published by
8  *   the Free Software Foundation; either version 2 of the License, or
9  *   (at your option) any later version.
10  *
11  *   This program is distributed in the hope that it will be useful,
12  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *   GNU General Public License for more details.
15  *
16  *   You should have received a copy of the GNU General Public License
17  *   along with this program; if not, write to the Free Software
18  *   Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  *
20  * Copyright 2000,2006  The FreeRADIUS server project
21  */
22
23 #include <freeradius-devel/ident.h>
24 RCSID("$Id$")
25
26 #include <freeradius-devel/radiusd.h>
27 #include <freeradius-devel/rad_assert.h>
28
29 #include <ctype.h>
30 #include <signal.h>
31
32 #include <sys/stat.h>
33 #include <fcntl.h>
34
35 /*
36  *      The signal() function in Solaris 2.5.1 sets SA_NODEFER in
37  *      sa_flags, which causes grief if signal() is called in the
38  *      handler before the cause of the signal has been cleared.
39  *      (Infinite recursion).
40  *
41  *      The same problem appears on HPUX, so we avoid it, if we can.
42  *
43  *      Using sigaction() to reset the signal handler fixes the problem,
44  *      so where available, we prefer that solution.
45  */
46
47 void (*reset_signal(int signo, void (*func)(int)))(int)
48 {
49 #ifdef HAVE_SIGACTION
50         struct sigaction act, oact;
51
52         memset(&act, 0, sizeof(act));
53         act.sa_handler = func;
54         sigemptyset(&act.sa_mask);
55         act.sa_flags = 0;
56 #ifdef  SA_INTERRUPT            /* SunOS */
57         act.sa_flags |= SA_INTERRUPT;
58 #endif
59         if (sigaction(signo, &act, &oact) < 0)
60                 return SIG_ERR;
61         return oact.sa_handler;
62 #else
63
64         /*
65          *      re-set by calling the 'signal' function, which
66          *      may cause infinite recursion and core dumps due to
67          *      stack growth.
68          *
69          *      However, the system is too dumb to implement sigaction(),
70          *      so we don't have a choice.
71          */
72         signal(signo, func);
73
74         return NULL;
75 #endif
76 }
77
78 /*
79  *      Per-request data, added by modules...
80  */
81 struct request_data_t {
82         request_data_t  *next;
83
84         void            *unique_ptr;
85         int             unique_int;
86         void            *opaque;
87         void            (*free_opaque)(void *);
88 };
89
90 /*
91  *      Add opaque data (with a "free" function) to a REQUEST.
92  *
93  *      The unique ptr is meant to be a malloc'd module configuration,
94  *      and the unique integer allows the caller to have multiple
95  *      opaque data associated with a REQUEST.
96  */
97 int request_data_add(REQUEST *request,
98                      void *unique_ptr, int unique_int,
99                      void *opaque, void (*free_opaque)(void *))
100 {
101         request_data_t *this, **last, *next;
102
103         /*
104          *      Some simple sanity checks.
105          */
106         if (!request || !opaque) return -1;
107
108         this = next = NULL;
109         for (last = &(request->data); *last != NULL; last = &((*last)->next)) {
110                 if (((*last)->unique_ptr == unique_ptr) &&
111                     ((*last)->unique_int == unique_int)) {
112                         this = *last;
113
114                         next = this->next;
115
116                         if (this->opaque && /* free it, if necessary */
117                             this->free_opaque)
118                                 this->free_opaque(this->opaque);
119                         break;  /* replace the existing entry */
120                 }
121         }
122
123         if (!this) this = rad_malloc(sizeof(*this));
124         memset(this, 0, sizeof(*this));
125
126         this->next = next;
127         this->unique_ptr = unique_ptr;
128         this->unique_int = unique_int;
129         this->opaque = opaque;
130         this->free_opaque = free_opaque;
131
132         *last = this;
133
134         return 0;
135 }
136
137
138 /*
139  *      Get opaque data from a request.
140  */
141 void *request_data_get(REQUEST *request,
142                        void *unique_ptr, int unique_int)
143 {
144         request_data_t **last;
145
146         if (!request) return NULL;
147
148         for (last = &(request->data); *last != NULL; last = &((*last)->next)) {
149                 if (((*last)->unique_ptr == unique_ptr) &&
150                     ((*last)->unique_int == unique_int)) {
151                         request_data_t *this = *last;
152                         void *ptr = this->opaque;
153
154                         /*
155                          *      Remove the entry from the list, and free it.
156                          */
157                         *last = this->next;
158                         free(this);
159                         return ptr; /* don't free it, the caller does that */
160                 }
161         }
162
163         return NULL;            /* wasn't found, too bad... */
164 }
165
166
167 /*
168  *      Get opaque data from a request without removing it.
169  */
170 void *request_data_reference(REQUEST *request,
171                        void *unique_ptr, int unique_int)
172 {
173         request_data_t **last;
174
175         for (last = &(request->data); *last != NULL; last = &((*last)->next)) {
176                 if (((*last)->unique_ptr == unique_ptr) &&
177                     ((*last)->unique_int == unique_int)) {
178                         request_data_t *this = *last;
179                         void *ptr = this->opaque;
180
181                         return ptr;
182                 }
183         }
184
185         return NULL;            /* wasn't found, too bad... */
186 }
187
188
189 /*
190  *      Free a REQUEST struct.
191  */
192 void request_free(REQUEST **request_ptr)
193 {
194         REQUEST *request;
195
196         if ((request_ptr == NULL) || !*request_ptr)
197                 return;
198
199         request = *request_ptr;
200
201         rad_assert(!request->in_request_hash);
202 #ifdef WITH_PROXY
203         rad_assert(!request->in_proxy_hash);
204 #endif
205         rad_assert(!request->ev);
206
207         if (request->packet)
208                 rad_free(&request->packet);
209
210 #ifdef WITH_PROXY
211         if (request->proxy)
212                 rad_free(&request->proxy);
213 #endif
214
215         if (request->reply)
216                 rad_free(&request->reply);
217
218 #ifdef WITH_PROXY
219         if (request->proxy_reply)
220                 rad_free(&request->proxy_reply);
221 #endif
222
223         if (request->config_items)
224                 pairfree(&request->config_items);
225
226         request->username = NULL;
227         request->password = NULL;
228
229         if (request->data) {
230                 request_data_t *this, *next;
231
232                 for (this = request->data; this != NULL; this = next) {
233                         next = this->next;
234                         if (this->opaque && /* free it, if necessary */
235                             this->free_opaque)
236                                 this->free_opaque(this->opaque);
237                         free(this);
238                 }
239                 request->data = NULL;
240         }
241
242         if (request->root &&
243             (request->root->refcount > 0)) {
244                 request->root->refcount--;
245                 request->root = NULL;
246         }
247
248 #ifdef WITH_COA
249         if (request->coa) {
250                 request->coa->parent = NULL;
251                 rad_assert(request->coa->ev == NULL);
252                 request_free(&request->coa);
253         }
254
255         if (request->parent && (request->parent->coa == request)) {
256                 request->parent->coa = NULL;
257         }
258 #endif
259
260 #ifndef NDEBUG
261         request->magic = 0x01020304;    /* set the request to be nonsense */
262 #endif
263         request->client = NULL;
264 #ifdef WITH_PROXY
265         request->home_server = NULL;
266 #endif
267         free(request);
268
269         *request_ptr = NULL;
270 }
271
272 /*
273  *      Check a filename for sanity.
274  *
275  *      Allow only uppercase/lowercase letters, numbers, and '-_/.'
276  */
277 int rad_checkfilename(const char *filename)
278 {
279         if (strspn(filename, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_/.") == strlen(filename)) {
280                 return 0;
281         }
282
283         return -1;
284 }
285
286 /*
287  *      Create possibly many directories.
288  *
289  *      Note that the input directory name is NOT a constant!
290  *      This is so that IF an error is returned, the 'directory' ptr
291  *      points to the name of the file which caused the error.
292  */
293 int rad_mkdir(char *directory, mode_t mode)
294 {
295         int rcode;
296         char *p;
297         struct stat st;
298
299         /*
300          *      If the directory exists, don't do anything.
301          */
302         if (stat(directory, &st) == 0) {
303                 return 0;
304         }
305
306         /*
307          *      Look for the LAST directory name.  Try to create that,
308          *      failing on any error.
309          */
310         p = strrchr(directory, FR_DIR_SEP);
311         if (p != NULL) {
312                 *p = '\0';
313                 rcode = rad_mkdir(directory, mode);
314
315                 /*
316                  *      On error, we leave the directory name as the
317                  *      one which caused the error.
318                  */
319                 if (rcode < 0) {
320                         if (errno == EEXIST) return 0;
321                         return rcode;
322                 }
323
324                 /*
325                  *      Reset the directory delimiter, and go ask
326                  *      the system to make the directory.
327                  */
328                 *p = FR_DIR_SEP;
329         } else {
330                 return 0;
331         }
332
333         /*
334          *      Having done everything successfully, we do the
335          *      system call to actually go create the directory.
336          */
337         rcode = mkdir(directory, mode & 0777);
338         if (rcode < 0) {
339                 return rcode;
340         }
341         
342         /*
343          *      Set things like sticky bits that aren't supported by
344          *      mkdir.
345          */
346         if (mode & ~0777) {
347                 rcode = chmod(directory, mode);
348         }
349         
350         return rcode;
351 }
352
353
354 /*
355  *      Module malloc() call, which does stuff if the malloc fails.
356  *
357  *      This call ALWAYS succeeds!
358  */
359 void *rad_malloc(size_t size)
360 {
361         void *ptr = malloc(size);
362
363         if (ptr == NULL) {
364                 radlog(L_ERR, "no memory");
365                 exit(1);
366         }
367
368         return ptr;
369 }
370
371
372 void *rad_calloc(size_t size)
373 {
374         void *ptr = rad_malloc(size);
375         memset(ptr, 0, size);
376         return ptr;
377 }
378
379 /*
380  *      Signature for free is dumb, and raises errors when we try
381  *      to free const ptrs.
382  */
383 void rad_cfree(const void *ptr)
384 {
385         void *tmp;
386         if (!ptr) return;
387
388         memcpy(&tmp, &ptr, sizeof(tmp));
389         free(tmp);
390 }
391
392 /*
393  *      Logs an error message and aborts the program
394  *
395  */
396
397 void NEVER_RETURNS rad_assert_fail (const char *file, unsigned int line,
398                                     const char *expr)
399 {
400         radlog(L_ERR, "ASSERT FAILED %s[%u]: %s", file, line, expr);
401         abort();
402 }
403
404
405 /*
406  *      Create a new REQUEST data structure.
407  */
408 REQUEST *request_alloc(void)
409 {
410         REQUEST *request;
411
412         request = rad_malloc(sizeof(REQUEST));
413         memset(request, 0, sizeof(REQUEST));
414 #ifndef NDEBUG
415         request->magic = REQUEST_MAGIC;
416 #endif
417 #ifdef WITH_PROXY
418         request->proxy = NULL;
419 #endif
420         request->reply = NULL;
421 #ifdef WITH_PROXY
422         request->proxy_reply = NULL;
423 #endif
424         request->config_items = NULL;
425         request->username = NULL;
426         request->password = NULL;
427         request->timestamp = time(NULL);
428         request->options = debug_flag; /* Default to global debug level */
429
430         request->module = "";
431         request->component = "<core>";
432         if (debug_flag) request->radlog = radlog_request;
433
434         return request;
435 }
436
437
438 /*
439  *      Create a new REQUEST, based on an old one.
440  *
441  *      This function allows modules to inject fake requests
442  *      into the server, for tunneled protocols like TTLS & PEAP.
443  */
444 REQUEST *request_alloc_fake(REQUEST *request)
445 {
446   REQUEST *fake;
447
448   fake = request_alloc();
449
450   fake->number = request->number;
451 #ifdef HAVE_PTHREAD_H
452   fake->child_pid = request->child_pid;
453 #endif
454   fake->parent = request;
455   fake->root = request->root;
456   fake->client = request->client;
457
458   /*
459    *    For new server support.
460    *
461    *    FIXME: Key instead off of a "virtual server" data structure.
462    *
463    *    FIXME: Permit different servers for inner && outer sessions?
464    */
465   fake->server = request->server;
466
467   fake->packet = rad_alloc(1);
468   if (!fake->packet) {
469           request_free(&fake);
470           return NULL;
471   }
472
473   fake->reply = rad_alloc(0);
474   if (!fake->reply) {
475           request_free(&fake);
476           return NULL;
477   }
478
479   fake->master_state = REQUEST_ACTIVE;
480   fake->child_state = REQUEST_RUNNING;
481
482   /*
483    *    Fill in the fake request.
484    */
485   fake->packet->sockfd = -1;
486   fake->packet->src_ipaddr = request->packet->src_ipaddr;
487   fake->packet->src_port = request->packet->src_port;
488   fake->packet->dst_ipaddr = request->packet->dst_ipaddr;
489   fake->packet->dst_port = 0;
490
491   /*
492    *    This isn't STRICTLY required, as the fake request MUST NEVER
493    *    be put into the request list.  However, it's still reasonable
494    *    practice.
495    */
496   fake->packet->id = fake->number & 0xff;
497   fake->packet->code = request->packet->code;
498   fake->timestamp = request->timestamp;
499  
500   /*
501    *    Required for new identity support
502    */
503   fake->listener = request->listener;
504
505   /*
506    *    Fill in the fake reply, based on the fake request.
507    */
508   fake->reply->sockfd = fake->packet->sockfd;
509   fake->reply->src_ipaddr = fake->packet->dst_ipaddr;
510   fake->reply->src_port = fake->packet->dst_port;
511   fake->reply->dst_ipaddr = fake->packet->src_ipaddr;
512   fake->reply->dst_port = fake->packet->src_port;
513   fake->reply->id = fake->packet->id;
514   fake->reply->code = 0; /* UNKNOWN code */
515
516   /*
517    *    Copy debug information.
518    */
519   fake->options = request->options;
520   fake->radlog = request->radlog;
521
522   return fake;
523 }
524
525 #ifdef WITH_COA
526 REQUEST *request_alloc_coa(REQUEST *request)
527 {
528         if (!request || request->coa) return NULL;
529
530         /*
531          *      Originate CoA requests only when necessary.
532          */
533         if ((request->packet->code != PW_AUTHENTICATION_REQUEST) &&
534             (request->packet->code != PW_ACCOUNTING_REQUEST)) return NULL;
535
536         request->coa = request_alloc_fake(request);
537         if (!request->coa) return NULL;
538
539         request->coa->packet->code = 0; /* unknown, as of yet */
540         request->coa->child_state = REQUEST_RUNNING;
541         request->coa->proxy = rad_alloc(0);
542         if (!request->coa->proxy) {
543                 request_free(&request->coa);
544                 return NULL;
545         }
546
547         return request->coa;
548 }
549 #endif
550
551 /*
552  *      Copy a quoted string.
553  */
554 int rad_copy_string(char *to, const char *from)
555 {
556         int length = 0;
557         char quote = *from;
558
559         do {
560                 if (*from == '\\') {
561                         *(to++) = *(from++);
562                         length++;
563                 }
564                 *(to++) = *(from++);
565                 length++;
566         } while (*from && (*from != quote));
567
568         if (*from != quote) return -1; /* not properly quoted */
569
570         *(to++) = quote;
571         length++;
572         *to = '\0';
573
574         return length;
575 }
576
577
578 /*
579  *      Copy a %{} string.
580  */
581 int rad_copy_variable(char *to, const char *from)
582 {
583         int length = 0;
584         int sublen;
585
586         *(to++) = *(from++);
587         length++;
588
589         while (*from) {
590                 switch (*from) {
591                 case '"':
592                 case '\'':
593                         sublen = rad_copy_string(to, from);
594                         if (sublen < 0) return sublen;
595                         from += sublen;
596                         to += sublen;
597                         length += sublen;
598                         break;
599
600                 case '}':       /* end of variable expansion */
601                         *(to++) = *(from++);
602                         *to = '\0';
603                         length++;
604                         return length; /* proper end of variable */
605
606                 case '\\':
607                         *(to++) = *(from++);
608                         *(to++) = *(from++);
609                         length += 2;
610                         break;
611
612                 case '%':       /* start of variable expansion */
613                         if (from[1] == '{') {
614                                 *(to++) = *(from++);
615                                 length++;
616
617                                 sublen = rad_copy_variable(to, from);
618                                 if (sublen < 0) return sublen;
619                                 from += sublen;
620                                 to += sublen;
621                                 length += sublen;
622                                 break;
623                         } /* else FIXME: catch %%{ ?*/
624
625                         /* FALL-THROUGH */
626                 default:
627                         *(to++) = *(from++);
628                         length++;
629                         break;
630                 }
631         } /* loop over the input string */
632
633         /*
634          *      We ended the string before a trailing '}'
635          */
636
637         return -1;
638 }
639
640 #ifndef USEC
641 #define USEC 1000000
642 #endif
643
644 int rad_pps(int *past, int *present, time_t *then, struct timeval *now)
645 {
646         int pps;
647
648         if (*then != now->tv_sec) {
649                 *then = now->tv_sec;
650                 *past = *present;
651                 *present = 0;
652         }
653
654         /*
655          *      Bootstrap PPS by looking at a percentage of
656          *      the previous PPS.  This lets us take a moving
657          *      count, without doing a moving average.  If
658          *      we're a fraction "f" (0..1) into the current
659          *      second, we can get a good guess for PPS by
660          *      doing:
661          *
662          *      PPS = pps_now + pps_old * (1 - f)
663          *
664          *      It's an instantaneous measurement, rather than
665          *      a moving average.  This will hopefully let it
666          *      respond better to sudden spikes.
667          *
668          *      Doing the calculations by thousands allows us
669          *      to not overflow 2^32, AND to not underflow
670          *      when we divide by USEC.
671          */
672         pps = USEC - now->tv_usec; /* useconds left in previous second */
673         pps /= 1000;               /* scale to milliseconds */
674         pps *= *past;              /* multiply by past count to get fraction */
675         pps /= 1000;               /* scale to usec again */
676         pps += *present;           /* add in current count */
677
678         return pps;
679 }