+redirect (fd, buffer, nbuffer, write_function)
+ int fd;
+ char *buffer;
+ int nbuffer;
+ int (*write_function) (int, const char *, int);
+{
+ sigset_t mask, orig_mask;
+ struct pollfd writefds[1];
+ int wrote;
+ char *retry;
+
+ sigemptyset (&mask);
+ sigaddset (&mask, SIGALRM);
+
+ writefds[0].fd = fd;
+ writefds[0].events = POLLOUT;
+
+ for (retry = buffer; nbuffer > 0; nbuffer -= wrote, retry += wrote)
+ {
+ int ready;
+
+ sigprocmask (SIG_SETMASK, &mask, &orig_mask);
+ ready = poll (writefds, 1, -1);
+ sigprocmask (SIG_SETMASK, &orig_mask, NULL);
+ if (ready == -1 && errno != EINTR)
+ {
+ if (opt_assuan)
+ printf ("ERR 1 poll: %s\r\n", strerror (errno));
+ return 1;
+ }
+ wrote = (*write_function)(fd, retry, nbuffer);
+ if (wrote == -1)
+ {
+ if (opt_assuan)
+ printf ("ERR 1 write: %s\r\n", strerror (errno));
+ return 1;
+ }
+ }
+}
+
+int