out_udp.c
author viric@llimona
Tue, 30 May 2006 12:34:25 +0200
changeset 57 de776a4548da
parent 39 60858d13b22c
permissions -rw-r--r--
Added the check for a pid file (syslog.pid by default).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     1
#include <sys/types.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     2
#include <sys/socket.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     3
#include <netdb.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     4
#include <string.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     5
#include <stdbool.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     6
#include <stdio.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     7
#include <unistd.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     8
#include <errno.h>
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
     9
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    10
#include "syslog.h"
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    11
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    12
/* Prototypes */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    13
static int init_socket(const char * restrict node,
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    14
		const char * restrict service);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    15
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    16
/* Local globals */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    17
static int out_socket;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    18
static bool socket_enabled = false;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    19
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    20
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    21
/* Returns -2 when the socket wasn't initialized by config, 0 when all was ok,
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    22
 * -1 on more important error */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    23
int init_out_udp()
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    24
{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    25
	char node[MAX_STRING];
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    26
	char service[MAX_STRING];
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    27
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    28
	/* Get the configuration */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    29
	get_config(TO_UDP_HOST, node, MAX_STRING);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    30
	get_config(TO_UDP_PORT, service, MAX_STRING);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    31
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    32
	if (strncmp(node, "disabled", MAX_STRING) == 0)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    33
		return -2;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    34
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    35
	if (strncmp(service, "disabled", MAX_STRING) == 0)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    36
		return -2;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    37
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    38
	return init_socket(node, service);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    39
}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    40
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
    41
/* Returns 0 when all was ok, -1 on error */
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    42
static int init_socket(const char * restrict node,
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    43
		const char * restrict service)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    44
{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    45
	int res;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    46
	struct addrinfo *addr_res, *ptr;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    47
	struct addrinfo hints;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    48
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    49
	/* Prepare the hints for datagram */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    50
	memset(&hints, 0, sizeof(hints));
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    51
	hints.ai_flags = AI_ADDRCONFIG;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    52
	hints.ai_family = AF_UNSPEC;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    53
	hints.ai_socktype = SOCK_DGRAM;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    54
	hints.ai_addr = NULL;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    55
	hints.ai_canonname = NULL;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    56
	hints.ai_next = NULL;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    57
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    58
	/* Ask the system for the service */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    59
	res = getaddrinfo(node, service, &hints, &addr_res);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    60
	if (res != 0)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    61
	{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    62
		fprintf(stderr, "Error trying to resolve the out_udp"
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    63
				" name: %s\n", gai_strerror(res));
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    64
		if (res == EAI_SYSTEM)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    65
		{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    66
			fprintf(stderr, " More system info: %s\n",
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    67
					strerror(errno));
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    68
		}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    69
		return -1;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    70
	}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    71
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    72
	ptr = addr_res;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    73
	do
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    74
	{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    75
		res = -1; /* For further error catching */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    76
		out_socket = socket(ptr->ai_family, ptr->ai_socktype,
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    77
				ptr->ai_protocol);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    78
		if (out_socket == -1)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    79
			continue;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    80
		res = connect(out_socket, ptr->ai_addr, ptr->ai_addrlen);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    81
		if (res == 0)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    82
		{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    83
			break;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    84
		}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    85
		else /* Unsuccesful connect */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    86
		{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    87
			close(out_socket);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    88
			continue;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    89
		}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    90
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    91
	} while((ptr = ptr->ai_next) != NULL);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    92
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    93
	freeaddrinfo(addr_res);
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    94
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    95
	/* If everything is fine */
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    96
	if (res == 0)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    97
	{
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    98
		socket_enabled = true;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
    99
	}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   100
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   101
	return res;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   102
}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   103
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   104
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   105
/* Return -2 when the socket is not enabled. Otherwise, the output of send().*/
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   106
int write_out_udp(const char * restrict buf, const int len)
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   107
{
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   108
	int res;
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   109
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   110
	if (!socket_enabled)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   111
		return -2;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   112
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   113
	res = send(out_socket, buf, len, 0);
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   114
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   115
	if (res == -1)
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   116
	{
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   117
		fprintf(stderr, "Error sending to the UDP socket: %s\n", 
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   118
			strerror(errno));
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   119
	}
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   120
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   121
	return res;
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   122
}
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   123
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   124
/* Return -2 when the socket is not enabled. Otherwise, the output of close().*/
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   125
int close_out_udp()
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   126
{
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   127
	int res;
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   128
	if (!socket_enabled)
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   129
		return -2;
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   130
39
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   131
	res = close(out_socket);
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   132
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   133
	if (res == -1)
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   134
	{
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   135
		fprintf(stderr, "Error closing the output UDP socket: %s\n", 
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   136
			strerror(errno));
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   137
	}
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   138
60858d13b22c Log file output written in a C module. Now the kernel doesn't check the errors
viric@mandarina
parents: 35
diff changeset
   139
	return res;
35
6b6bbc8a5fdb Added UDP output.
viric@mandarina
parents:
diff changeset
   140
}