Add syslog output support to bootloader
Broadcast console output as syslog debug messages, stripped of trailing newlines. Disabled by default. Patch from #6168. Change-Id: I1754381477dcde00bdcfa4482017daf5eb682cd3 Reviewed-on: https://review.haiku-os.org/c/912 Reviewed-by: Stephan Aßmus <[email protected]>
This commit is contained in:
committed by
Stephan Aßmus
parent
f551180bf9
commit
9091349139
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#include <boot/vfs.h>
|
#include <boot/vfs.h>
|
||||||
#include <boot/stdio.h>
|
#include <boot/stdio.h>
|
||||||
|
#include <boot/net/NetStack.h>
|
||||||
|
#include <boot/net/UDP.h>
|
||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@@ -20,6 +22,9 @@
|
|||||||
//extern FILE *stdin;
|
//extern FILE *stdin;
|
||||||
|
|
||||||
|
|
||||||
|
//#define ENABLE_SYSLOG
|
||||||
|
|
||||||
|
|
||||||
#undef errno
|
#undef errno
|
||||||
int errno;
|
int errno;
|
||||||
|
|
||||||
@@ -31,6 +36,51 @@ _errnop(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef ENABLE_SYSLOG
|
||||||
|
|
||||||
|
static UDPSocket *sSyslogSocket = NULL;
|
||||||
|
|
||||||
|
static void
|
||||||
|
sendToSyslog(const char *message, int length)
|
||||||
|
{
|
||||||
|
// Lazy-initialize the socket
|
||||||
|
if (sSyslogSocket == NULL) {
|
||||||
|
// Check if the network stack has been initialized yet
|
||||||
|
if (NetStack::Default() != NULL) {
|
||||||
|
sSyslogSocket = new(std::nothrow) UDPSocket;
|
||||||
|
sSyslogSocket->Bind(INADDR_ANY, 60514);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sSyslogSocket == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Strip trailing newlines
|
||||||
|
while (length > 0) {
|
||||||
|
if (message[length - 1] != '\n'
|
||||||
|
&& message[length - 1] != '\r') {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
length--;
|
||||||
|
}
|
||||||
|
if (length <= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
char buffer[1500];
|
||||||
|
// same comment as in vfprintf applies...
|
||||||
|
const int facility = 0; // kernel
|
||||||
|
int severity = 7; // debug
|
||||||
|
int offset = snprintf(buffer, sizeof(buffer),
|
||||||
|
"<%d>1 - - Haiku - - - \xEF\xBB\xBF",
|
||||||
|
facility * 8 + severity);
|
||||||
|
length = std::min(length, (int)sizeof(buffer) - offset);
|
||||||
|
memcpy(buffer + offset, message, length);
|
||||||
|
sSyslogSocket->Send(INADDR_BROADCAST, 514, buffer, offset + length);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
vfprintf(FILE *file, const char *format, va_list list)
|
vfprintf(FILE *file, const char *format, va_list list)
|
||||||
{
|
{
|
||||||
@@ -40,8 +90,12 @@ vfprintf(FILE *file, const char *format, va_list list)
|
|||||||
|
|
||||||
int length = vsnprintf(buffer, sizeof(buffer), format, list);
|
int length = vsnprintf(buffer, sizeof(buffer), format, list);
|
||||||
length = std::min(length, (int)sizeof(buffer) - 1);
|
length = std::min(length, (int)sizeof(buffer) - 1);
|
||||||
if (length > 0)
|
if (length > 0) {
|
||||||
node->Write(buffer, length);
|
node->Write(buffer, length);
|
||||||
|
#ifdef ENABLE_SYSLOG
|
||||||
|
sendToSyslog(buffer, length);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
@@ -92,6 +146,10 @@ fputc(int c, FILE *file)
|
|||||||
// we only support direct console output right now...
|
// we only support direct console output right now...
|
||||||
status = ((ConsoleNode *)file)->Write(&character, 1);
|
status = ((ConsoleNode *)file)->Write(&character, 1);
|
||||||
|
|
||||||
|
#ifdef ENABLE_SYSLOG
|
||||||
|
sendToSyslog(&character, 1);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (status > 0)
|
if (status > 0)
|
||||||
return character;
|
return character;
|
||||||
|
|
||||||
@@ -108,6 +166,10 @@ fputs(const char *string, FILE *file)
|
|||||||
status_t status = ((ConsoleNode *)file)->Write(string, strlen(string));
|
status_t status = ((ConsoleNode *)file)->Write(string, strlen(string));
|
||||||
fputc('\n', file);
|
fputc('\n', file);
|
||||||
|
|
||||||
|
#ifdef ENABLE_SYSLOG
|
||||||
|
sendToSyslog(string, strlen(string));
|
||||||
|
#endif
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user