#include <stdlib.h>
#include <stdio.h>
#include <string.h>
+#include <errno.h>
#include <dlfcn.h>
+#include <fcntl.h>
#include <sys/uio.h>
#define INTERNAL __attribute__((visibility("internal")))
buffer = (char *)malloc(1024);
if(!iovecs)
iovecs = (struct iovec *)malloc(16*sizeof(struct iovec));
+
write_pos = buffer;
cur_vec = iovecs;
cur_vec->iov_base = write_pos;
length = 0;
+
write_int(0);
write_short(func);
}
-INTERNAL inline void send_packet(void)
+INTERNAL inline int get_out_fd(void)
{
static int fd = -1;
+
if(fd<0)
{
const char *var = getenv("GLWRAP_FD");
if(var)
fd = strtol(var, NULL, 0);
else
- fd = 2;
+ {
+ var = getenv("GLWRAP_FILE");
+ if(var)
+ {
+ fd = open(var, O_WRONLY|O_CREAT, 0644);
+ if(fd==-1)
+ {
+ fprintf(stderr, "Couldn't open dumpfile %s for output: %s", var, strerror(errno));
+ abort();
+ }
+ }
+ else
+ fd = 2;
+ }
}
+
+ return fd;
+}
+
+INTERNAL inline void send_partial_packet(void)
+{
+ next_vec();
+ write_pos = buffer;
+ write_int(length|0x80000000);
+ writev(get_out_fd(), iovecs, cur_vec-iovecs);
+
+ write_pos = buffer;
+ cur_vec = iovecs;
+ cur_vec->iov_base = write_pos;
+ length = 0;
+
+ write_int(0);
+}
+
+INTERNAL inline void send_packet(void)
+{
next_vec();
write_pos = buffer;
write_int(length);
- writev(fd, iovecs, cur_vec-iovecs);
+ writev(get_out_fd(), iovecs, cur_vec-iovecs);
}