aboutsummaryrefslogtreecommitdiff
path: root/riemann.fmi.uni-sofia.bg/programs/nlogin-0.3-pre/safe_io.c
blob: 10d3c951d755e6005a9c7958dda9666c436cec91 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>

#define SAFE_IO(op,F,B,L) safe_io((int (*)())(op), F,B,L) /*EXTRACT_UNMOD*/
// #define SAFE_IO(op,F,B,L) op(F,B,L) /*EXTRACT_UNMOD*/

ssize_t safe_io(int (*op)(), int fd, void *x, size_t len) /*EXTRACT_INCL*/{
  int k = len;
  while (k > 0) {
    int ret = op(fd, x, k);
    if (ret <= 0) {
      if (ret && errno == EINTR) continue;
      break;
    }
    x += ret;
    k -= ret;
  }
  return len - k;
}