version 1.5, 2007/01/03 19:27:28 |
version 1.6, 2007/01/13 15:29:34 |
|
|
return (ldata); |
return (ldata); |
} |
} |
|
|
BUF * |
void |
cvs_remote_receive_file(size_t len) |
cvs_remote_receive_file(int fd, size_t len) |
{ |
{ |
BUF *bp; |
|
FILE *in; |
FILE *in; |
size_t ret; |
|
char *data; |
char *data; |
|
size_t nread, nwrite, nleft, toread; |
|
|
if (cvs_server_active) |
if (cvs_server_active) |
in = stdin; |
in = stdin; |
else |
else |
in = current_cvsroot->cr_srvout; |
in = current_cvsroot->cr_srvout; |
|
|
bp = cvs_buf_alloc(len, BUF_AUTOEXT); |
data = xmalloc(MAXBSIZE); |
|
nleft = len; |
|
|
if (len != 0) { |
while (nleft > 0) { |
data = xmalloc(len); |
toread = MIN(nleft, MAXBSIZE); |
ret = fread(data, sizeof(char), len, in); |
|
if (ret != len) |
|
fatal("length mismatch, expected %ld, got %ld", |
|
len, ret); |
|
cvs_buf_set(bp, data, len, 0); |
|
xfree(data); |
|
} |
|
|
|
if (cvs_server_active == 0 && cvs_client_outlog_fd != -1) { |
nread = fread(data, sizeof(char), toread, in); |
if (cvs_buf_write_fd(bp, cvs_client_outlog_fd) < 0) |
if (nread == 0) |
fatal("cvs_remote_receive_file: cvs_buf_write_fd"); |
fatal("error receiving file"); |
|
|
|
nwrite = write(fd, data, nread); |
|
if (nwrite != nread) |
|
fatal("failed to write %ld bytes", nread); |
|
|
|
if (cvs_server_active == 0 && |
|
cvs_client_outlog_fd != -1) |
|
(void)write(cvs_client_outlog_fd, data, nread); |
|
|
|
nleft -= nread; |
} |
} |
|
|
return (bp); |
xfree(data); |
} |
} |
|
|
void |
void |
cvs_remote_send_file(const char *path) |
cvs_remote_send_file(const char *path) |
{ |
{ |
BUF *bp; |
|
int l, fd; |
int l, fd; |
FILE *out; |
FILE *out, *in; |
size_t ret; |
size_t ret, rw, total; |
struct stat st; |
struct stat st; |
char buf[16], *fcont; |
char buf[16], *data; |
|
|
if (cvs_server_active) |
if (cvs_server_active) |
out = stdout; |
out = stdout; |
|
|
fatal("cvs_remote_send_file: overflow"); |
fatal("cvs_remote_send_file: overflow"); |
cvs_remote_output(buf); |
cvs_remote_output(buf); |
|
|
bp = cvs_buf_load_fd(fd, BUF_AUTOEXT); |
if ((in = fdopen(fd, "r")) == NULL) |
|
fatal("cvs_remote_send_file: fdopen %s", strerror(errno)); |
|
|
if (cvs_server_active == 0 && cvs_client_inlog_fd != -1) { |
total = 0; |
if (cvs_buf_write_fd(bp, cvs_client_inlog_fd) < 0) |
data = xmalloc(MAXBSIZE); |
fatal("cvs_remote_send_file: cvs_buf_write"); |
while ((ret = fread(data, sizeof(char), MAXBSIZE, in)) != 0) { |
} |
rw = fwrite(data, sizeof(char), ret, out); |
|
if (rw != ret) |
|
fatal("failed to write %ld bytes", ret); |
|
|
fcont = cvs_buf_release(bp); |
if (cvs_server_active == 0 && |
|
cvs_client_outlog_fd != -1) |
|
(void)write(cvs_client_outlog_fd, data, ret); |
|
|
if (fcont != NULL) { |
total += ret; |
ret = fwrite(fcont, sizeof(char), st.st_size, out); |
|
if (ret != st.st_size) |
|
fatal("tried to write %lld only wrote %ld", |
|
st.st_size, ret); |
|
xfree(fcont); |
|
} |
} |
|
|
(void)close(fd); |
xfree(data); |
|
|
|
if (total != st.st_size) |
|
fatal("length mismatch, %ld vs %ld", total, st.st_size); |
|
|
|
(void)fclose(in); |
} |
} |
|
|
void |
void |