*** otp_src_R8B-0/erts/emulator/drivers/common/inet_drv.c Fri Mar 15 23:58:36 2002 --- otp_src_R8B-0-fixed/erts/emulator/drivers/common/inet_drv.c Fri Mar 15 23:57:09 2002 *************** *** 750,752 **** - #if 0 /* Currently not used, perhaps not tested */ static void *realloc_wrapper(void *current, size_t size){ --- 750,751 ---- *************** *** 758,760 **** #define REALLOC(X,Y) realloc_wrapper(X,Y) - #endif --- 757,758 ---- *************** *** 2804,2805 **** --- 2802,2806 ---- desc->state = INET_STATE_CLOSED; + } else if (desc->prebound && (desc->s != INVALID_SOCKET)) { + sock_select(desc, FD_READ | FD_WRITE | FD_CLOSE, 0); + desc->event_mask = 0; } *************** *** 3162,3165 **** struct ifreq *ifr; ! char buf[BUFSIZ]; ! char sbuf[BUFSIZ]; char* cp; --- 3163,3166 ---- struct ifreq *ifr; ! char *buf; ! char *sbuf; char* cp; *************** *** 3167,3176 **** char* sp; ! ifc.ifc_len = sizeof(buf); ! ifc.ifc_buf = buf; ! if (ioctl(desc->s, SIOCGIFCONF, (char *)&ifc) < 0) return ctl_error(sock_errno(), rbuf, rsize); - sp = sbuf; cplim = buf + ifc.ifc_len; /* skip over if's with big ifr_addr's */ --- 3168,3192 ---- char* sp; + int buflen; + int res; ! buf = NULL; ! buflen = 0; ! /* loop until we get all available interfaces */ ! do { ! buflen += 4096; ! buf = (char *)REALLOC(buf,buflen); ! ! ifc.ifc_len = buflen; ! ifc.ifc_buf = buf; ! ! if (ioctl(desc->s, SIOCGIFCONF, (char *)&ifc) < 0) { ! sys_free(buf); return ctl_error(sock_errno(), rbuf, rsize); + } + + } while ( (buflen-ifc.ifc_len) < sizeof(struct ifreq) ); + + sp = sbuf = ALLOC(buflen); cplim = buf + ifc.ifc_len; /* skip over if's with big ifr_addr's */ *************** *** 3185,3187 **** } ! return ctl_reply(INET_REP_OK, sbuf, sp - sbuf, rbuf, rsize); } --- 3201,3206 ---- } ! res = ctl_reply(INET_REP_OK, sbuf, sp - sbuf, rbuf, rsize); ! sys_free(buf); ! sys_free(sbuf); ! return res; }