In icmp.c, there is an error convert struct that sets icmp message fatality
levels. The one for ECONNREFUSED (ICMP_PORT_UNREACH) is marked as fatal.
That's not too godd for talk and it's family of code... it is using the same
udp port/socket to send to BOTH ntalk and otalk services. If you try this
to a machine running only one kind of talk (otalk), then you get back an
ICMP_PORT_UNREACH message which the kernel signals the process with the
ECONNREFUSED and then closes the socket -- it's a fatal error. I fixed this
on my machine by removing the fatal flag -- 1 -> 0. But I have no idea
how many RFC's that violates or even if that is a good idea. In practice,
it has never caused any problems.
In theory, you really should treat UDP and TCP sockets differently, but
that's another thread.
--Ricky
BTW: for 1.3.25: (/usr/src/linux-1.3.25/net/ipv4/icmp.c)
line 148 -> { ECONNREFUSED, 1 }, /* ICMP_PORT_UNREACH */
becomes -> { ECONNREFUSED, 0 }, /* ICMP_PORT_UNREACH */ /*CRAMER*/