diff options
Diffstat (limited to 'qarshd.c')
-rw-r--r-- | qarshd.c | 46 |
1 files changed, 19 insertions, 27 deletions
@@ -56,18 +56,14 @@ int child_exitted = 0; pid_t child_pid; sigset_t orig_sigmask; int childfds[3] = { -1, -1, -1 }; /* pipes to child for stdin/stdout/stderr */ +int receivefd = -1; +off_t recvsize = 0; +off_t received = 0; /* A mini cache for rstat so we can check it in pushfile */ char *saved_path = NULL; struct stat saved_stat; -struct remotefd { - int fd; - int direction; /* 0 incoming, 1 outgoing */ - off_t expectedsize; - off_t received; -} remotefds[8]; - int setup_user(char *user, char *group) { @@ -166,36 +162,36 @@ prepare_recvfile(struct qa_packet *qp) fchmod(fd, qp->qp_recvfile.qp_mode); /* Store fd to check data packets against */ - remotefds[0].fd = fd; - remotefds[0].direction = 0; - remotefds[0].expectedsize = qp->qp_recvfile.qp_count; - remotefds[0].received = 0; + receivefd = fd; + recvsize = qp->qp_recvfile.qp_count; + received = 0; - return make_qp_returncode(0, fd, "Ready to receive"); + return make_qp_returncode(0, 0, "Ready to receive"); } struct qa_packet * -receive_data(struct remotefd *rfd, struct qa_packet *qp) +receive_data(struct qa_packet *qp) { ssize_t nwrote; if (qp->qp_data.qp_count == 0) { /* EOF */ - close(rfd->fd); + close(receivefd); syslog(LOG_DEBUG, "Transfer complete\n"); return make_qp_returncode(0, 0, "Transfer complete"); } - /* syslog(LOG_DEBUG, "Data for %d, %d@%ld\n", rfd->fd, qp->qp_data.qp_count, qp->qp_data.qp_offset); */ - nwrote = write(rfd->fd, qp->qp_data.qp_blob, qp->qp_data.qp_count); + if (debug) syslog(LOG_DEBUG, "Data for %d, %d@%ld\n", + receivefd, qp->qp_data.qp_count, qp->qp_data.qp_offset); + nwrote = write(receivefd, qp->qp_data.qp_blob, qp->qp_data.qp_count); if (nwrote < 0) { return make_qp_returncode(-1, errno, strerror(errno)); } - rfd->received += nwrote; + received += nwrote; return NULL; } ssize_t -pushfile(const char *path, int remfd) +pushfile(const char *path) { int infd; off_t offset; @@ -236,7 +232,7 @@ pushfile(const char *path, int remfd) fprintf(stderr, "read() error: %s\n", strerror(errno)); qp = make_qp_returncode(-1, errno, strerror(errno)); } else { - qp = make_qp_data(remfd, offset, nbytes, buf); + qp = make_qp_data(0, offset, nbytes, buf); } send_packet(qoutfd, qp); offset += nbytes; @@ -498,19 +494,16 @@ handle_packets() qpfree(rp); break; case QP_DATA: - assert(qp->qp_data.qp_remfd == remotefds[0].fd); - rp = receive_data(&remotefds[0], qp); + rp = receive_data(qp); if (rp) { send_packet(qoutfd, rp); qpfree(rp); } break; case QP_SENDFILE: - syslog(LOG_INFO, "Sending file %s, remfd = %d\n", - qp->qp_sendfile.qp_path, - qp->qp_sendfile.qp_remfd); - nbytes = pushfile(qp->qp_sendfile.qp_path, - qp->qp_sendfile.qp_remfd); + syslog(LOG_INFO, "Sending file %s\n", + qp->qp_sendfile.qp_path); + nbytes = pushfile(qp->qp_sendfile.qp_path); if (nbytes < 0) { rp = make_qp_returncode(-1, errno, strerror(errno)); } else { @@ -525,7 +518,6 @@ handle_packets() rp = rstat(qp->qp_rstat.qp_path); send_packet(qoutfd, rp); qpfree(rp); - qpfree(qp); break; default: syslog(LOG_WARNING, |