- if (!ent) return bind(fd,addr,addrlen);
- if (chkaddr(ent,addr,addrlen)) return -1;
- memset(&ent->bound,0,sizeof(ent->bound));
- memcpy(&ent->bound,addr,addrlen);
- return 0;
+ if (!ent) return old_bind(fd,addr,addrlen);
+ const char *dir = getenv("UDP_PRELOAD_DIR");
+ if (!dir) { errno=ECHILD; return -1; }
+ struct sockaddr_un sun;
+ memset(&sun,0,sizeof(sun));
+ sun.sun_family=AF_UNIX;
+ int dl = strlen(dir);
+ if (dl + 1 + ADDRPORTSTRLEN + 1 > sizeof(sun.sun_path)) {
+ errno=ENAMETOOLONG; return -1;
+ }
+ strcpy(sun.sun_path,dir);
+ char *p=sun.sun_path+dl;
+ *p++='/';
+ if (addrport2str(p,addr,addrlen)) return -1;
+//fprintf(stderr,"binding %s\n",sun.sun_path);
+ return old_bind(fd,(const void*)&sun,sizeof(sun));