X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=send-stream.c;h=78f2571ae40be82cbce1b7eb40e80c5293acd6c8;hb=14bf2b546d1cdc4ea20304d2fb7d67d75f8a2c55;hp=80bf680b651c70050e1303844090b6c0405231aa;hpb=fefbab75208e570b26b45481db3e5ced6e9e0853;p=platform%2Fupstream%2Fbtrfs-progs.git diff --git a/send-stream.c b/send-stream.c index 80bf680..78f2571 100644 --- a/send-stream.c +++ b/send-stream.c @@ -33,6 +33,12 @@ struct btrfs_send_stream { struct btrfs_tlv_header *cmd_attrs[BTRFS_SEND_A_MAX + 1]; u32 version; + /* + * end of last successful read, equivalent to start of current + * malformated part of block + */ + size_t stream_pos; + struct btrfs_send_ops *ops; void *user; }; @@ -68,9 +74,11 @@ static int read_buf(struct btrfs_send_stream *sctx, char *buf, size_t len) ret = 0; out_eof: - if (pos < len) { + if (0 < pos && pos < len) { error("short read from stream: expected %zu read %zu", len, pos); ret = -EIO; + } else { + sctx->stream_pos += pos; } out: @@ -478,12 +486,13 @@ int btrfs_read_and_process_send_stream(int fd, sctx.fd = fd; sctx.ops = ops; sctx.user = user; + sctx.stream_pos = 0; ret = read_buf(&sctx, (char*)&hdr, sizeof(hdr)); if (ret < 0) goto out; if (ret) { - ret = 1; + ret = -ENODATA; goto out; }