blob: c86df0f8bba76be5acaf2d7e1d17880f49f6c0bc [file]
/*
* Copyright 2024 The Emscripten Authors. All rights reserved.
* Emscripten is available under two separate licenses, the MIT license and the
* University of Illinois/NCSA Open Source License. Both these licenses can be
* found in the LICENSE file.
*/
// Regression test: writev must gather all iovecs into a single FS.write so a
// stream socket send is not fragmented into one segment per iovec.
#include <assert.h>
#include <emscripten/emscripten.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/uio.h>
#include <unistd.h>
int main() {
EM_ASM({
var dev = FS.makedev(64, 0);
FS.registerDevice(dev, {
write: (stream, buffer, offset, length, pos) => {
// A single gather-write for the whole payload, exactly once.
assert(length == 8, 'expected a single 8-byte gather write');
var s = String.fromCharCode.apply(null, buffer.subarray(offset, offset + length));
assert(s == 'a=1\nb=2\n', 'unexpected gather-write payload: ' + s);
return length;
}
});
FS.mkdev('/wdev', dev);
});
int fd = open("/wdev", O_WRONLY);
assert(fd >= 0);
char buf0[] = "a=1\n";
char buf1[] = "b=2\n";
struct iovec iov[] = {{.iov_base = buf0, .iov_len = 4},
{.iov_base = buf1, .iov_len = 4}};
ssize_t nwritten = writev(fd, iov, 2);
assert(nwritten == 8);
close(fd);
printf("done\n");
return 0;
}