summaryrefslogtreecommitdiffstats
path: root/qarshd.c
diff options
context:
space:
mode:
Diffstat (limited to 'qarshd.c')
-rw-r--r--qarshd.c46
1 files changed, 19 insertions, 27 deletions
diff --git a/qarshd.c b/qarshd.c
index 6cb52e0..15cf1d6 100644
--- a/qarshd.c
+++ b/qarshd.c
@@ -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,