[Devel] [PATCH 2/4] add the init-logger binary

dietmar at proxmox.com dietmar at proxmox.com
Mon Sep 19 22:17:16 PDT 2011


From: Dietmar Maurer <dietmar at proxmox.com>

We use diet to create small binaries.

Signed-off-by: Dietmar Maurer <dietmar at proxmox.com>
---
 scripts/Makefile.am   |    4 +
 scripts/init-logger.c |  163 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 167 insertions(+), 0 deletions(-)
 create mode 100644 scripts/init-logger.c

diff --git a/scripts/Makefile.am b/scripts/Makefile.am
index 5b28c6e..3d25b6a 100644
--- a/scripts/Makefile.am
+++ b/scripts/Makefile.am
@@ -17,7 +17,11 @@
 
 include $(top_srcdir)/pathsubst.am
 
+init-logger: init-logger.c
+	diet -Os gcc -static -s -o init-logger init-logger.c
+
 vzlib_SCRIPTS = \
+        init-logger \
 	vps-create \
 	vps-functions \
 	vps-net_add \
diff --git a/scripts/init-logger.c b/scripts/init-logger.c
new file mode 100644
index 0000000..1153b1b
--- /dev/null
+++ b/scripts/init-logger.c
@@ -0,0 +1,163 @@
+/*
+
+     Copyright (C) 2008 Proxmox Server Solutions GmbH
+
+     This program is free software; you can redistribute it and/or modify
+     it under the terms of the GNU General Public License as published by
+     the Free Software Foundation; version 2 dated June, 1991.
+
+     This program is distributed in the hope that it will be useful,
+     but WITHOUT ANY WARRANTY; without even the implied warranty of
+     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+     GNU General Public License for more details.
+
+     You should have received a copy of the GNU General Public License
+     along with this program; if not, write to the Free Software Foundation,
+     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+     You should have received a copy of the GNU General Public License
+
+     Author: Dietmar Maurer <dietmar at proxmox.com>
+
+     Compile statically using dietlibc:
+     diet -Os gcc -static -s -o init-logger.ARCH init-logger.c
+*/
+
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <errno.h>
+#include <stdio.h>
+#include <signal.h>
+#include <sys/select.h>
+
+/* Set a signal handler */
+static void
+setsig(struct sigaction *sa, int sig,
+		   void (*fun)(int), int flags)
+{
+	sa->sa_handler = fun;
+	sa->sa_flags = flags;
+	sigemptyset(&sa->sa_mask);
+	sigaction(sig, sa, NULL);
+}
+
+static int terminate = 0;
+
+void
+term_handler()
+{
+	terminate = 1;
+}
+
+ssize_t
+safe_read (int fd, char *buf, size_t count)
+{
+	ssize_t n;
+
+	do {
+		n = read (fd, buf, count);
+	} while (n < 0 && errno == EINTR);
+
+	return n;
+}
+
+ssize_t
+safe_write (int fd, char *buf, size_t count)
+{
+	ssize_t n;
+
+	do {
+		n = write (fd, buf, count);
+	} while (n < 0 && errno == EINTR);
+
+	return n;
+}
+
+int
+full_write(int fd, char *buf, size_t len)
+{
+	size_t n;
+	size_t total;
+
+	total = 0;
+
+	while (len > 0) {
+	        n = safe_write(fd, buf, len);
+
+		if (n < 0)
+		        break;
+
+		buf += n;
+		total += n;
+		len -= n;
+	}
+
+	return total;
+}
+
+static void
+simple_cat (void)
+{
+        int bufsize = 256;
+	char buf[bufsize];
+	size_t n_read;
+	int noop_count = 0;
+
+	fd_set rfds;
+	struct timeval tv;
+	int retval;
+
+	FD_ZERO(&rfds);
+	FD_SET(STDIN_FILENO, &rfds);
+
+	tv.tv_sec = 1;
+	tv.tv_usec = 0;
+
+	while ((retval = select(STDIN_FILENO + 1, &rfds, NULL, NULL, &tv)) >= 0 ||
+	       (errno == EINTR)) {
+
+		tv.tv_sec = 1;
+		tv.tv_usec = 0;
+
+		FD_ZERO(&rfds);
+		FD_SET(STDIN_FILENO, &rfds);
+
+		if (retval == -1 && errno == EINTR)
+		    continue;
+
+		if (retval) {
+			n_read = safe_read (STDIN_FILENO, buf, bufsize);
+			if (n_read ==  ((size_t) -1))
+				return;
+
+			noop_count = 0;
+
+			if (full_write (STDOUT_FILENO, buf, n_read) != n_read)
+				return;
+		} else {
+			if (terminate)
+				noop_count++;
+		}
+
+		if (noop_count >= 2)
+			return;
+	}
+}
+
+int
+main(int argc, char * argv[])
+{
+	struct sigaction sa;
+
+	setsig(&sa, SIGTERM, term_handler, SA_RESTART);
+	setsig(&sa, SIGINT, term_handler, SA_RESTART);
+
+	printf ("starting init logger\n");
+
+	simple_cat();
+
+	printf ("\ninit logger finished\n");
+
+	exit (0);
+}
-- 
1.5.6.5





More information about the Devel mailing list