From 95f0fd901000d4488ebe9df9ef55fecf6c7ebe01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 13 Nov 2003 01:14:19 +0000 Subject: [PATCH] Implemented the syslog_daemon. Actual syslog output is not yet implemented; it currently only puts out everything to stdout. Is able to accept listeners who will get the syslog notes as well. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5340 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/servers/syslog_daemon/Jamfile | 13 ++ src/servers/syslog_daemon/SyslogDaemon.cpp | 165 ++++++++++++++++++ src/servers/syslog_daemon/SyslogDaemon.h | 42 +++++ src/servers/syslog_daemon/SyslogDaemon.rsrc | Bin 0 -> 4223 bytes src/servers/syslog_daemon/listener_output.cpp | 73 ++++++++ src/servers/syslog_daemon/listener_output.h | 16 ++ src/servers/syslog_daemon/syslog_output.cpp | 24 +++ src/servers/syslog_daemon/syslog_output.h | 12 ++ 8 files changed, 345 insertions(+) create mode 100644 src/servers/syslog_daemon/Jamfile create mode 100644 src/servers/syslog_daemon/SyslogDaemon.cpp create mode 100644 src/servers/syslog_daemon/SyslogDaemon.h create mode 100644 src/servers/syslog_daemon/SyslogDaemon.rsrc create mode 100644 src/servers/syslog_daemon/listener_output.cpp create mode 100644 src/servers/syslog_daemon/listener_output.h create mode 100644 src/servers/syslog_daemon/syslog_output.cpp create mode 100644 src/servers/syslog_daemon/syslog_output.h diff --git a/src/servers/syslog_daemon/Jamfile b/src/servers/syslog_daemon/Jamfile new file mode 100644 index 0000000000..a6615bfed6 --- /dev/null +++ b/src/servers/syslog_daemon/Jamfile @@ -0,0 +1,13 @@ +SubDir OBOS_TOP src servers syslog_daemon ; + +UsePrivateHeaders syslog_daemon ; + +AddResources syslog_daemon : SyslogDaemon.rsrc ; + +Server syslog_daemon : + SyslogDaemon.cpp + syslog_output.cpp + listener_output.cpp + ; + +LinkSharedOSLibs syslog_daemon : be ; diff --git a/src/servers/syslog_daemon/SyslogDaemon.cpp b/src/servers/syslog_daemon/SyslogDaemon.cpp new file mode 100644 index 0000000000..228ce3c2a8 --- /dev/null +++ b/src/servers/syslog_daemon/SyslogDaemon.cpp @@ -0,0 +1,165 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ + + +#include "SyslogDaemon.h" +#include "listener_output.h" +#include "syslog_output.h" + +#include +#include +#include +#include +#include + +#include +#include + + +const char *kSignature = "application/x-vnd.Be-SYSL"; + + +SyslogDaemon::SyslogDaemon() + : BApplication(kSignature), + fHandlerLock("handler lock") +{ +} + + +void +SyslogDaemon::ReadyToRun() +{ + fPort = create_port(256, SYSLOG_PORT_NAME); + fDaemon = spawn_thread(daemon_thread, "daemon", B_NORMAL_PRIORITY, this); + resume_thread(fDaemon); + + if (fPort >= B_OK && fDaemon >= B_OK) { + init_syslog_output(this); + init_listener_output(this); + } else + Quit(); +} + + +void +SyslogDaemon::AboutRequested() +{ + BPath path; + find_directory(B_COMMON_LOG_DIRECTORY, &path); + path.Append("syslog"); + + char message[512]; + sprintf(message, + "Syslog Daemon\n\n" + "This daemon is responsible for collecting " + "all system messages and write them to the " + "system-wide log at \"%s\".\n\n", path.Path()); + + BAlert *alert = new BAlert("Syslog Daemon", message, "Ok"); + BTextView *view = alert->TextView(); + BFont font; + + view->SetStylable(true); + + view->GetFont(&font); + font.SetSize(21); + font.SetFace(B_BOLD_FACE); + view->SetFontAndColor(0, 13, &font); + + alert->Go(NULL); +} + + +bool +SyslogDaemon::QuitRequested() +{ + delete_port(fPort); + + int32 returnCode; + wait_for_thread(fDaemon, &returnCode); + + return true; +} + + +void +SyslogDaemon::MessageReceived(BMessage *msg) +{ + switch (msg->what) { + case SYSLOG_ADD_LISTENER: + { + BMessenger messenger; + if (msg->FindMessenger("target", &messenger) == B_OK) + add_listener(&messenger); + break; + } + case SYSLOG_REMOVE_LISTENER: + { + BMessenger messenger; + if (msg->FindMessenger("target", &messenger) == B_OK) + remove_listener(&messenger); + break; + } + + default: + BApplication::MessageReceived(msg); + } +} + + +void +SyslogDaemon::AddHandler(handler_func function) +{ + fHandlers.AddItem((void *)function); +} + + +void +SyslogDaemon::Daemon() +{ + char buffer[4096]; + syslog_message &message = *(syslog_message *)buffer; + int32 code; + + while (true) { + ssize_t bytesRead = read_port(fPort, &code, &message, sizeof(buffer)); + if (bytesRead == B_BAD_PORT_ID) { + // we've been quit + break; + } + + // if we don't get what we want, ignore it + if (bytesRead < (ssize_t)sizeof(syslog_message) || code != SYSLOG_MESSAGE) + continue; + + fHandlerLock.Lock(); + + for (int32 i = fHandlers.CountItems(); i-- > 0;) { + handler_func handle = (handler_func)fHandlers.ItemAt(i); + + handle(message); + } + + fHandlerLock.Unlock(); + } +} + + +int32 +SyslogDaemon::daemon_thread(void *data) +{ + ((SyslogDaemon *)data)->Daemon(); + return B_OK; +} + + +int +main(int argc, char **argv) +{ + SyslogDaemon daemon; + daemon.Run(); + + return 0; +} diff --git a/src/servers/syslog_daemon/SyslogDaemon.h b/src/servers/syslog_daemon/SyslogDaemon.h new file mode 100644 index 0000000000..af12611fff --- /dev/null +++ b/src/servers/syslog_daemon/SyslogDaemon.h @@ -0,0 +1,42 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ +#ifndef _SYSLOG_DAEMON_H_ +#define _SYSLOG_DAEMON_H_ + + +#include +#include +#include +#include + +#include + + +typedef void (*handler_func)(syslog_message &); + + +class SyslogDaemon : public BApplication { + public: + SyslogDaemon(); + + virtual void ReadyToRun(); + virtual void AboutRequested(); + virtual bool QuitRequested(); + virtual void MessageReceived(BMessage *msg); + + void AddHandler(handler_func function); + + void Daemon(); + static int32 daemon_thread(void *data); + + private: + thread_id fDaemon; + port_id fPort; + + BLocker fHandlerLock; + BList fHandlers; +}; + +#endif /* _SYSLOG_DAEMON_H_ */ diff --git a/src/servers/syslog_daemon/SyslogDaemon.rsrc b/src/servers/syslog_daemon/SyslogDaemon.rsrc new file mode 100644 index 0000000000000000000000000000000000000000..08e3938568fbb1c2e649398be5d98bb4ddffdef3 GIT binary patch literal 4223 zcmeHLPfHt75FfR*g|=ueMv9f3mu#BY_Mn%=m_IBeCb%LsIfyj@g%X2^6zpy9J@hl= z&@TNH?NPtL9(yU2eu(rpGjDedDzvp;+6-jhyf?r3&AfT@ST-9T5zRJA(-=zpW91Ko zeF?tbr<7xVLUmpqLU{c)^!GD}17ha?bdM+_QHai=(;c0hKfs85Sk503Jyw;zLH{tR zlXu`Ta9Oy`oH@XlU+X@u!?+IP9vJt)xCef%2bPMBN=Bjb?71&X_o4O5B^kMnHxzw2 zT}wizEqQxg2cVW^U83MzjRT!#Ek-0V9Fh};p(3c2rL2`Da$3x=%x5UyIVtLOMqHzAp$rfQijnN-qGw2-tkb5e|T0W1)0f0YD%PA?GLo_|@GJ z0MXeXjuQI8L<)ORVE_#VXAmHiBcL?wgEK4xD_GcF?4pdQu1W|qkFor>j zL@BV7fKu@13^cAh;SX!O9a3bL6getWvryRP9U5<#ozOQNu^9+XPUvCwX)#8yJNVn? zfZ5xhS`3u~369#u%m)e%hdI=a6vcnUtQ>mIZB364Eb@*x%>JUykD3|J3>SBIkpt#b z3a6poTs>H)V-7LvzN06=vtX1wt}rW%n?TAK^G5E;C{ayOlhwbiMfc9|QY*TN=Du0D zOd_ZeUmq)PJ92e!Wl%bc>>u-JX2LDe{?~~}YNeY7r%;WwAANMm3 znOlw8;VXtSDOTW*o|LJqyft&50qACcq$A7}r)2V$T!s0nO6~UhuMhTij}H!ePv6)l zy-u#!wY_bx7JUF1cO443d@et-@_Q5U&wT#4l+QoQH2U3MvD@Ges{cjqVx#86D&F#o zT%mK5n!-QR>7L|K*23~~!A5NhnPNBN_Vx~s`iDom$K6gG>>pJ4E3{hm>Rea;%~G-4 z@K!2rt-Q0j-7I_Ygl$6afzC#W^I&ZwybRlkh#>aIlO=#Mnw wYO}fHxz(6xtJz%Tg!s@?31q9h;kg&$RSb;(NSH}rmD*}GN&WfU*DtWsPuwL>(*OVf literal 0 HcmV?d00001 diff --git a/src/servers/syslog_daemon/listener_output.cpp b/src/servers/syslog_daemon/listener_output.cpp new file mode 100644 index 0000000000..6644d3dbf0 --- /dev/null +++ b/src/servers/syslog_daemon/listener_output.cpp @@ -0,0 +1,73 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ + + +#include "listener_output.h" + +#include + + +static BLocker sLocker; +static BList sListeners; + + +static void +listener_output(syslog_message &message) +{ + // compose the message to be sent to all listeners; just convert + // the syslog_message into a BMessage + BMessage output(SYSLOG_MESSAGE); + + output.AddInt32("from", message.from); + output.AddInt32("when", message.when); + output.AddString("ident", message.ident); + output.AddString("message", message.message); + output.AddInt32("options", message.options); + output.AddInt32("priority", message.priority); + + sLocker.Lock(); + + for (int32 i = sListeners.CountItems(); i-- > 0;) { + BMessenger *target = (BMessenger *)sListeners.ItemAt(i); + + status_t status = target->SendMessage(&output); + if (status < B_OK) { + // remove targets once they can't be reached anymore + sListeners.RemoveItem(target); + } + } + + sLocker.Unlock(); +} + + +void +remove_listener(BMessenger *messenger) +{ + if (sLocker.Lock()) { + sListeners.RemoveItem(messenger); + + sLocker.Unlock(); + } +} + + +void +add_listener(BMessenger *messenger) +{ + if (sLocker.Lock()) { + sListeners.AddItem(messenger); + + sLocker.Unlock(); + } +} + + +void +init_listener_output(SyslogDaemon *daemon) +{ + daemon->AddHandler(listener_output); +} + diff --git a/src/servers/syslog_daemon/listener_output.h b/src/servers/syslog_daemon/listener_output.h new file mode 100644 index 0000000000..e93614bb76 --- /dev/null +++ b/src/servers/syslog_daemon/listener_output.h @@ -0,0 +1,16 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ +#ifndef _LISTENER_OUTPUT_H_ +#define _LISTENER_OUTPUT_H_ + +#include +#include "SyslogDaemon.h" + + +void init_listener_output(SyslogDaemon *daemon); +void add_listener(BMessenger *messenger); +void remove_listener(BMessenger *messenger); + +#endif /* _SYSLOG_OUTPUT_H_ */ diff --git a/src/servers/syslog_daemon/syslog_output.cpp b/src/servers/syslog_daemon/syslog_output.cpp new file mode 100644 index 0000000000..83ba6b19ce --- /dev/null +++ b/src/servers/syslog_daemon/syslog_output.cpp @@ -0,0 +1,24 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ + + +#include "syslog_output.h" + +#include + + +static void +syslog_output(syslog_message &message) +{ + printf("'%s'[%ld]: %s\n", message.ident, message.from, message.message); +} + + +void +init_syslog_output(SyslogDaemon *daemon) +{ + daemon->AddHandler(syslog_output); +} + diff --git a/src/servers/syslog_daemon/syslog_output.h b/src/servers/syslog_daemon/syslog_output.h new file mode 100644 index 0000000000..501bc4992e --- /dev/null +++ b/src/servers/syslog_daemon/syslog_output.h @@ -0,0 +1,12 @@ +/* +** Copyright 2003, Axel Dörfler, axeld@pinc-software.de. All rights reserved. +** Distributed under the terms of the OpenBeOS License. +*/ +#ifndef _SYSLOG_OUTPUT_H_ +#define _SYSLOG_OUTPUT_H_ + +#include "SyslogDaemon.h" + +void init_syslog_output(SyslogDaemon *daemon); + +#endif /* _SYSLOG_OUTPUT_H_ */