cc517d7fd0707b764689228f0fc1026ee8f595c2
[rxpd] / src / rxpd_base.c
1 /*
2     rxpd_base.c - regex policy daemon
3
4   Copyright (C)
5     2007,               Christian Thaeter <ct@pipapo.org>
6
7   This program is free software; you can redistribute it and/or
8   modify it under the terms of the GNU General Public License as
9   published by the Free Software Foundation; either version 2 of the
10   License, or (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the Free Software
19   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "rxpd.h"
23
24 static struct rxpd_base global_base;
25
26 struct rxpd_base*
27 rxpd_init (void)
28 {
29   if (global_base.basedir)
30     return NULL;
31
32   global_base.basedir = NULL;
33
34   global_base.verbosity = LOG_WARNING;
35   global_base.daemonize = 0;
36   global_base.regflags = 0;
37   global_base.locale = NULL;
38   global_base.policy = NULL;
39
40   psplay_init_root (&global_base.files, rxpd_file_cmp, (psplay_delete_t)rxpd_file_delete);
41   llist_init (&global_base.sockets);
42
43   rxpd_log (&global_base, LOG_DEBUG, PACKAGE_NAME" initialized\n");
44   return &global_base;
45 }
46
47
48 void
49 rxpd_destroy (void)
50 {
51   if (global_base.basedir)
52     {
53       free (global_base.basedir);
54       psplay_destroy_root (&global_base.files);
55       LLIST_WHILE_HEAD (&global_base.sockets, n)
56         {
57           struct rxpd_socket* socket = (struct rxpd_socket*)n;
58           rxpd_socket_delete (socket);
59         }
60     }
61 }
62
63 void
64 rxpd_log (struct rxpd_base* self, int level, const char* fmt, ...)
65 {
66   va_list ap;
67   va_start (ap, fmt);
68   if (level <= (self?self->verbosity:LOG_DEBUG))
69     {
70       if (!self || self->daemonize)
71         vsyslog (level, fmt, ap);
72       vfprintf (stderr, fmt, ap);
73     }
74   va_end (ap);
75 }
76
77 void
78 rxpd_fail (struct rxpd_base* self, const char* fmt, ...)
79 {
80   va_list ap;
81   va_start (ap, fmt);
82   if (!self || self->daemonize)
83     vsyslog (LOG_ALERT, fmt, ap);
84   vfprintf (stderr, fmt, ap);
85   va_end (ap);
86   exit (EXIT_FAILURE);
87 }
88
89 void
90 rxpd_die (const char* fmt, ...)
91 {
92   va_list ap;
93   va_start(ap, fmt);
94   vsyslog (LOG_EMERG, fmt, ap);
95   vfprintf (stderr, fmt, ap);
96   va_end (ap);
97   abort ();
98 }
99
100 void*
101 rxpd_malloc (size_t size)
102 {
103   void* r;
104   r = malloc (size);
105   if (!r)
106     rxpd_die ("Out of Memeory\n");
107   return r;
108 }
109
110 char*
111 rxpd_strdup (const char* str)
112 {
113   char* r;
114   r = strdup (str);
115   if (!r)
116     rxpd_die ("Out of Memeory\n");
117   return r;
118 }
119
120 struct rxpd_base*
121 rxpd_set_basedir (struct rxpd_base* self, const char* basedir)
122 {
123   if (self && !self->basedir)
124     {
125       size_t sz = strlen (basedir);
126       if (basedir [sz-1] == '/')
127         {
128           self->basedir = rxpd_malloc (sz + 1);
129           strcpy (self->basedir, basedir);
130         }
131       else
132         {
133           self->basedir = rxpd_malloc (sz + 2);
134           strcpy (self->basedir, basedir);
135           self->basedir [sz] = '/';
136         }
137     }
138   return self;
139 }