Implement simple utility functions for reading and writing to fds

Signed-off-by: Christian Seiler <christian@iwakd.de>
Signed-off-by: Serge Hallyn <serge.hallyn@ubuntu.com>
This commit is contained in:
Christian Seiler 2013-05-20 17:54:23 +02:00 committed by Serge Hallyn
parent 65fbbb0a0f
commit 92f023dccc
2 changed files with 40 additions and 0 deletions

View File

@ -281,3 +281,38 @@ again:
goto again; goto again;
return status; return status;
} }
int lxc_write_nointr(int fd, const void* buf, size_t count)
{
int ret;
again:
ret = write(fd, buf, count);
if (ret < 0 && errno == EINTR)
goto again;
return ret;
}
int lxc_read_nointr(int fd, void* buf, size_t count)
{
int ret;
again:
ret = read(fd, buf, count);
if (ret < 0 && errno == EINTR)
goto again;
return ret;
}
int lxc_read_nointr_expect(int fd, void* buf, size_t count, const void* expected_buf)
{
int ret;
ret = lxc_read_nointr(fd, buf, count);
if (ret <= 0)
return ret;
if (ret != count)
return -1;
if (expected_buf && memcmp(buf, expected_buf, count) != 0) {
errno = EINVAL;
return -1;
}
return ret;
}

View File

@ -68,4 +68,9 @@ extern int __build_bug_on_failed;
extern int wait_for_pid(pid_t pid); extern int wait_for_pid(pid_t pid);
extern int lxc_wait_for_pid_status(pid_t pid); extern int lxc_wait_for_pid_status(pid_t pid);
/* send and receive buffers completely */
extern int lxc_write_nointr(int fd, const void* buf, size_t count);
extern int lxc_read_nointr(int fd, void* buf, size_t count);
extern int lxc_read_nointr_expect(int fd, void* buf, size_t count, const void* expected_buf);
#endif #endif