chiark / gitweb /
The Login page now includes a form to request a password reminder
[disorder] / lib / eventlog.c
CommitLineData
460b9539 1/*
2 * This file is part of DisOrder
3 * Copyright (C) 2005 Richard Kettlewell
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
18 * USA
19 */
20
21#include <config.h>
22#include "types.h"
23
24#include <stdarg.h>
25#include <stdio.h>
26#include <string.h>
27
28#include "mem.h"
29#include "vector.h"
30#include "printf.h"
31#include "eventlog.h"
32#include "split.h"
33
34static struct eventlog_output *outputs;
35
36void eventlog_add(struct eventlog_output *lo) {
37 lo->next = outputs;
38 outputs = lo;
39}
40
41void eventlog_remove(struct eventlog_output *lo) {
42 struct eventlog_output *p, **pp;
43
44 for(pp = &outputs; (p = *pp) && p != lo; pp = &p->next)
45 ;
46 if(p == lo)
47 *pp = lo->next;
48}
49
50static void veventlog(const char *keyword, const char *raw, va_list ap) {
f6033c46 51 struct eventlog_output *p, *pnext;
460b9539 52 struct dynstr d;
53 const char *param;
54
55 dynstr_init(&d);
56 dynstr_append_string(&d, keyword);
57 while((param = va_arg(ap, const char *))) {
58 dynstr_append(&d, ' ');
59 dynstr_append_string(&d, quoteutf8(param));
60 }
61 if(raw) {
62 dynstr_append(&d, ' ');
63 dynstr_append_string(&d, raw);
64 }
65 dynstr_terminate(&d);
f6033c46
RK
66 for(p = outputs; p; p = pnext) {
67 /* We must be able to cope with eventlog_remove() being called from inside
68 * the callback */
cb9a695c 69 pnext = p->next;
460b9539 70 p->fn(d.vec, p->user);
f6033c46 71 }
460b9539 72}
73
74void eventlog_raw(const char *keyword, const char *raw, ...) {
75 va_list ap;
76
77 va_start(ap, raw);
78 veventlog(keyword, raw, ap);
79 va_end(ap);
80}
81
82void eventlog(const char *keyword, ...) {
83 va_list ap;
84
85 va_start(ap, keyword);
86 veventlog(keyword, 0, ap);
87 va_end(ap);
88}
89
90/*
91Local Variables:
92c-basic-offset:2
93comment-column:40
94fill-column:79
95End:
96*/