factored the source into smaller files covering single functionality
[rxpd] / src / rxpd_rule.c
1 /*
2     rxpd_rule.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 struct rxpd_rule*
25 rxpd_rule_new (const char* buf)
26 {
27   struct rxpd_rule* self = rxpd_malloc (sizeof (struct rxpd_rule));
28
29   llist_init (&self->node);
30
31   if (*buf != '#')
32     {
33       int err;
34       char* rxstart = strchr (buf, ':');
35
36       if (!rxstart)
37         self->string = rxpd_strdup ("#ERROR: Syntax error, line was neither a comment nor a rule");
38       else
39         {
40           // TODO regflags from base
41           err = regcomp (&self->rx, rxstart+1, REG_EXTENDED|REG_ICASE|REG_NOSUB);
42
43           if (!err)
44             self->string = rxpd_strdup (buf);
45           else
46             {
47               regfree (&self->rx);
48               char ebuf[256];
49               size_t len = regerror (err, NULL, ebuf, 256);
50               self->string = rxpd_malloc (len + strlen(buf) + 14);
51               strcpy (self->string, "#ERROR: ");
52               strcat (self->string, ebuf);
53               strcat (self->string, " in '");
54               strcat (self->string, buf);
55               strcat (self->string, "'");
56             }
57         }
58     }
59   else
60     self->string = rxpd_strdup (buf);
61
62   return self;
63 }
64
65 void
66 rxpd_rule_delete (struct rxpd_rule* rule)
67 {
68   if (rule)
69     {
70       llist_unlink (&rule->node);
71       if (rule->string[0] != '#')
72         regfree (&rule->rx);
73       free (rule->string);
74       free(rule);
75     }
76 }
77
78