sock->sk = NULL;
p2pkp_destroy_udp_sock(ps->net_sock);
+ if (ps->file) {
+ p2pkp_close_file(ps->file);
+ ps->file = 0;
+ }
sock_put(sk);
DEBUG("Released the socket");
lock_sock(sk);
if (!(sock->state & SS_CONNECTED)) {
ERROR("unconnected socket");
- err = -ECONNREFUSED;
- goto release;
+ release_sock(sk);
+ return -ECONNREFUSED;
}
release_sock(sk);
err = -ENOENT;
continue;
}
+ ps->file = file;
DEBUG("opened file %s", file_name);
for (;;) {
bytes_read = p2pkp_read_from_file(file, ps->buffer, ps->buffer_len);
out_close:
p2pkp_close_file(file);
+ ps->file = 0;
}
DEBUG("Sending completed successfully");
-release:
- release_sock(sk);
return err ? err : files_no;
}
struct msghdr *m, size_t total_len, int flags)
{
int err = -ENXIO;
- int bytes_read, bytes_written;
+ int bytes_read, bytes_written = 0;
struct sock *sk = sock->sk;
struct p2pkp_sock *ps = sock2p2pkp(sk);
struct sockaddr_in *sin = (struct sockaddr_in *)m->msg_name;
ERROR("cannot open file %s\n", file_name);
return -ENOENT;
}
+ ps->file = file;
lock_sock(sk);
/* TODO keep connections */
- bytes_read = p2pkp_msgrecv(ps->net_sock, sin, ps->buffer, ps->buffer_len);
- DEBUG("XXX: received %d bytes\n", bytes_read);
- if (bytes_read > 0) {
- bytes_written = p2pkp_write_in_file(file, ps->buffer, bytes_read);
- err = 0;
- } else if (bytes_read < 0) {
- ERROR("cannot read data");
- err = -ENXIO;
- }
+ do {
+ bytes_read = p2pkp_msgrecv(ps->net_sock, sin, ps->buffer, ps->buffer_len);
+ if (bytes_read > 0) {
+ bytes_written += p2pkp_write_in_file(file, ps->buffer, bytes_read);
+ err = 0;
+ } else if (bytes_read != -ERESTARTSYS) {
+ ERROR("cannot read data: %d", bytes_read);
+ err = -ENXIO;
+ }
+ DEBUG("wrote %d", bytes_written);
+ } while (bytes_read < ps->buffer_len);
+
release_sock(sk);
p2pkp_close_file(file);
+ ps->file = 0;
return err ? err : bytes_written;
}
printf("Bound to: %s:%s\n", argv[0], argv[1]);
argv += 2;
- do {
- err = read(sock, argv[0], sizeof(argv[0]));
- if (err < 0) {
- printf("Error while receiving file %s: %s(%d)\n", argv[0],
- strerror(errno), errno);
- return err;
- }
- } while (err > 0);
+ err = read(sock, argv[0], sizeof(argv[0]));
+ if (err < 0) {
+ printf("Error while receiving file %s: %s(%d)\n", argv[0],
+ strerror(errno), errno);
+ return err;
+ }
printf("Successfully read file %s\n", argv[0]);