+void Qfcntl_setfl(int fd, int cmd, long arg) {
+ vb.used= 0;
+ Tvbf("fcntl(%d, F_SETFL, %ld)",fd,arg);
+ Q_vb();
+}
+
+void Qfcntl_other(int fd, int cmd) {
+ assert(cmd==F_GETFL);
+ vb.used= 0;
+ Tvbf("fcntl(%d, F_GETFL)",fd);
+ Q_vb();
+}
+
+void Qconnect(int fd, struct sockaddr *addr, int addrlen) {
+ vb.used= 0;
+ Tvbf("connect(%d, ",fd);
+ Tvbaddr(addr,addrlen);
+ Tvba(")");
+ Q_vb();
+}
+
+void Qclose(int fd) {
+ vb.used= 0;
+ Tvbf("close(%d)",fd);
+ Q_vb();
+}
+
+void Qsendto(int fd, const void *msg, int msglen,
+ const struct sockaddr *addr, int addrlen) {
+ vb.used= 0;
+ Tvbf("sendto(%d,,,, ",fd);
+ Tvbaddr(addr,addrlen);
+ Tvba(")");
+ Tvbbytes(msg,msglen);
+ Q_vb();
+}
+
+void Qrecvfrom(int fd, int buflen, int addrlen) {
+ vb.used= 0;
+ Tvbf("recvfrom(%d,,%d,,,%d)",fd,buflen,addrlen);
+ Q_vb();
+}
+
+void Qread(int fd, size_t len) {
+ vb.used= 0;
+ Tvbf("read(%d,,%lu)",fd,(unsigned long)len);
+ Q_vb();
+}
+
+void Qwrite(int fd, const void *buf, size_t len) {
+ vb.used= 0;
+ Tvbf("write(%d,,)",fd);
+ Tvbbytes(buf,len);
+ Q_vb();
+}
+
+
+void Tvbaddr(const struct sockaddr *addr, int len) {
+ const struct sockaddr_in *ai= (const struct sockaddr_in*)addr;
+
+ assert(len==sizeof(struct sockaddr_in));
+ assert(ai->sin_family==AF_INET);
+ Tvbf(" %s:%u",inet_ntoa(ai->sin_addr),htons(ai->sin_port));
+}
+
+void Tvbbytes(const void *buf, int len) {
+ const byte *bp;
+ int i;
+
+ if (!len) { Tvba(" empty"); return; }
+ for (i=0, bp=buf; i<len; i++, bp++) {
+ if (!(i&31)) Tvba("\n ");
+ else if (!(i&3)) Tvba(" ");
+ Tvbf("%02x",*bp);
+ }
+}
+
+void Tvbfdset(int max, const fd_set *fds) {
+ int i;
+ const char *comma= "";
+
+ Tvba(" [");
+ for (i=0; i<max; i++) {
+ if (!FD_ISSET(i,fds)) continue;
+ Tvba(comma);
+ Tvbf("%d",i);
+ comma= ",";
+ }
+ Tvba("]");
+}
+
+void Tvberrno(int e) {
+ const struct Terrno *te;