Stuf
This commit is contained in:
125
syslogd.c
125
syslogd.c
@@ -32,6 +32,12 @@
|
||||
#include <signal.h>
|
||||
#include <ctype.h>
|
||||
#include <netdb.h>
|
||||
#include <sys/klog.h>
|
||||
#include <errno.h>
|
||||
#include <paths.h>
|
||||
|
||||
#define ksyslog klogctl
|
||||
extern int ksyslog(int type, char *buf, int len);
|
||||
|
||||
|
||||
/* SYSLOG_NAMES defined to pull some extra junk from syslog.h */
|
||||
@@ -40,8 +46,6 @@
|
||||
|
||||
/* Path for the file where all log messages are written */
|
||||
#define __LOG_FILE "/var/log/messages"
|
||||
/* Path to the current console device */
|
||||
#define __DEV_CONSOLE "/dev/console"
|
||||
|
||||
|
||||
static char* logFilePath = __LOG_FILE;
|
||||
@@ -58,7 +62,7 @@ static const char syslogd_usage[] =
|
||||
"\t-n\tDo not fork into the background (for when run by init)\n"
|
||||
"\t-O\tSpecify an alternate log file. default=/var/log/messages\n";
|
||||
|
||||
|
||||
static int kmsg;
|
||||
|
||||
/* try to open up the specified device */
|
||||
static int device_open(char *device, int mode)
|
||||
@@ -92,7 +96,7 @@ static void message(char *fmt, ...)
|
||||
close(fd);
|
||||
} else {
|
||||
/* Always send console messages to /dev/console so people will see them. */
|
||||
if ((fd = device_open(__DEV_CONSOLE, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) {
|
||||
if ((fd = device_open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY|O_NONBLOCK)) >= 0) {
|
||||
va_start(arguments, fmt);
|
||||
vdprintf(fd, fmt, arguments);
|
||||
va_end(arguments);
|
||||
@@ -250,20 +254,112 @@ static void doSyslogd(void)
|
||||
close(fd);
|
||||
}
|
||||
|
||||
static void klogd_signal(int sig)
|
||||
{
|
||||
//ksyslog(7, NULL, 0);
|
||||
//ksyslog(0, 0, 0);
|
||||
logMessage(LOG_SYSLOG|LOG_INFO, "Kernel log daemon terminating.");
|
||||
exit( TRUE);
|
||||
}
|
||||
|
||||
|
||||
static void doKlogd(void)
|
||||
{
|
||||
int priority=LOG_INFO;
|
||||
struct stat sb;
|
||||
char log_buffer[4096];
|
||||
|
||||
/* Set up sig handlers */
|
||||
signal(SIGINT, klogd_signal);
|
||||
signal(SIGKILL, klogd_signal);
|
||||
signal(SIGTERM, klogd_signal);
|
||||
signal(SIGHUP, klogd_signal);
|
||||
logMessage(LOG_SYSLOG|LOG_INFO, "klogd started: "
|
||||
"BusyBox v" BB_VER " (" BB_BT ") multi-call binary");
|
||||
|
||||
//ksyslog(1, NULL, 0);
|
||||
if ( ((stat(_PATH_KLOG, &sb) < 0) && (errno == ENOENT)) ||
|
||||
( (kmsg = open(_PATH_KLOG, O_RDONLY)) < 0 ) ) {
|
||||
char message[80];
|
||||
snprintf(message, 79, "klogd: Cannot open %s, " \
|
||||
"%d - %s.\n", _PATH_KLOG, errno, strerror(errno));
|
||||
logMessage(LOG_SYSLOG|LOG_ERR, message);
|
||||
klogd_signal(0);
|
||||
}
|
||||
while (1) {
|
||||
memset(log_buffer, '\0', sizeof(log_buffer));
|
||||
if ( read(kmsg, log_buffer, sizeof(log_buffer)-1) < 0 ) {
|
||||
char message[80];
|
||||
if ( errno == EINTR )
|
||||
continue;
|
||||
snprintf(message, 79, "klogd: Cannot read proc file system: %d - %s.\n",
|
||||
errno, strerror(errno));
|
||||
logMessage(LOG_SYSLOG|LOG_ERR, message);
|
||||
klogd_signal(0);
|
||||
}
|
||||
#if 0
|
||||
if ( ksyslog(2, log_buffer, sizeof(log_buffer)) < 0 ) {
|
||||
char message[80];
|
||||
if ( errno == EINTR )
|
||||
continue;
|
||||
snprintf(message, 79, "klogd: Error return from sys_sycall: " \
|
||||
"%d - %s.\n", errno, strerror(errno));
|
||||
logMessage(LOG_SYSLOG|LOG_ERR, message);
|
||||
exit(1);
|
||||
}
|
||||
#endif
|
||||
fprintf(stderr, "the kernel says '%s'\n", log_buffer);
|
||||
if ( *log_buffer == '<' )
|
||||
{
|
||||
switch ( *(log_buffer+1) )
|
||||
{
|
||||
case '0':
|
||||
priority = LOG_EMERG;
|
||||
break;
|
||||
case '1':
|
||||
priority = LOG_ALERT;
|
||||
break;
|
||||
case '2':
|
||||
priority = LOG_CRIT;
|
||||
break;
|
||||
case '3':
|
||||
priority = LOG_ERR;
|
||||
break;
|
||||
case '4':
|
||||
priority = LOG_WARNING;
|
||||
break;
|
||||
case '5':
|
||||
priority = LOG_NOTICE;
|
||||
break;
|
||||
case '6':
|
||||
priority = LOG_INFO;
|
||||
break;
|
||||
case '7':
|
||||
default:
|
||||
priority = LOG_DEBUG;
|
||||
}
|
||||
*log_buffer += 3;
|
||||
}
|
||||
logMessage(LOG_KERN|priority, log_buffer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
extern int syslogd_main(int argc, char **argv)
|
||||
{
|
||||
int pid;
|
||||
int pid, klogd_pid;
|
||||
int doFork = TRUE;
|
||||
char **argv1=argv;
|
||||
|
||||
while (--argc > 0 && **(++argv) == '-') {
|
||||
while (*(++(*argv))) {
|
||||
switch (**argv) {
|
||||
while (--argc > 0 && **(++argv1) == '-') {
|
||||
while (*(++(*argv1))) {
|
||||
switch (**argv1) {
|
||||
case 'm':
|
||||
if (--argc == 0) {
|
||||
usage(syslogd_usage);
|
||||
}
|
||||
MarkInterval = atoi(*(++argv))*60;
|
||||
MarkInterval = atoi(*(++argv1))*60;
|
||||
break;
|
||||
case 'n':
|
||||
doFork = FALSE;
|
||||
@@ -272,7 +368,7 @@ extern int syslogd_main(int argc, char **argv)
|
||||
if (--argc == 0) {
|
||||
usage(syslogd_usage);
|
||||
}
|
||||
logFilePath = *(++argv);
|
||||
logFilePath = *(++argv1);
|
||||
break;
|
||||
default:
|
||||
usage(syslogd_usage);
|
||||
@@ -285,11 +381,20 @@ extern int syslogd_main(int argc, char **argv)
|
||||
if ( pid < 0 )
|
||||
exit( pid);
|
||||
else if ( pid == 0 ) {
|
||||
strncpy(argv[0], "syslogd",strlen(argv[0]));
|
||||
doSyslogd();
|
||||
}
|
||||
} else {
|
||||
doSyslogd();
|
||||
}
|
||||
|
||||
/* Start klogd process */
|
||||
klogd_pid = fork();
|
||||
if (klogd_pid == 0 ) {
|
||||
strncpy(argv[0], "klogd", strlen(argv[0]));
|
||||
doKlogd();
|
||||
}
|
||||
|
||||
exit( TRUE);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user