1/* 2** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. 3** Distributed under the terms of the OpenBeOS 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