Added a unix writer for testing the unix-socket syslog.
authorviric@mandarina
Wed, 29 Mar 2006 09:30:43 +0200
changeset 12 46ce13615fd8
parent 11 2eb2e48b5d7e
child 13 7214b3873688
Added a unix writer for testing the unix-socket syslog.
Makefile
unix_writer.c
--- a/Makefile	Wed Mar 29 09:30:17 2006 +0200
+++ b/Makefile	Wed Mar 29 09:30:43 2006 +0200
@@ -6,7 +6,7 @@
 #CC=tcc
 #CFLAGS=
 
-all: syslog_in_npipe syslog_in_udp syslog_in_unix
+all: syslog_in_npipe syslog_in_udp syslog_in_unix unix_writer
 
 %.a: 
 	ar rc $@ $<
@@ -21,6 +21,7 @@
 syslog_in_npipe: syslog_in_npipe.o rfc3164.a
 syslog_in_udp: syslog_in_udp.o rfc3164.a
 syslog_in_unix: syslog_in_unix.o rfc3164.a
+unix_writer: unix_writer.o
 
 clean:
 	rm -f *.o *.a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/unix_writer.c	Wed Mar 29 09:30:43 2006 +0200
@@ -0,0 +1,88 @@
+#include <stdio.h>  // Per l'I/O de stdin/stdout
+#include <sys/socket.h>  // Per les macros bool,true,false
+#include <sys/un.h>  // Per les estructures dels unix sockets
+#include <errno.h>  // Pels errors de les crides a fitxer
+#include <string.h> // Per strerror()
+#include <stdlib.h> // Per abort()
+#include <assert.h> // Per assert()
+#include <unistd.h> // Per les crides a fitxer
+
+#include "rfc3164.h" // Per MESSAGE_LENGTH
+
+void show_help(const char * restrict program)
+{
+	printf("Usage: %s <unix_socket>\n", program);
+}
+
+int connect_unix(const char * restrict socketname)
+{
+	int socket_unix;
+	struct sockaddr_un source_unix;
+	int result;
+	int on=1;
+
+
+	socket_unix = socket(PF_UNIX, SOCK_DGRAM, 0 );
+	if (socket_unix == -1)
+	{
+		printf("Unix socket creation error: %s\n", strerror(errno));
+		abort();
+	}
+
+	/* Unix socket listen address */
+	memset(&source_unix, 0, sizeof(source_unix));
+	source_unix.sun_family = AF_UNIX;
+	strcpy(source_unix.sun_path, socketname);
+	result = connect(socket_unix, (struct sockaddr *) &source_unix,
+		sizeof(source_unix));
+	if (result == -1)
+	{
+		printf("Unix socket connect error: %s\n", strerror(errno));
+		abort();
+	}
+
+	/* Here we should take care of the socket permissions */
+
+	return socket_unix;
+}
+
+int writer_loop(const char * restrict socketname)
+{
+	int socket_unix;
+	int result;
+	char message[MESSAGE_LENGTH+1];
+
+
+	socket_unix = connect_unix(socketname);
+
+	while (fgets(message, MESSAGE_LENGTH, stdin) != NULL )
+	{
+		send(socket_unix, message, strlen(message), 0);
+		/* Strip the last \n */
+		if (strlen(message) > 1)
+			message[strlen(message)-1] = '\0';
+		/* Allow exiting the program */
+		if(!strcmp(message,"close"))
+			break;
+	}
+	result = close(socket_unix);
+	if (result == -1)
+	{
+		printf("Unix socket close error: %s\n", strerror(errno));
+		abort();
+	}
+}
+
+
+int main(int argn, char **argv)
+{
+	/* Processem els parĂ metres d'entrada */
+	if (argn != 2) {
+		show_help(argv[0]);
+		return 2;
+	}
+
+	writer_loop(argv[1]);
+
+	return 0;
+}