summaryrefslogtreecommitdiff
path: root/system-bsd.c
diff options
context:
space:
mode:
authorToby Goodwin <tjg@star.le.ac.uk>1999-01-11 10:55:18 +0000
committerToby Goodwin <toby@paccrat.org>2015-05-16 21:22:09 +0100
commite11c7df86144bed383ac6bbeaecc3017d18b37db (patch)
tree6fad44921723eab2f2eb1c76b7214b4e79b818f3 /system-bsd.c
parent671e1e2d1599aa8c5f1010b3fe75c151c56a7403 (diff)
beta: rc-1.5b4
Diffstat (limited to 'system-bsd.c')
-rw-r--r--system-bsd.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/system-bsd.c b/system-bsd.c
new file mode 100644
index 0000000..3babaea
--- /dev/null
+++ b/system-bsd.c
@@ -0,0 +1,60 @@
+/* signal-safe read and write (for BSD slow devices). writeall() also
+allows partial writes */
+
+#include <errno.h>
+
+#include "rc.h"
+#include "jbwrap.h"
+#include "wait.h"
+
+Jbwrap slowbuf;
+volatile sig_atomic_t slow;
+
+static char *safe_buf;
+static size_t safe_remain;
+
+extern void writeall(int fd, char *buf, size_t remain) {
+ int i;
+
+ safe_buf = buf;
+ safe_remain = remain;
+ for (i = 0; safe_remain > 0; buf += i, safe_remain -= i) {
+ if (sigsetjmp(slowbuf.j, 1) == 0) {
+ slow = TRUE;
+ if ((i = write(fd, safe_buf, safe_remain)) <= 0)
+ break; /* abort silently on errors in write() */
+ } else
+ break;
+ }
+ slow = FALSE;
+ sigchk();
+}
+
+extern int rc_read(int fd, char *buf, size_t n) {
+ ssize_t r;
+
+ if (sigsetjmp(slowbuf.j, 1) == 0) {
+ slow = TRUE;
+ r = read(fd, buf, n);
+ } else {
+ errno = EINTR;
+ r = -1;
+ }
+ slow = FALSE;
+
+ return r;
+}
+
+static int r = -1;
+extern pid_t rc_wait(int *stat) {
+ if (sigsetjmp(slowbuf.j, 1) == 0) {
+ slow = TRUE;
+ r = wait(stat);
+ } else {
+ errno = EINTR;
+ r = -1;
+ }
+ slow = FALSE;
+
+ return r;
+}