Ed Swierk wrote: > The UDP emulation code for talk has been commented out since the > beginning of time, and unless someone who runs CU-SeeMe on qemu with > user-mode networking can vouch that the special magic (a) is necessary > and (b) works, let's get rid of the code. > > Signed-off-by: Ed Swierk > As expressed before, I don't feel like I could comment on the usefulness of the to-be-removed emulation. But if no one speaks up on this, the patch has my ack. Jan > --- > diff --git a/slirp/misc.h b/slirp/misc.h > index c335394..da68d09 100644 > --- a/slirp/misc.h > +++ b/slirp/misc.h > @@ -36,11 +36,6 @@ void do_wait(int); > > #define EMU_NOCONNECT 0x10 /* Don't connect */ > > -/* UDP emulations */ > -#define EMU_TALK 0x1 > -#define EMU_NTALK 0x2 > -#define EMU_CUSEEME 0x3 > - > struct tos_t { > u_int16_t lport; > u_int16_t fport; > diff --git a/slirp/slirp_config.h b/slirp/slirp_config.h > index 5a0e6c1..e977e77 100644 > --- a/slirp/slirp_config.h > +++ b/slirp/slirp_config.h > @@ -2,9 +2,6 @@ > * User definable configuration options > */ > > -/* Undefine if you don't want talk emulation */ > -#undef EMULATE_TALK > - > /* Define if you want the connection to be probed */ > /* XXX Not working yet, so ignore this for now */ > #undef PROBE_CONN > diff --git a/slirp/udp.c b/slirp/udp.c > index e0a6693..a88b645 100644 > --- a/slirp/udp.c > +++ b/slirp/udp.c > @@ -42,7 +42,6 @@ > #include "ip_icmp.h" > > static u_int8_t udp_tos(struct socket *so); > -static void udp_emu(struct socket *so, struct mbuf *m); > > void > udp_init(Slirp *slirp) > @@ -202,9 +201,6 @@ udp_input(register struct mbuf *m, int iphlen) > /* > * Now we sendto() the packet. > */ > - if (so->so_emu) > - udp_emu(so, m); > - > if(sosendto(so,m) == -1) { > m->m_len += iphlen; > m->m_data -= iphlen; > @@ -306,31 +302,9 @@ int udp_output(struct socket *so, struct mbuf *m, > int > udp_attach(struct socket *so) > { > - struct sockaddr_in addr; > - > if((so->s = socket(AF_INET,SOCK_DGRAM,0)) != -1) { > - /* > - * Here, we bind() the socket. Although not really needed > - * (sendto() on an unbound socket will bind it), it's done > - * here so that emulation of ytalk etc. don't have to do it > - */ > - addr.sin_family = AF_INET; > - addr.sin_port = 0; > - addr.sin_addr.s_addr = INADDR_ANY; > - if(bind(so->s, (struct sockaddr *)&addr, sizeof(addr))<0) { > - int lasterrno=errno; > - closesocket(so->s); > - so->s=-1; > -#ifdef _WIN32 > - WSASetLastError(lasterrno); > -#else > - errno=lasterrno; > -#endif > - } else { > - /* success, insert in queue */ > - so->so_expire = curtime + SO_EXPIRE; > - insque(so, &so->slirp->udb); > - } > + so->so_expire = curtime + SO_EXPIRE; > + insque(so, &so->slirp->udb); > } > return(so->s); > } > @@ -344,9 +318,6 @@ udp_detach(struct socket *so) > > static const struct tos_t udptos[] = { > {0, 53, IPTOS_LOWDELAY, 0}, /* DNS */ > - {517, 517, IPTOS_LOWDELAY, EMU_TALK}, /* talk */ > - {518, 518, IPTOS_LOWDELAY, EMU_NTALK}, /* ntalk */ > - {0, 7648, IPTOS_LOWDELAY, EMU_CUSEEME}, /* Cu-Seeme */ > {0, 0, 0, 0} > }; > > @@ -367,239 +338,6 @@ udp_tos(struct socket *so) > return 0; > } > > -#ifdef EMULATE_TALK > -#include "talkd.h" > -#endif > - > -/* > - * Here, talk/ytalk/ntalk requests must be emulated > - */ > -static void > -udp_emu(struct socket *so, struct mbuf *m) > -{ > - struct sockaddr_in addr; > - socklen_t addrlen = sizeof(addr); > -#ifdef EMULATE_TALK > - CTL_MSG_OLD *omsg; > - CTL_MSG *nmsg; > - char buff[sizeof(CTL_MSG)]; > - u_char type; > - > -struct talk_request { > - struct talk_request *next; > - struct socket *udp_so; > - struct socket *tcp_so; > -} *req; > - > - static struct talk_request *req_tbl = 0; > - > -#endif > - > -struct cu_header { > - uint16_t d_family; // destination family > - uint16_t d_port; // destination port > - uint32_t d_addr; // destination address > - uint16_t s_family; // source family > - uint16_t s_port; // source port > - uint32_t so_addr; // source address > - uint32_t seqn; // sequence number > - uint16_t message; // message > - uint16_t data_type; // data type > - uint16_t pkt_len; // packet length > -} *cu_head; > - > - switch(so->so_emu) { > - > -#ifdef EMULATE_TALK > - case EMU_TALK: > - case EMU_NTALK: > - /* > - * Talk emulation. We always change the ctl_addr to get > - * some answers from the daemon. When an ANNOUNCE comes, > - * we send LEAVE_INVITE to the local daemons. Also when a > - * DELETE comes, we send copies to the local daemons. > - */ > - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) > - return; > - > -#define IS_OLD (so->so_emu == EMU_TALK) > - > -#define COPY_MSG(dest, src) { dest->type = src->type; \ > - dest->id_num = src->id_num; \ > - dest->pid = src->pid; \ > - dest->addr = src->addr; \ > - dest->ctl_addr = src->ctl_addr; \ > - memcpy(&dest->l_name, &src->l_name, NAME_SIZE_OLD); \ > - memcpy(&dest->r_name, &src->r_name, NAME_SIZE_OLD); \ > - memcpy(&dest->r_tty, &src->r_tty, TTY_SIZE); } > - > -#define OTOSIN(ptr, field) ((struct sockaddr_in *)&ptr->field) > -/* old_sockaddr to sockaddr_in */ > - > - > - if (IS_OLD) { /* old talk */ > - omsg = mtod(m, CTL_MSG_OLD*); > - nmsg = (CTL_MSG *) buff; > - type = omsg->type; > - OTOSIN(omsg, ctl_addr)->sin_port = addr.sin_port; > - OTOSIN(omsg, ctl_addr)->sin_addr = our_addr; > - pstrcpy(omsg->l_name, NAME_SIZE_OLD, getlogin()); > - } else { /* new talk */ > - omsg = (CTL_MSG_OLD *) buff; > - nmsg = mtod(m, CTL_MSG *); > - type = nmsg->type; > - OTOSIN(nmsg, ctl_addr)->sin_port = addr.sin_port; > - OTOSIN(nmsg, ctl_addr)->sin_addr = our_addr; > - pstrcpy(nmsg->l_name, NAME_SIZE_OLD, getlogin()); > - } > - > - if (type == LOOK_UP) > - return; /* for LOOK_UP this is enough */ > - > - if (IS_OLD) { /* make a copy of the message */ > - COPY_MSG(nmsg, omsg); > - nmsg->vers = 1; > - nmsg->answer = 0; > - } else > - COPY_MSG(omsg, nmsg); > - > - /* > - * If if is an ANNOUNCE message, we go through the > - * request table to see if a tcp port has already > - * been redirected for this socket. If not, we solisten() > - * a new socket and add this entry to the table. > - * The port number of the tcp socket and our IP > - * are put to the addr field of the message structures. > - * Then a LEAVE_INVITE is sent to both local daemon > - * ports, 517 and 518. This is why we have two copies > - * of the message, one in old talk and one in new talk > - * format. > - */ > - > - if (type == ANNOUNCE) { > - int s; > - u_short temp_port; > - > - for(req = req_tbl; req; req = req->next) > - if (so == req->udp_so) > - break; /* found it */ > - > - if (!req) { /* no entry for so, create new */ > - req = (struct talk_request *) > - malloc(sizeof(struct talk_request)); > - req->udp_so = so; > - req->tcp_so = solisten(0, > - OTOSIN(omsg, addr)->sin_addr.s_addr, > - OTOSIN(omsg, addr)->sin_port, > - SS_FACCEPTONCE); > - req->next = req_tbl; > - req_tbl = req; > - } > - > - /* replace port number in addr field */ > - addrlen = sizeof(addr); > - getsockname(req->tcp_so->s, > - (struct sockaddr *) &addr, > - &addrlen); > - OTOSIN(omsg, addr)->sin_port = addr.sin_port; > - OTOSIN(omsg, addr)->sin_addr = our_addr; > - OTOSIN(nmsg, addr)->sin_port = addr.sin_port; > - OTOSIN(nmsg, addr)->sin_addr = our_addr; > - > - /* send LEAVE_INVITEs */ > - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; > - OTOSIN(omsg, ctl_addr)->sin_port = 0; > - OTOSIN(nmsg, ctl_addr)->sin_port = 0; > - omsg->type = nmsg->type = LEAVE_INVITE; > - > - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); > - addr.sin_addr = our_addr; > - addr.sin_family = AF_INET; > - addr.sin_port = htons(517); > - sendto(s, (char *)omsg, sizeof(*omsg), 0, > - (struct sockaddr *)&addr, sizeof(addr)); > - addr.sin_port = htons(518); > - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, > - (struct sockaddr *) &addr, sizeof(addr)); > - closesocket(s) ; > - > - omsg->type = nmsg->type = ANNOUNCE; > - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; > - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; > - } > - > - /* > - * If it is a DELETE message, we send a copy to the > - * local daemons. Then we delete the entry corresponding > - * to our socket from the request table. > - */ > - > - if (type == DELETE) { > - struct talk_request *temp_req, *req_next; > - int s; > - u_short temp_port; > - > - temp_port = OTOSIN(omsg, ctl_addr)->sin_port; > - OTOSIN(omsg, ctl_addr)->sin_port = 0; > - OTOSIN(nmsg, ctl_addr)->sin_port = 0; > - > - s = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); > - addr.sin_addr = our_addr; > - addr.sin_family = AF_INET; > - addr.sin_port = htons(517); > - sendto(s, (char *)omsg, sizeof(*omsg), 0, > - (struct sockaddr *)&addr, sizeof(addr)); > - addr.sin_port = htons(518); > - sendto(s, (char *)nmsg, sizeof(*nmsg), 0, > - (struct sockaddr *)&addr, sizeof(addr)); > - closesocket(s); > - > - OTOSIN(omsg, ctl_addr)->sin_port = temp_port; > - OTOSIN(nmsg, ctl_addr)->sin_port = temp_port; > - > - /* delete table entry */ > - if (so == req_tbl->udp_so) { > - temp_req = req_tbl; > - req_tbl = req_tbl->next; > - free(temp_req); > - } else { > - temp_req = req_tbl; > - for(req = req_tbl->next; req; req = req_next) { > - req_next = req->next; > - if (so == req->udp_so) { > - temp_req->next = req_next; > - free(req); > - break; > - } else { > - temp_req = req; > - } > - } > - } > - } > - > - return; > -#endif > - > - case EMU_CUSEEME: > - > - /* > - * Cu-SeeMe emulation. > - * Hopefully the packet is more that 16 bytes long. We don't > - * do any other tests, just replace the address and port > - * fields. > - */ > - if (m->m_len >= sizeof (*cu_head)) { > - if (getsockname(so->s, (struct sockaddr *)&addr, &addrlen) < 0) > - return; > - cu_head = mtod(m, struct cu_header *); > - cu_head->s_port = addr.sin_port; > - cu_head->so_addr = our_addr.s_addr; > - } > - > - return; > - } > -} > - > struct socket * > udp_listen(Slirp *slirp, u_int32_t haddr, u_int hport, u_int32_t laddr, > u_int lport, int flags) > > > > >