1/*
2 * Copyright 2003-2015, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 */
5
6
7#include "listener_output.h"
8
9#include <stdio.h>
10
11
12static BLocker sLocker;
13static BList sListeners;
14
15
16static void
17listener_output(syslog_message& message)
18{
19	// compose the message to be sent to all listeners; just convert
20	// the syslog_message into a BMessage
21	BMessage output(SYSLOG_MESSAGE);
22
23	output.AddInt32("from", message.from);
24	output.AddInt32("when", message.when);
25	output.AddString("ident", message.ident);
26	output.AddString("message", message.message);
27	output.AddInt32("options", message.options);
28	output.AddInt32("priority", message.priority);
29
30	sLocker.Lock();
31
32	for (int32 i = sListeners.CountItems(); i-- > 0;) {
33		BMessenger* target = (BMessenger*)sListeners.ItemAt(i);
34
35		status_t status = target->SendMessage(&output);
36		if (status < B_OK) {
37			// remove targets once they can't be reached anymore
38			sListeners.RemoveItem(target);
39		}
40	}
41
42	sLocker.Unlock();
43}
44
45
46void
47remove_listener(BMessenger* messenger)
48{
49	if (sLocker.Lock()) {
50		sListeners.RemoveItem(messenger);
51
52		sLocker.Unlock();
53	}
54}
55
56
57void
58add_listener(BMessenger* messenger)
59{
60	if (sLocker.Lock()) {
61		sListeners.AddItem(messenger);
62
63		sLocker.Unlock();
64	}
65}
66
67
68void
69init_listener_output(SyslogDaemon* daemon)
70{
71	daemon->AddHandler(listener_output);
72}
73
74