[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Local interface used for outbound network connections
From: |
Mario Lang |
Subject: |
Local interface used for outbound network connections |
Date: |
Tue, 07 Jan 2003 23:43:53 +0100 |
User-agent: |
Gnus/5.090008 (Oort Gnus v0.08) Emacs/21.2 (i386-pc-linux-gnu) |
Hello.
We're now working on DCC server support for erc, which involes using
make-network-prcess :server t. First of all, thanks to all people involved
with that functionality for their work! It seem possible, we're only missing
one vital bit of information:
For IRC DCC connection, we need a reliable way to optain the IP
address we're reachable via. Normally, IRC clients do this by calling
getsockname on the connection they have to the IRC server. This
returns the interface used + port number.
Emacs does (as far as I could see) currently not support this in any way.
We'd need to do ugly hacks with ifconfig or whatever, to optain the
currently used IP, and this is not really portable.
But with a very small addition to make-network-process, we can record
the local address used for outbound tcp connections.
I've attached the patch. As usual, I'm not good at C, and I'm sure
something is wrong, but it works. I originally wanted to use
:local, but it appears that indicates server processes, and did not
work. So I creates a new keyword symbol, :iface. I know the name is bad,
any suggestions for a better name would be nice.
Here is what process-contact reports for my currently active irc connection:
(process-contact erc-process t)
=> (:name "erc-irc.eu.freenode.net-6667"
:buffer #<buffer irc.eu.freenode.net:6667>
:host "irc.eu.freenode.net"
:service 6667
:remote [195 139 52 134 6667]
:iface [80 109 223 66 33231]
:filter erc-process-filter)
Can someone comment on this. Could we please install that in some form?
Thank you
*** process.c.~1.388.~ Mon Nov 18 16:40:06 2002
--- process.c Tue Jan 7 23:26:29 2003
***************
*** 130,136 ****
Lisp_Object Qopen, Qclosed, Qconnect, Qfailed, Qlisten;
Lisp_Object Qlocal, Qdatagram;
Lisp_Object QCname, QCbuffer, QChost, QCservice, QCtype;
! Lisp_Object QClocal, QCremote, QCcoding;
Lisp_Object QCserver, QCnowait, QCnoquery, QCstop;
Lisp_Object QCsentinel, QClog, QCoptions;
Lisp_Object Qlast_nonmenu_event;
--- 130,136 ----
Lisp_Object Qopen, Qclosed, Qconnect, Qfailed, Qlisten;
Lisp_Object Qlocal, Qdatagram;
Lisp_Object QCname, QCbuffer, QChost, QCservice, QCtype;
! Lisp_Object QCiface, QClocal, QCremote, QCcoding;
Lisp_Object QCserver, QCnowait, QCnoquery, QCstop;
Lisp_Object QCsentinel, QClog, QCoptions;
Lisp_Object Qlast_nonmenu_event;
***************
*** 3066,3071 ****
--- 3066,3085 ----
#endif
contact = Fplist_put (contact, QCaddress,
conv_sockaddr_to_lisp (lres->ai_addr,
lres->ai_addrlen));
+ #ifdef HAVE_GETSOCKNAME
+ /* Record the address info returned by getsockname
+ if (socktype == SOCK_STREAM && !is_server)
+ {
+ struct sockaddr_in sa1;
+ int len1 = sizeof (sa1);
+ if (getsockname (s, (struct sockaddr *)&sa1, &len1) == 0)
+ {
+ contact =
+ Fplist_put (contact, QCiface,
+ conv_sockaddr_to_lisp (&sa1, len1));
+ }
+ }
+ #endif
}
#ifdef HAVE_GETADDRINFO
***************
*** 6261,6266 ****
--- 6275,6282 ----
staticpro (&QCtype);
QClocal = intern (":local");
staticpro (&QClocal);
+ QCiface = intern (":iface");
+ staticpro (&QCiface);
QCremote = intern (":remote");
staticpro (&QCremote);
QCcoding = intern (":coding");
--
CYa,
Mario | Debian Developer <URL:http://debian.org/>
| Get my public key via finger address@hidden
| 1024D/7FC1A0854909BCCDBE6C102DDFFC022A6B113E44