implemented atime handling, rules maintain a timestamp when they where last triggered
[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* namestart = strchr (buf, ':');
35       char* rxstart = namestart? strchr (namestart+1, ':') : NULL;
36
37       if (!rxstart)
38         self->string = rxpd_strdup ("#ERROR: Syntax error, line was neither a comment nor a rule");
39       else
40         {
41           if (namestart == buf)
42             /* No atime given */
43             self->atime = (time_t)-1;
44           else
45             {
46               /* atime given */
47               self->atime = atoi (buf);
48               if (!self->atime)
49                 /* atime was zero or not set */
50                 self->atime = time (NULL)-1;
51             }
52
53           // TODO regflags from base
54           err = regcomp (&self->rx, rxstart+1, REG_EXTENDED|REG_ICASE|REG_NOSUB);
55
56           if (!err)
57             self->string = rxpd_strdup (namestart+1);
58           else
59             {
60               regfree (&self->rx);
61               char ebuf[256];
62               size_t len = regerror (err, NULL, ebuf, 256);
63               self->string = rxpd_malloc (len + strlen(namestart+1) + 14);
64               strcpy (self->string, "#ERROR: ");
65               strcat (self->string, ebuf);
66               strcat (self->string, " in '");
67               strcat (self->string, namestart+1);
68               strcat (self->string, "'");
69             }
70         }
71     }
72   else
73     {
74       self->atime = (time_t)-1;
75       self->string = rxpd_strdup (buf);
76     }
77
78   return self;
79 }
80
81 void
82 rxpd_rule_delete (struct rxpd_rule* rule)
83 {
84   if (rule)
85     {
86       llist_unlink (&rule->node);
87       if (rule->string[0] != '#')
88         regfree (&rule->rx);
89       free (rule->string);
90       free(rule);
91     }
92 }
93
94