diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | PKGBUILD | 2 | ||||
-rw-r--r-- | minilogd.c | 202 | ||||
-rwxr-xr-x | rc.sysinit | 3 |
5 files changed, 6 insertions, 213 deletions
@@ -1,5 +1,3 @@ -minilogd -minilogd.o tags *.tar.xz* pkg/ @@ -15,21 +15,19 @@ DIRS := \ /usr/share/zsh/site-functions \ /usr/share/man/man8 -all: minilogd doc - -minilogd: minilogd.o +all: doc installdirs: install -dm755 $(foreach DIR, $(DIRS), $(DESTDIR)$(DIR)) -install: minilogd installdirs doc +install: installdirs doc install -m644 -t $(DESTDIR)/etc inittab rc.conf install -m755 -t $(DESTDIR)/etc rc.local rc.local.shutdown rc.multi rc.shutdown rc.single rc.sysinit install -m644 -t $(DESTDIR)/etc/logrotate.d bootlog install -m644 -t $(DESTDIR)/etc/rc.d functions install -m755 -t $(DESTDIR)/etc/rc.d hwclock network netfs install -m755 -t $(DESTDIR)/etc/profile.d locale.sh - install -m755 -t $(DESTDIR)/usr/sbin minilogd rc.d + install -m755 -t $(DESTDIR)/usr/sbin rc.d install -m644 -t ${DESTDIR}/usr/share/man/man8 rc.d.8 install -m755 -t $(DESTDIR)/usr/lib/initscripts arch-tmpfiles arch-sysctl install -m644 tmpfiles.conf $(DESTDIR)/usr/lib/tmpfiles.d/arch.conf @@ -42,7 +40,7 @@ rc.d.8: rc.d.8.txt doc: rc.d.8 clean: - rm -f minilogd minilogd.o rc.d.8 + rm -f rc.d.8 release: git archive HEAD --prefix=initscripts-$(VER)/ | xz > initscripts-$(VER).tar.xz @@ -2,7 +2,7 @@ pkgname=initscripts-git pkgver=$(date +%s) pkgrel=$(git log -1 --pretty=format:%h) pkgdesc="System initialization/bootup scripts" -arch=('i686' 'x86_64') +arch=('any') url="http://www.archlinux.org" license=('GPL') groups=('base') diff --git a/minilogd.c b/minilogd.c deleted file mode 100644 index c86ab23..0000000 --- a/minilogd.c +++ /dev/null @@ -1,202 +0,0 @@ -/* minilogd.c - * - * A pale imitation of syslogd. Most notably, doesn't write anything - * anywhere except possibly back to syslogd. - * - */ - -#include <errno.h> -#include <fcntl.h> -#include <signal.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <strings.h> -#include <stdarg.h> -#include <syslog.h> -#ifndef __USE_BSD -# define __USE_BSD -#endif -#include <unistd.h> - -#include <sys/poll.h> -#include <sys/socket.h> -#include <sys/stat.h> -#include <sys/un.h> - -#define MAX_BUF_LINES 10000 -#define BUF_LINE_SIZE 8192 - -static int we_own_log=0; -static char **buffer=NULL; -static int buflines=0; - -int debug; - -int recvsock; - -void alarm_handler(int x) { - alarm(0); - close(recvsock); - recvsock = -1; -} - -void freeBuffer() { - struct sockaddr_un addr; - int sock; - int x=0,conn; - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; - strncpy(addr.sun_path,_PATH_LOG,sizeof(addr.sun_path)-1); - /* wait for klogd to hit syslog */ - sleep(2); - sock = socket(AF_LOCAL, SOCK_STREAM,0); - conn=connect(sock,(struct sockaddr *) &addr,(socklen_t)sizeof(addr)); - while (x<buflines) { - if (!conn) { - /*printf("to syslog: %s\n", buffer[x]);*/ - write(sock,buffer[x],strlen(buffer[x])+1); - } - free(buffer[x]); - x++; - } - free(buffer); -} - -void cleanup(int exitcode) { - /* If we own the log, unlink it before trying to free our buffer. - * Otherwise, sending the buffer to /dev/log doesn't make much sense.... */ - if (we_own_log) { - perror("wol"); - unlink(_PATH_LOG); - } - /* Don't try to free buffer if we were called from a signal handler */ - if (exitcode<=0) { - if (buffer) - freeBuffer(); - exit(exitcode); - } else - exit(exitcode+128); -} - -void runDaemon(int sock) { - struct sockaddr_un addr; - int x,done=0; - ssize_t len; - socklen_t addrlen = (socklen_t)sizeof(struct sockaddr_un); - char *message = NULL; - struct stat s1,s2; - struct pollfd pfds; - - daemon(0,-1); - /* try not to leave stale sockets lying around */ - /* Hopefully, we won't actually get any of these */ - signal(SIGHUP,cleanup); - signal(SIGINT,cleanup); - signal(SIGQUIT,cleanup); - signal(SIGILL,cleanup); - signal(SIGABRT,cleanup); - signal(SIGFPE,cleanup); - signal(SIGSEGV,cleanup); - signal(SIGPIPE,cleanup); - signal(SIGBUS,cleanup); - signal(SIGTERM,cleanup); - done = 0; - /* Get stat info on /dev/log so we can later check to make sure we - * still own it... */ - if (stat(_PATH_LOG,&s1) != 0) - memset(&s1, 0, sizeof(struct stat)); - while (!done) { - pfds.fd = sock; - pfds.events = POLLIN|POLLPRI; - pfds.revents = 0; - if ( ( (x=poll(&pfds,1,500))==-1) && errno !=EINTR) { - perror("poll"); - cleanup(-1); - } - if ( (x>0) && (pfds.revents & (POLLIN | POLLPRI))) { - if (message == NULL) { - message = calloc(BUF_LINE_SIZE,sizeof(char)); - } - recvsock = accept(sock,(struct sockaddr *) &addr, &addrlen); - alarm(2); - signal(SIGALRM, alarm_handler); - len = read(recvsock,message,BUF_LINE_SIZE); - alarm(0); - close(recvsock); - if (len>0) { - /*printf("line recv'd: %s\n", message);*/ - if (buflines < MAX_BUF_LINES) { - if (buffer) - buffer = realloc(buffer,(buflines+1)*sizeof(char *)); - else - buffer = malloc(sizeof(char *)); - message[strlen(message)]='\n'; - buffer[buflines]=message; - message = NULL; - buflines++; - } - } - else { - recvsock=-1; - } - } - if ( (x>0) && ( pfds.revents & (POLLHUP | POLLNVAL)) ) - done = 1; - /* Check to see if syslogd's yanked our socket out from under us */ - if ( (stat(_PATH_LOG,&s2)!=0) || - (s1.st_ino != s2.st_ino ) || (s1.st_ctime != s2.st_ctime) || - (s1.st_mtime != s2.st_mtime) ) { /*|| (s1.st_atime != s2.st_atime) ) {*/ - done = 1; - we_own_log = 0; - /*printf("someone stole our %s\n", _PATH_LOG); - printf("st_ino: %d %d\n", s1.st_ino, s2.st_ino); - printf("st_ctime: %d %d\n", s1.st_ctime, s2.st_ctime); - printf("st_atime: %d %d\n", s1.st_atime, s2.st_atime); - printf("st_mtime: %d %d\n", s1.st_mtime, s2.st_mtime);*/ - } - } - free(message); - cleanup(0); -} - -int main(int argc, char **argv) { - struct sockaddr_un addr; - int sock; - int pid; - - /* option processing made simple... */ - if (argc>1) debug=1; - /* just in case */ - sock = open("/dev/null",O_RDWR); - dup2(sock,0); - dup2(sock,1); - dup2(sock,2); - - memset(&addr, 0, sizeof(addr)); - addr.sun_family = AF_LOCAL; - strncpy(addr.sun_path,_PATH_LOG,sizeof(addr.sun_path)-1); - sock = socket(AF_LOCAL, SOCK_STREAM,0); - unlink(_PATH_LOG); - /* Bind socket before forking, so we know if the server started */ - if (!bind(sock,(struct sockaddr *) &addr, (socklen_t)sizeof(addr))) { - we_own_log = 1; - listen(sock,5); - if ((pid=fork())==-1) { - perror("fork"); - exit(3); - } - if (pid) { - exit(0); - } else { - /*printf("starting daemon...\n");*/ - runDaemon(sock); - /* shouldn't get back here... */ - exit(4); - } - } else { - exit(5); - } -} -/* vim: set ts=2 noet: */ @@ -31,8 +31,7 @@ findmnt / --options ro &>/dev/null || run_hook sysinit_start -# start up our mini logger until syslog takes over -minilogd +# log all console messages bootlogd -p /run/bootlogd.pid if [[ ! -a /usr/lib ]] ; then |