static int do_clear;
static int align_mask = 65535;
+static int force_unalign;
+static int splice_flags;
int do_vmsplice(int fd, void *b1, void *b2, int len)
{
if (poll(&pfd, 1, -1) < 0)
return error("poll");
- written = vmsplice(fd, &iov[idx], 2 - idx, 0);
+ written = vmsplice(fd, &iov[idx], 2 - idx, splice_flags);
if (written <= 0)
return error("vmsplice");
static int usage(char *name)
{
- fprintf(stderr, "%s: [-c(lear)] [-u(nalign)] | ...\n", name);
+ fprintf(stderr, "%s: [-c(lear)] [-u(nalign)] [-g(ift)]| ...\n", name);
return 1;
}
{
int c, index = 1;
- while ((c = getopt(argc, argv, "cu")) != -1) {
+ while ((c = getopt(argc, argv, "cug")) != -1) {
switch (c) {
case 'c':
do_clear = 1;
index++;
break;
case 'u':
- align_mask = 0;
+ force_unalign = 1;
+ index++;
+ break;
+ case 'g':
+ splice_flags = SPLICE_F_GIFT;
index++;
break;
default:
b1 = ALIGN(malloc(SPLICE_SIZE + align_mask));
b2 = ALIGN(malloc(SPLICE_SIZE + align_mask));
+ if (force_unalign) {
+ b1 += 1024;
+ b2 += 1024;
+ }
+
memset(b1, 0xaa, SPLICE_SIZE);
memset(b2, 0xbb, SPLICE_SIZE);