}
}
+static ssize_t read_nointr(int fd, void *buf, size_t count)
+{
+ ssize_t len;
+ do{
+ len = read(fd, buf, count);
+ } while (len == -1 && errno == EINTR);
+ return len;
+}
+
static void readpipe(int fd, char **path, char **lastname, char **lastdir)
{
int r;
char ctx, *nextpath = NULL;
- ssize_t len = read(fd, g_buf, 1);
+ ssize_t len = read_nointr(fd, g_buf, 1);
if (len != 1)
return;
return;
}
- len = read(fd, g_buf, 1);
+ len = read_nointr(fd, g_buf, 1);
if (len != 1)
return;
char op = g_buf[0];
if (op == 'c') {
- len = read(fd, g_buf, PATH_MAX);
+ len = read_nointr(fd, g_buf, PATH_MAX);
if (len <= 0)
return;
_exit(EXIT_SUCCESS);
}
- int rfd = open(g_pipepath, O_RDONLY);
+ int rfd;
+ do {
+ rfd = open(g_pipepath, O_RDONLY);
+ } while (rfd == -1 && errno == EINTR);
readpipe(rfd, path, lastname, lastdir);
close(rfd);