version 1.64, 2007/08/29 21:15:06 |
version 1.65, 2007/09/17 10:07:21 |
|
|
#include <string.h> |
#include <string.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
|
#include "atomicio.h" |
#include "cvs.h" |
#include "cvs.h" |
#include "buf.h" |
#include "buf.h" |
|
|
|
|
BUF * |
BUF * |
cvs_buf_load_fd(int fd, u_int flags) |
cvs_buf_load_fd(int fd, u_int flags) |
{ |
{ |
ssize_t ret; |
|
size_t len; |
|
u_char *bp; |
|
struct stat st; |
struct stat st; |
BUF *buf; |
BUF *buf; |
|
|
|
|
fatal("cvs_buf_load_fd: lseek: %s", strerror(errno)); |
fatal("cvs_buf_load_fd: lseek: %s", strerror(errno)); |
|
|
buf = cvs_buf_alloc(st.st_size, flags); |
buf = cvs_buf_alloc(st.st_size, flags); |
for (bp = buf->cb_buf; ; bp += (size_t)ret) { |
if (atomicio(read, fd, buf->cb_buf, buf->cb_size) != buf->cb_size) |
len = SIZE_LEFT(buf); |
fatal("cvs_buf_load_fd: read: %s", strerror(errno)); |
ret = read(fd, bp, len); |
buf->cb_len = buf->cb_size; |
if (ret == -1) |
|
fatal("cvs_buf_load_fd: read: %s", strerror(errno)); |
|
else if (ret == 0) |
|
break; |
|
|
|
buf->cb_len += (size_t)ret; |
|
} |
|
|
|
return (buf); |
return (buf); |
} |
} |
|
|
|
|
int |
int |
cvs_buf_write_fd(BUF *b, int fd) |
cvs_buf_write_fd(BUF *b, int fd) |
{ |
{ |
u_char *bp; |
if (atomicio(vwrite, fd, b->cb_buf, b->cb_len) != b->cb_len) |
size_t len; |
return (-1); |
ssize_t ret; |
|
|
|
len = b->cb_len; |
|
bp = b->cb_buf; |
|
|
|
do { |
|
ret = write(fd, bp, len); |
|
if (ret == -1) { |
|
if (errno == EINTR || errno == EAGAIN) |
|
continue; |
|
return (-1); |
|
} |
|
|
|
len -= (size_t)ret; |
|
bp += (size_t)ret; |
|
} while (len > 0); |
|
|
|
return (0); |
return (0); |
} |
} |
|
|