From 5d61e71c3a8ac3296afbfe9a014c62050c5a9234 Mon Sep 17 00:00:00 2001
From: Denis Vlasenko <vda.linux@googlemail.com>
Date: Thu, 27 Sep 2007 10:09:59 +0000
Subject: introduce safe_poll (fixes a problem in top)

function                                             old     new   delta
safe_poll                                              -      77     +77
svlogd_main                                         1470    1466      -4
zcip_main                                           1530    1524      -6
forkexec                                            1345    1338      -7
decode_format_string                                 795     788      -7
collect_blk                                          474     467      -7
buffer_pread                                         540     532      -8
tftp                                                1182    1172     -10
microcom_main                                        763     749     -14
arpping                                              441     424     -17
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 0/9 up/down: 77/-80)             Total: -3 bytes
   text    data     bss     dec     hex filename
 770162    1034   10404  781600   bed20 busybox_old
 770158    1034   10404  781596   bed1c busybox_unstripped
---
 libbb/Kbuild         |  1 +
 libbb/safe_poll.c    | 34 ++++++++++++++++++++++++++++++++++
 libbb/safe_strncpy.c |  2 +-
 3 files changed, 36 insertions(+), 1 deletion(-)
 create mode 100644 libbb/safe_poll.c

(limited to 'libbb')

diff --git a/libbb/Kbuild b/libbb/Kbuild
index 1800bde8f..55b3658b4 100644
--- a/libbb/Kbuild
+++ b/libbb/Kbuild
@@ -71,6 +71,7 @@ lib-y += recursive_action.o
 lib-y += remove_file.o
 lib-y += restricted_shell.o
 lib-y += run_shell.o
+lib-y += safe_poll.o
 lib-y += safe_strncpy.o
 lib-y += safe_write.o
 lib-y += setup_environment.o
diff --git a/libbb/safe_poll.c b/libbb/safe_poll.c
new file mode 100644
index 000000000..d2b773c36
--- /dev/null
+++ b/libbb/safe_poll.c
@@ -0,0 +1,34 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * Utility routines.
+ *
+ * Copyright (C) 2007 by Denys Vlasenko <vda.linux@googlemail.com>
+ *
+ * Licensed under GPLv2, see file LICENSE in this tarball for details.
+ */
+
+#include "libbb.h"
+
+/* Wrapper which restarts poll on EINTR or ENOMEM.
+ * On other errors does perror("poll") and returns.
+ * Warning! May take longer than timeout_ms to return! */
+int safe_poll(struct pollfd *ufds, nfds_t nfds, int timeout)
+{
+	while (1) {
+		int n = poll(ufds, nfds, timeout);
+		if (n >= 0)
+			return n;
+		/* Make sure we inch towards completion */
+		if (timeout > 0)
+			timeout--;
+		/* E.g. strace causes poll to return this */
+		if (errno == EINTR)
+			continue;
+		/* Kernel is very low on memory. Retry. */
+		/* I doubt many callers would handle this correctly! */
+		if (errno == ENOMEM)
+			continue;
+		bb_perror_msg("poll");
+		return n;
+	}
+}
diff --git a/libbb/safe_strncpy.c b/libbb/safe_strncpy.c
index ebc7e28f3..cc425839f 100644
--- a/libbb/safe_strncpy.c
+++ b/libbb/safe_strncpy.c
@@ -10,7 +10,7 @@
 #include "libbb.h"
 
 /* Like strncpy but make sure the resulting string is always 0 terminated. */
-char * safe_strncpy(char *dst, const char *src, size_t size)
+char *safe_strncpy(char *dst, const char *src, size_t size)
 {
 	if (!size) return dst;
 	dst[--size] = '\0';
-- 
cgit v1.2.3