syslog_kernel.c
author viric@llimona
Thu, 06 Apr 2006 01:47:35 +0200
changeset 18 84fa30ea0b0d
parent 15 fea6e87812f0
child 19 273d1c138a56
permissions -rw-r--r--
Ara sí - versió 1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     1
#include <sys/types.h>
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     2
#include <unistd.h>
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     3
#include <errno.h>
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     4
#include <stdbool.h>
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     5
#include <stdio.h> // Per sprintf, fprintf
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     6
#include <sys/wait.h> // Per wait
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     7
#include <string.h> // Per memset
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     8
#include <signal.h> // Pels senyals
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
     9
#include <assert.h> // Pels assert
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    10
#include <stdlib.h> // Per l'abort
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    11
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    12
#include "rfc3164.h"
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    13
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    14
const char syslog_in_unix[] = "syslog_in_unix";
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    15
const char syslog_in_npipe[] = "syslog_in_npipe";
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    16
const char syslog_in_udp[] = "syslog_in_udp";
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    17
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    18
#define TEST_NPIPE "prova_npipe"
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    19
#define TEST_UDP 4000
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    20
#define TEST_UNIX "prova_unix"
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    21
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    22
void child_handler(int parameter)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    23
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    24
	pid_t pid;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    25
	int status;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    26
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    27
	do
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    28
	{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    29
		pid = waitpid(-1, &status, WNOHANG);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    30
		/* Debug */
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    31
		if (WIFEXITED(status))
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    32
		{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    33
			fprintf(stderr, "Child %i died fine:%i\n",
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    34
				pid, WEXITSTATUS(status));
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    35
		} else 
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    36
			fprintf(stderr, "Child %i signaled strange.\n",
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    37
				pid);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    38
	} while(pid == 0);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    39
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    40
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    41
int run_program(const char * restrict programname,
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    42
		const char * restrict parameter1, int comm_pipe[])
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    43
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    44
	int pid;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    45
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    46
	pid = fork();
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    47
	assert(pid != -1);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    48
	if (pid == 0)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    49
	{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    50
		close(0);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    51
		close(1);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    52
		dup(comm_pipe[0]);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    53
		dup(comm_pipe[1]);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    54
		execl(programname, programname, parameter1, NULL);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    55
		/* Unreachable */
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    56
		fprintf(stderr, "Child exec failed(%s %s): %s\n",
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    57
			programname, parameter1, strerror(errno));
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    58
		abort();
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    59
		return 0;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    60
	}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    61
	else
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    62
	{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    63
		fprintf(stderr, "Child forked(%s %s): %i\n",
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    64
			programname, parameter1, pid);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    65
		return pid;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    66
	}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    67
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    68
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    69
int init_in_unix(const char * restrict socketname, int input_pipe[])
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    70
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    71
	return run_program(syslog_in_unix, socketname, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    72
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    73
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    74
int init_in_udp(unsigned int port, int input_pipe[])
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    75
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    76
	char buffer[20];
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    77
	
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    78
	snprintf(buffer, 20, "%u", port);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    79
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    80
	return run_program(syslog_in_udp, buffer, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    81
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    82
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    83
int init_in_npipe(const char * restrict pipename, int input_pipe[])
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    84
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    85
	return run_program(syslog_in_npipe, pipename, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    86
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    87
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    88
void kernel_loop()
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    89
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    90
	int input_pipe[2];
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    91
	char missatge[MESSAGE_LENGTH+1];
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    92
	int status;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    93
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    94
	pipe(input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    95
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    96
	init_in_npipe(TEST_NPIPE, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    97
	init_in_udp(TEST_UDP, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    98
	init_in_unix(TEST_UNIX, input_pipe);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
    99
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   100
	/* We don't want to write to the programs */
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   101
	close(input_pipe[1]);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   102
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   103
	while(true)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   104
	{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   105
		status = read(input_pipe[0], missatge, MESSAGE_LENGTH);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   106
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   107
		if (status > 0)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   108
		{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   109
			/* Add a ZERO */
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   110
			missatge[status] = '\0';
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   111
			/* The \n is included in the message */
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   112
			printf("Received: %s",missatge);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   113
		}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   114
		else if (status == -1 && errno == EINTR)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   115
			continue;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   116
		else
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   117
			break;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   118
	}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   119
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   120
	if (status == -1)
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   121
	{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   122
		printf("Error reading from the main pipe: %s\n", 
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   123
			strerror(errno));
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   124
	}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   125
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   126
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   127
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   128
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   129
void install_signal_handlers()
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   130
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   131
	struct sigaction my_action;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   132
	int result;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   133
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   134
	my_action.sa_handler = child_handler;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   135
	my_action.sa_flags = SA_NOCLDSTOP;
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   136
	memset(&my_action.sa_mask, 0, sizeof(my_action.sa_mask));
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   137
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   138
	result = sigaction(SIGCHLD, &my_action, NULL);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   139
	assert(result == 0);
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   140
}
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   141
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   142
int main(int argn, char *argv[])
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   143
{
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   144
	install_signal_handlers();
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   145
	kernel_loop();
fea6e87812f0 Now everything works - the rfc3164 message parser must be improved.
viric@llimona
parents:
diff changeset
   146
}