#include #include #include #include #include #include #include #include #include #include #ifdef FREEBSD_SENDFILE #include #include #endif /* FREEBSD_SENDFILE */ #define READ_BUFF_SIZE 4096 #define MISC_BUFF_SIZE 256 #ifndef min #define min(a,b) (a)<(b)?(a):(b) #endif int32 Skipn(fd in, int32 n){ int32 ntotread=0; int32 nread; uint8 c[READ_BUFF_SIZE]; while(ntotread0) { if(sendfile(in, out, 0, n, &ntotread, 0)<0) { if(errno!=EINVAL) return NET_ERROR; } else return ntotread; } else if(n<0) { if(sendfile(in, out, 0, 0, &ntotread, 0)<0) { if(errno!=EINVAL) return NET_ERROR; } else return ntotread; } #endif /* FREEBSD_SENDFILE */ ntotread=0; while(n<0||ntotreadai_next) { int status=Socket(in, rp->ai_family, rp->ai_socktype); if(status>=0) { if(connect(*in,rp->ai_addr,rp->ai_addrlen)>=0) break; Close(in); } } freeResults(results); results=NULL; if(rp==NULL) return NET_ERROR; return NET_OK; } int32 Bind(fd *bindin, char *ip, char *service){ struct addrinfo *results, *rp; results=getResults(ip, service, AI_PASSIVE, SOCK_STREAM, 0); if(results==NULL) return NET_ERROR; for(rp=results; rp; rp=rp->ai_next) { int status; status=Socket(bindin, rp->ai_family, rp->ai_socktype); rp->ai_protocol=0; if(status==NET_OK) { int opt=1; setsockopt(*bindin,SOL_SOCKET,SO_REUSEADDR,(const char *)&opt,sizeof(opt)); if(bind(*bindin,rp->ai_addr,rp->ai_addrlen)>=0) break; Close(bindin); } } freeResults(results); results=NULL; if(rp==NULL) return NET_ERROR; if(listen(*bindin,NET_BACKLOG)!=0) { Close(bindin); return NET_ERROR; } return NET_OK; } int32 Accept(fd *bindin, fd *acceptin) { struct sockaddr caddr; uint32 caddrs=sizeof(caddr); *acceptin = accept(*bindin,(struct sockaddr *)&caddr, &caddrs); if(*acceptin<0) { return NET_ERROR; } return NET_OK; }