commit f9d8661b68f61636701e3320cafaf5853db70123 from: Omar Polo date: Mon May 23 13:30:14 2022 UTC report the correct write length commit - c234caae8bdf0b2be5ee26fee87f0fcbf0d95488 commit + f9d8661b68f61636701e3320cafaf5853db70123 blob - a906118a4be90368060771d0784128b29cb69255 blob + 602fa1a38bbd3bd9ae043608eacf421054cc6049 --- kamid/client.c +++ kamid/client.c @@ -182,8 +182,8 @@ static void twalk(struct np_msg_header *, const uint8_ static void topen(struct np_msg_header *, const uint8_t *, size_t); static void tcreate(struct np_msg_header *, const uint8_t *, size_t); static void tread(struct np_msg_header *, const uint8_t *, size_t); -static void twrite(struct np_msg_header *, const uint8_t *, size_t, struct fid **, off_t *, size_t *, int *); -static void twrite_cont(struct fid *, off_t *, size_t *, int *, uint16_t, const uint8_t *, size_t); +static void twrite(struct np_msg_header *, const uint8_t *, size_t, struct fid **, off_t *, size_t *, size_t *, int *); +static void twrite_cont(struct fid *, off_t *, size_t *, size_t *, int *, uint16_t, const uint8_t *, size_t); static void tstat(struct np_msg_header *, const uint8_t *, size_t); static void twstat(struct np_msg_header *, const uint8_t *, size_t); static void tremove(struct np_msg_header *, const uint8_t *, size_t); @@ -1570,7 +1570,8 @@ tread(struct np_msg_header *hdr, const uint8_t *data, static void twrite(struct np_msg_header *hdr, const uint8_t *data, size_t len, - struct fid **writefid, off_t *writepos, size_t *writeleft, int *writeskip) + struct fid **writefid, off_t *writepos, size_t *writetot, + size_t *writeleft, int *writeskip) { struct fid *f; ssize_t r; @@ -1617,14 +1618,16 @@ twrite(struct np_msg_header *hdr, const uint8_t *data, if (count > len) { *writefid = f; *writepos = off + len; + *writetot = len; *writeleft = count - len; *writeskip = 0; } } static void -twrite_cont(struct fid *f, off_t *writepos, size_t *writeleft, int *writeskip, - uint16_t tag, const uint8_t *data, size_t len) +twrite_cont(struct fid *f, off_t *writepos, size_t *writetot, + size_t *writeleft, int *writeskip, uint16_t tag, const uint8_t *data, + size_t len) { ssize_t r; @@ -1640,11 +1643,12 @@ twrite_cont(struct fid *f, off_t *writepos, size_t *wr return; } + *writetot += len; *writeleft -= len; *writepos += len; if (*writeleft == 0) - np_write(tag, r); + np_write(tag, *writetot); } static void @@ -1913,6 +1917,7 @@ handle_message(struct imsg *imsg, size_t len, int cont { static struct fid *writefid; static off_t writepos; + static size_t writetot; static size_t writeleft; static int writeskip; static uint16_t writetag; @@ -1965,14 +1970,14 @@ handle_message(struct imsg *imsg, size_t len, int cont return; } - log_warnx("continuing..."); - twrite_cont(writefid, &writepos, &writeleft, &writeskip, - writetag, imsg->data, len); + twrite_cont(writefid, &writepos, &writetot, &writeleft, + &writeskip, writetag, imsg->data, len); return; } writefid = NULL; writepos = -1; + writetot = 0; writeleft = 0; writeskip = 0; @@ -1990,8 +1995,8 @@ handle_message(struct imsg *imsg, size_t len, int cont if (hdr.type == Twrite) { writetag = hdr.tag; - twrite(&hdr, data, len, &writefid, &writepos, &writeleft, - &writeskip); + twrite(&hdr, data, len, &writefid, &writepos, &writetot, + &writeleft, &writeskip); return; }