X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=test%2Fudp-preload.c;h=49457ad42af888c8018d9c342f2f139fc9ef96f8;hb=539f5d7682b0afcf4f79c048666ade37da387272;hp=c82b700394d718d2f22fb41064eb16df0725e4b4;hpb=43a695672884159a6121be7f9c7b6160346e275c;p=secnet.git diff --git a/test/udp-preload.c b/test/udp-preload.c index c82b700..49457ad 100644 --- a/test/udp-preload.c +++ b/test/udp-preload.c @@ -60,6 +60,8 @@ static anyfn_type *find_any(const char *name) { #define socket_args int domain, int type, int protocol #define close_args int fd #define bind_args int fd, const struct sockaddr *addr, socklen_t addrlen +#define sendto_args int fd, const void *buf, size_t len, int flags, \ + const struct sockaddr *addr, socklen_t addrlen #define setsockopt_args int fd, int level, int optname, \ const void *optval, socklen_t optlen #define getsockname_args int fd, struct sockaddr *addr, socklen_t *addrlen @@ -67,6 +69,7 @@ static anyfn_type *find_any(const char *name) { X(socket, int, (domain,type,protocol)) \ X(close, int, (fd)) \ X(bind, int, (fd,addr,addrlen)) \ + X(sendto, ssize_t, (fd,buf,len,flags,addr,addrlen)) \ X(setsockopt, int, (fd,level,optname,optval,optlen)) \ X(getsockname,int, (fd,addr,addrlen)) @@ -93,7 +96,7 @@ static fdinfo **table; static int tablesz; static fdinfo *lookup(int fd) { - if (fd>=tablesz) return 0; + if (fd<0 || fd>=tablesz) return 0; return table[fd]; } @@ -147,7 +150,10 @@ static int str2addrport(char *str, char *comma=strchr(str,','); if (!comma) { errno=ESRCH; return -1; } *comma++=0; - if (inet_pton(af,str,iav)) return -1; + int r=inet_pton(af,str,iav); +//fprintf(stderr,"inet_pton(%d,\"%s\",)=%d\n",af,str,r); + if (r<0) return -1; + if (r==0) { errno=ENOTTY; return -1; } char *ep; errno=0; @@ -200,7 +206,7 @@ WRAP(socket) { } WRAP(close) { - if (fd=0 && fd ADDRPORTSTRLEN) { errno=ENAMETOOLONG; return -1; } + struct sockaddr_un sun; + char *p=sun_prep(&sun); + strcpy(p,leaf); + + char tbuf[ADDRPORTSTRLEN+1]; + memset(tbuf,0,sizeof(tbuf)); + if (addrport2str(tbuf,addr,addrlen)) return -1; + + struct iovec iov[2]; + iov[0].iov_base=tbuf; + iov[0].iov_len=sizeof(tbuf); + iov[1].iov_base=(void*)buf; + iov[1].iov_len=len; + + struct msghdr m; + memset(&m,0,sizeof(m)); + m.msg_name=&sun; + m.msg_namelen=sizeof(sun); + m.msg_iov=iov; + m.msg_iovlen=2; + + return sendmsg(fd,&m,0); +}