Add configvar documentation comments.
[doldaconnect.git] / daemon / net.c
1 /*
2  *  Dolda Connect - Modular multiuser Direct Connect-style client
3  *  Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com)
4  *  
5  *  This program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2 of the License, or
8  *  (at your option) any later version.
9  *  
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU General Public License for more details.
14  *  
15  *  You should have received a copy of the GNU General Public License
16  *  along with this program; if not, write to the Free Software
17  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18 */
19 /* XXX: Implement SOCKS proxyability */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24 #include <string.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27 #include <fcntl.h>
28 #include <sys/ioctl.h>
29 #include <sys/socket.h>
30 #include <sys/un.h>
31 #include <sys/poll.h>
32 #include <arpa/inet.h>
33 #include <netinet/in.h>
34 #include <netdb.h>
35 #include <sys/signal.h>
36 #ifdef HAVE_LINUX_SOCKIOS_H
37 #include <linux/sockios.h>
38 #endif
39 #include <errno.h>
40 #include <net/if.h>
41
42 #include "conf.h"
43 #include "net.h"
44 #include "module.h"
45 #include "log.h"
46 #include "utils.h"
47 #include "sysevents.h"
48
49 static struct configvar myvars[] =
50 {
51     /** The network mode to use. Currently supported values are 0 for
52      * active mode and 1 for passive mode. In the future, SOCKS5 proxy
53      * support may be added. */
54     {CONF_VAR_INT, "mode", {.num = 0}},
55     /** Set the SO_REUSEADDR socket option on listening sockets, so
56      * that dead TCP connections waiting for timeout are ignored. */
57     {CONF_VAR_BOOL, "reuseaddr", {.num = 0}},
58     /** Overrides the IPv4 address reported to other clients in active
59      * mode. Useful for servers behind NAT routers. If both this and
60      * net.publicif are unspecified the address of the hub connection
61      * is used. */
62     {CONF_VAR_IPV4, "visibleipv4", {.ipv4 = {0}}},
63     /** Specifies an interface name from which to fetch the IPv4
64      * address reported to other clients in active mode. If both this
65      * and net.visibleipv4 are unspecified the address of the hub
66      * connection is used. */
67     {CONF_VAR_STRING, "publicif", {.str = L""}},
68     /* Diffserv should be supported on IPv4, too, but I don't know the
69      * API to do that. */
70     /** The Diffserv value to use on IPv6 connections when the
71      * minimize cost TOS value is used (see the TOS VALUES
72      * section). */
73     {CONF_VAR_INT, "diffserv-mincost", {.num = 0}},
74     /** The Diffserv value to use on IPv6 connections when the
75      * maximize reliability TOS value is used (see the TOS VALUES
76      * section). */
77     {CONF_VAR_INT, "diffserv-maxrel", {.num = 0}},
78     /** The Diffserv value to use on IPv6 connections when the
79      * maximize throughput TOS value is used (see the TOS VALUES
80      * section). */
81     {CONF_VAR_INT, "diffserv-maxtp", {.num = 0}},
82     /** The Diffserv value to use on IPv6 connections when the
83      * minimize delay TOS value is used (see the TOS VALUES
84      * section). */
85     {CONF_VAR_INT, "diffserv-mindelay", {.num = 0}},
86     {CONF_VAR_END}
87 };
88
89 static struct socket *sockets = NULL;
90 int numsocks = 0;
91
92 /* XXX: Get autoconf for all this... */
93 int getpublicaddr(int af, struct sockaddr **addr, socklen_t *lenbuf)
94 {
95     struct sockaddr_in *ipv4;
96     struct configvar *var;
97     void *bufend;
98     int sock;
99     struct ifconf conf;
100     struct ifreq *ifr, req;
101     char *pif;
102     
103     if(af == AF_INET)
104     {
105         var = confgetvar("net", "visibleipv4");
106         if(var->val.ipv4.s_addr != 0)
107         {
108             ipv4 = smalloc(sizeof(*ipv4));
109             ipv4->sin_family = AF_INET;
110             ipv4->sin_addr.s_addr = var->val.ipv4.s_addr;
111             *addr = (struct sockaddr *)ipv4;
112             *lenbuf = sizeof(*ipv4);
113             return(0);
114         }
115         if((pif = icswcstombs(confgetstr("net", "publicif"), NULL, NULL)) == NULL)
116         {
117             flog(LOG_ERR, "could not convert net.publicif into local charset: %s", strerror(errno));
118             return(-1);
119         }
120         if(!strcmp(pif, ""))
121             return(1);
122         if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
123             return(-1);
124         conf.ifc_buf = smalloc(conf.ifc_len = 65536);
125         if(ioctl(sock, SIOCGIFCONF, &conf) < 0)
126         {
127             free(conf.ifc_buf);
128             close(sock);
129             return(-1);
130         }
131         bufend = ((char *)conf.ifc_buf) + conf.ifc_len;
132         ipv4 = NULL;
133         for(ifr = conf.ifc_ifcu.ifcu_req; (void *)ifr < bufend; ifr++)
134         {
135             if(strcmp(ifr->ifr_name, pif))
136                 continue;
137             memset(&req, 0, sizeof(req));
138             memcpy(req.ifr_name, ifr->ifr_name, sizeof(ifr->ifr_name));
139             if(ioctl(sock, SIOCGIFFLAGS, &req) < 0)
140                 break;
141             if(!(req.ifr_flags & IFF_UP))
142             {
143                 flog(LOG_WARNING, "public interface is down");
144                 break;
145             }
146             if(ifr->ifr_addr.sa_family != AF_INET)
147             {
148                 flog(LOG_WARNING, "address of the public interface is not AF_INET");
149                 break;
150             }
151             ipv4 = smalloc(sizeof(*ipv4));
152             memcpy(ipv4, &ifr->ifr_addr, sizeof(ifr->ifr_addr));
153             break;
154         }
155         free(conf.ifc_buf);
156         close(sock);
157         if(ipv4 != NULL)
158         {
159             *addr = (struct sockaddr *)ipv4;
160             *lenbuf = sizeof(*ipv4);
161             return(0);
162         }
163         errno = ENETDOWN;
164         return(-1);
165     }
166     return(1);
167 }
168
169 static struct socket *newsock(int type)
170 {
171     struct socket *new;
172     
173     new = smalloc(sizeof(*new));
174     new->refcount = 2;
175     new->fd = -1;
176     new->isrealsocket = 1;
177     new->family = -1;
178     new->tos = 0;
179     new->type = type;
180     new->state = -1;
181     new->ignread = 0;
182     new->close = 0;
183     new->remote = NULL;
184     new->remotelen = 0;
185     switch(type)
186     {
187     case SOCK_STREAM:
188         new->outbuf.s.buf = NULL;
189         new->outbuf.s.bufsize = 0;
190         new->outbuf.s.datasize = 0;
191         new->inbuf.s.buf = NULL;
192         new->inbuf.s.bufsize = 0;
193         new->inbuf.s.datasize = 0;
194         break;
195     case SOCK_DGRAM:
196         new->outbuf.d.f = new->outbuf.d.l = NULL;
197         new->inbuf.d.f = new->inbuf.d.l = NULL;
198         break;
199     }
200     new->conncb = NULL;
201     new->errcb = NULL;
202     new->readcb = NULL;
203     new->writecb = NULL;
204     new->acceptcb = NULL;
205     new->next = sockets;
206     new->prev = NULL;
207     if(sockets != NULL)
208         sockets->prev = new;
209     sockets = new;
210     numsocks++;
211     return(new);
212 }
213
214 static struct socket *mksock(int domain, int type)
215 {
216     int fd;
217     struct socket *new;
218     
219     if((fd = socket(domain, type, 0)) < 0)
220     {
221         flog(LOG_CRIT, "could not create socket: %s", strerror(errno));
222         return(NULL);
223     }
224     new = newsock(type);
225     new->fd = fd;
226     new->family = domain;
227     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
228     return(new);
229 }
230
231 struct socket *wrapsock(int fd)
232 {
233     struct socket *new;
234     
235     new = newsock(SOCK_STREAM);
236     new->fd = fd;
237     new->state = SOCK_EST;
238     new->isrealsocket = 0;
239     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
240     return(new);
241 }
242
243 static void unlinksock(struct socket *sk)
244 {
245     if(sk->prev != NULL)
246         sk->prev->next = sk->next;
247     if(sk->next != NULL)
248         sk->next->prev = sk->prev;
249     if(sk == sockets)
250         sockets = sk->next;
251     putsock(sk);
252     numsocks--;
253 }
254
255 void getsock(struct socket *sk)
256 {
257     sk->refcount++;
258 }
259
260 void putsock(struct socket *sk)
261 {
262     struct dgrambuf *buf;
263     
264     if(--(sk->refcount) == 0)
265     {
266         switch(sk->type)
267         {
268         case SOCK_STREAM:
269             if(sk->outbuf.s.buf != NULL)
270                 free(sk->outbuf.s.buf);
271             if(sk->inbuf.s.buf != NULL)
272                 free(sk->inbuf.s.buf);
273             break;
274         case SOCK_DGRAM:
275             while((buf = sk->outbuf.d.f) != NULL)
276             {
277                 sk->outbuf.d.f = buf->next;
278                 free(buf->data);
279                 free(buf->addr);
280                 free(buf);
281             }
282             while((buf = sk->inbuf.d.f) != NULL)
283             {
284                 sk->inbuf.d.f = buf->next;
285                 free(buf->data);
286                 free(buf->addr);
287                 free(buf);
288             }
289             break;
290         }
291         if(sk->fd >= 0)
292             close(sk->fd);
293         if(sk->remote != NULL)
294             free(sk->remote);
295         free(sk);
296     }
297 }
298
299 void sockpushdata(struct socket *sk, void *buf, size_t size)
300 {
301     switch(sk->type)
302     {
303     case SOCK_STREAM:
304         sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + size, 1, 1);
305         memmove(sk->inbuf.s.buf + size, sk->inbuf.s.buf, sk->inbuf.s.datasize);
306         memcpy(sk->inbuf.s.buf, buf, size);
307         sk->inbuf.s.datasize += size;
308         break;
309     case SOCK_DGRAM:
310         /* XXX */
311         break;
312     }
313     return;
314 }
315
316 void *sockgetinbuf(struct socket *sk, size_t *size)
317 {
318     void *buf;
319     struct dgrambuf *dbuf;
320     
321     switch(sk->type)
322     {
323     case SOCK_STREAM:
324         if((sk->inbuf.s.buf == NULL) || (sk->inbuf.s.datasize == 0))
325         {
326             *size = 0;
327             return(NULL);
328         }
329         buf = sk->inbuf.s.buf;
330         *size = sk->inbuf.s.datasize;
331         sk->inbuf.s.buf = NULL;
332         sk->inbuf.s.bufsize = sk->inbuf.s.datasize = 0;
333         return(buf);
334     case SOCK_DGRAM:
335         if((dbuf = sk->inbuf.d.f) == NULL)
336             return(NULL);
337         sk->inbuf.d.f = dbuf->next;
338         if(dbuf->next == NULL)
339             sk->inbuf.d.l = NULL;
340         buf = dbuf->data;
341         *size = dbuf->size;
342         free(dbuf->addr);
343         free(dbuf);
344         return(buf);
345     }
346     return(NULL);
347 }
348
349 static void sockrecv(struct socket *sk)
350 {
351     int ret, inq;
352     struct dgrambuf *dbuf;
353     
354     switch(sk->type)
355     {
356     case SOCK_STREAM:
357 #if defined(HAVE_LINUX_SOCKIOS_H) && defined(SIOCINQ)
358         /* SIOCINQ is Linux-specific AFAIK, but I really have no idea
359          * how to read the inqueue size on other OSs */
360         if(ioctl(sk->fd, SIOCINQ, &inq))
361         {
362             /* I don't really know what could go wrong here, so let's
363              * assume it's transient. */
364             flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
365             inq = 2048;
366         }
367 #else
368         inq = 2048;
369 #endif
370         if(inq > 65536)
371             inq = 65536;
372         sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + inq, 1, 1);
373         ret = read(sk->fd, sk->inbuf.s.buf + sk->inbuf.s.datasize, inq);
374         if(ret < 0)
375         {
376             if((errno == EINTR) || (errno == EAGAIN))
377                 return;
378             if(sk->errcb != NULL)
379                 sk->errcb(sk, errno, sk->data);
380             closesock(sk);
381             return;
382         }
383         if(ret == 0)
384         {
385             if(sk->errcb != NULL)
386                 sk->errcb(sk, 0, sk->data);
387             closesock(sk);
388             return;
389         }
390         sk->inbuf.s.datasize += ret;
391         if(sk->readcb != NULL)
392             sk->readcb(sk, sk->data);
393         break;
394     case SOCK_DGRAM:
395         if(ioctl(sk->fd, SIOCINQ, &inq))
396         {
397             /* I don't really know what could go wrong here, so let's
398              * assume it's transient. */
399             flog(LOG_WARNING, "SIOCINQ return %s on socket %i", strerror(errno), sk->fd);
400             return;
401         }
402         dbuf = smalloc(sizeof(*dbuf));
403         dbuf->data = smalloc(inq);
404         dbuf->addr = smalloc(dbuf->addrlen = sizeof(struct sockaddr_storage));
405         ret = recvfrom(sk->fd, dbuf->data, inq, 0, dbuf->addr, &dbuf->addrlen);
406         if(ret < 0)
407         {
408             free(dbuf->addr);
409             free(dbuf->data);
410             free(dbuf);
411             if((errno == EINTR) || (errno == EAGAIN))
412                 return;
413             if(sk->errcb != NULL)
414                 sk->errcb(sk, errno, sk->data);
415             closesock(sk);
416             return;
417         }
418         /* On UDP/IPv[46], ret == 0 doesn't mean EOF (since UDP can't
419          * have EOF), but rather an empty packet. I don't know if any
420          * other potential DGRAM protocols might have an EOF
421          * condition, so let's play safe. */
422         if(ret == 0)
423         {
424             free(dbuf->addr);
425             free(dbuf->data);
426             free(dbuf);
427             if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
428             {
429                 if(sk->errcb != NULL)
430                     sk->errcb(sk, 0, sk->data);
431                 closesock(sk);
432             }
433             return;
434         }
435         dbuf->addr = srealloc(dbuf->addr, dbuf->addrlen);
436         dbuf->data = srealloc(dbuf->data, dbuf->size = ret);
437         dbuf->next = NULL;
438         if(sk->inbuf.d.l != NULL)
439             sk->inbuf.d.l->next = dbuf;
440         else
441             sk->inbuf.d.f = dbuf;
442         sk->inbuf.d.l = dbuf;
443         if(sk->readcb != NULL)
444             sk->readcb(sk, sk->data);
445         break;
446     }
447 }
448
449 static void sockflush(struct socket *sk)
450 {
451     int ret;
452     struct dgrambuf *dbuf;
453     
454     switch(sk->type)
455     {
456     case SOCK_STREAM:
457         if(sk->isrealsocket)
458             ret = send(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize, MSG_DONTWAIT | MSG_NOSIGNAL);
459         else
460             ret = write(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize);
461         if(ret < 0)
462         {
463             /* For now, assume transient error, since
464              * the socket is polled for errors */
465             break;
466         }
467         if(ret > 0)
468         {
469             memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
470             if(sk->writecb != NULL)
471                 sk->writecb(sk, sk->data);
472         }
473         break;
474     case SOCK_DGRAM:
475         dbuf = sk->outbuf.d.f;
476         if((sk->outbuf.d.f = dbuf->next) == NULL)
477             sk->outbuf.d.l = NULL;
478         sendto(sk->fd, dbuf->data, dbuf->size, MSG_DONTWAIT | MSG_NOSIGNAL, dbuf->addr, dbuf->addrlen);
479         free(dbuf->data);
480         free(dbuf->addr);
481         free(dbuf);
482         if(sk->writecb != NULL)
483             sk->writecb(sk, sk->data);
484         break;
485     }
486 }
487
488 void closesock(struct socket *sk)
489 {
490     sk->state = SOCK_STL;
491     close(sk->fd);
492     sk->fd = -1;
493     sk->close = 0;
494 }
495
496 void sockqueue(struct socket *sk, void *data, size_t size)
497 {
498     struct dgrambuf *new;
499     
500     if(sk->state == SOCK_STL)
501         return;
502     switch(sk->type)
503     {
504     case SOCK_STREAM:
505         sizebuf(&(sk->outbuf.s.buf), &(sk->outbuf.s.bufsize), sk->outbuf.s.datasize + size, 1, 1);
506         memcpy(sk->outbuf.s.buf + sk->outbuf.s.datasize, data, size);
507         sk->outbuf.s.datasize += size;
508         break;
509     case SOCK_DGRAM:
510         if(sk->remote == NULL)
511             return;
512         new = smalloc(sizeof(*new));
513         new->next = NULL;
514         memcpy(new->data = smalloc(size), data, new->size = size);
515         memcpy(new->addr = smalloc(sk->remotelen), sk->remote, new->addrlen = sk->remotelen);
516         if(sk->outbuf.d.l == NULL)
517         {
518             sk->outbuf.d.l = sk->outbuf.d.f = new;
519         } else {
520             sk->outbuf.d.l->next = new;
521             sk->outbuf.d.l = new;
522         }
523         break;
524     }
525 }
526
527 size_t sockgetdatalen(struct socket *sk)
528 {
529     struct dgrambuf *b;
530     size_t ret;
531     
532     switch(sk->type)
533     {
534     case SOCK_STREAM:
535         ret = sk->inbuf.s.datasize;
536         break;
537     case SOCK_DGRAM:
538         ret = 0;
539         for(b = sk->inbuf.d.f; b != NULL; b = b->next)
540             ret += b->size;
541         break;
542     }
543     return(ret);
544 }
545
546 size_t sockqueuesize(struct socket *sk)
547 {
548     struct dgrambuf *b;
549     size_t ret;
550     
551     switch(sk->type)
552     {
553     case SOCK_STREAM:
554         ret = sk->outbuf.s.datasize;
555         break;
556     case SOCK_DGRAM:
557         ret = 0;
558         for(b = sk->outbuf.d.f; b != NULL; b = b->next)
559             ret += b->size;
560         break;
561     }
562     return(ret);
563 }
564
565 /*
566  * The difference between netcslisten() and netcslistenlocal() is that
567  * netcslistenlocal() always listens on the local host, instead of
568  * following proxy/passive mode directions. It is suitable for eg. the
569  * UI channel, while the file sharing networks should, naturally, use
570  * netcslisten() instead.
571 */
572
573 struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
574 {
575     struct socket *sk;
576     int intbuf;
577     
578     /* I don't know if this is actually correct (it probably isn't),
579      * but since, at on least Linux systems, PF_* are specifically
580      * #define'd to their AF_* counterparts, it allows for a severely
581      * smoother implementation. If it breaks something on your
582      * platform, please tell me so.
583      */
584     if((sk = mksock(name->sa_family, type)) == NULL)
585         return(NULL);
586     sk->state = SOCK_LST;
587     if(confgetint("net", "reuseaddr"))
588     {
589         intbuf = 1;
590         setsockopt(sk->fd, SOL_SOCKET, SO_REUSEADDR, &intbuf, sizeof(intbuf));
591     }
592     if(bind(sk->fd, name, namelen) < 0)
593     {
594         putsock(sk);
595         return(NULL);
596     }
597     if(listen(sk->fd, 16) < 0)
598     {
599         putsock(sk);
600         return(NULL);
601     }
602     sk->acceptcb = func;
603     sk->data = data;
604     return(sk);
605 }
606
607 struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
608 {
609     if(confgetint("net", "mode") == 1)
610     {
611         errno = EOPNOTSUPP;
612         return(NULL);
613     }
614     if(confgetint("net", "mode") == 0)
615         return(netcslistenlocal(type, name, namelen, func, data));
616     errno = EOPNOTSUPP;
617     return(NULL);
618 }
619
620 struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data)
621 {
622     struct sockaddr_in addr;
623 #ifdef HAVE_IPV6
624     struct sockaddr_in6 addr6;
625 #endif
626     struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *);
627     struct socket *ret;
628     
629     if(local)
630         csfunc = netcslistenlocal;
631     else
632         csfunc = netcslisten;
633 #ifdef HAVE_IPV6
634     memset(&addr6, 0, sizeof(addr6));
635     addr6.sin6_family = AF_INET6;
636     addr6.sin6_port = htons(port);
637     addr6.sin6_addr = in6addr_any;
638     if((ret = csfunc(SOCK_STREAM, (struct sockaddr *)&addr6, sizeof(addr6), func, data)) != NULL)
639         return(ret);
640     if((ret == NULL) && (errno != EAFNOSUPPORT))
641         return(NULL);
642 #endif
643     memset(&addr, 0, sizeof(addr));
644     addr.sin_family = AF_INET;
645     addr.sin_port = htons(port);
646     return(csfunc(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), func, data));
647 }
648
649 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen)
650 {
651     struct socket *sk;
652     int mode;
653     
654     mode = confgetint("net", "mode");
655     if((mode == 0) || (mode == 1))
656     {
657         if((sk = mksock(name->sa_family, SOCK_DGRAM)) == NULL)
658             return(NULL);
659         if(bind(sk->fd, name, namelen) < 0)
660         {
661             putsock(sk);
662             return(NULL);
663         }
664         sk->state = SOCK_EST;
665         return(sk);
666     }
667     errno = EOPNOTSUPP;
668     return(NULL);
669 }
670
671 struct socket *netdupsock(struct socket *sk)
672 {
673     struct socket *newsk;
674     
675     newsk = newsock(sk->type);
676     if((newsk->fd = dup(sk->fd)) < 0)
677     {
678         flog(LOG_WARNING, "could not dup() socket: %s", strerror(errno));
679         putsock(newsk);
680         return(NULL);
681     }
682     newsk->state = sk->state;
683     newsk->ignread = sk->ignread;
684     if(sk->remote != NULL)
685         memcpy(newsk->remote = smalloc(sk->remotelen), sk->remote, newsk->remotelen = sk->remotelen);
686     return(newsk);
687 }
688
689 void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
690 {
691     if(sk->remote != NULL)
692         free(sk->remote);
693     memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
694     sk->ignread = 1;
695 }
696
697 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data)
698 {
699     struct socket *sk;
700     int mode;
701     
702     mode = confgetint("net", "mode");
703     if((mode == 0) || (mode == 1))
704     {
705         if((sk = mksock(addr->sa_family, SOCK_STREAM)) == NULL)
706             return(NULL);
707         memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
708         if(!connect(sk->fd, addr, addrlen))
709         {
710             sk->state = SOCK_EST;
711             func(sk, 0, data);
712             return(sk);
713         }
714         if(errno == EINPROGRESS)
715         {
716             sk->state = SOCK_SYN;
717             sk->conncb = func;
718             sk->data = data;
719             return(sk);
720         }
721         putsock(sk);
722         return(NULL);
723     }
724     errno = EOPNOTSUPP;
725     return(NULL);
726 }
727
728 int pollsocks(int timeout)
729 {
730     int i, num, ret;
731     socklen_t retlen;
732     int newfd;
733     struct pollfd *pfds;
734     struct socket *sk, *next, *newsk;
735     struct sockaddr_storage ss;
736     socklen_t sslen;
737     
738     pfds = smalloc(sizeof(*pfds) * (num = numsocks));
739     for(i = 0, sk = sockets; i < num; sk = sk->next)
740     {
741         if(sk->state == SOCK_STL)
742         {
743             num--;
744             continue;
745         }
746         pfds[i].fd = sk->fd;
747         pfds[i].events = 0;
748         if(!sk->ignread)
749             pfds[i].events |= POLLIN;
750         if((sk->state == SOCK_SYN) || (sockqueuesize(sk) > 0))
751             pfds[i].events |= POLLOUT;
752         pfds[i].revents = 0;
753         i++;
754     }
755     ret = poll(pfds, num, timeout);
756     if(ret < 0)
757     {
758         if(errno != EINTR)
759         {
760             flog(LOG_CRIT, "pollsocks: poll errored out: %s", strerror(errno));
761             /* To avoid CPU hogging in case it's bad, which it
762              * probably is. */
763             sleep(1);
764         }
765         free(pfds);
766         return(1);
767     }
768     for(sk = sockets; sk != NULL; sk = next)
769     {
770         next = sk->next;
771         for(i = 0; i < num; i++)
772         {
773             if(pfds[i].fd == sk->fd)
774                 break;
775         }
776         if(i == num)
777             continue;
778         switch(sk->state)
779         {
780         case SOCK_LST:
781             if(pfds[i].revents & POLLIN)
782             {
783                 sslen = sizeof(ss);
784                 if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
785                 {
786                     if(sk->errcb != NULL)
787                         sk->errcb(sk, errno, sk->data);
788                 }
789                 newsk = newsock(sk->type);
790                 newsk->fd = newfd;
791                 newsk->family = sk->family;
792                 newsk->state = SOCK_EST;
793                 memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
794                 newsk->remotelen = sslen;
795                 putsock(newsk);
796                 if(sk->acceptcb != NULL)
797                     sk->acceptcb(sk, newsk, sk->data);
798             }
799             if(pfds[i].revents & POLLERR)
800             {
801                 retlen = sizeof(ret);
802                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
803                 if(sk->errcb != NULL)
804                     sk->errcb(sk, ret, sk->data);
805                 continue;
806             }
807             break;
808         case SOCK_SYN:
809             if(pfds[i].revents & POLLERR)
810             {
811                 retlen = sizeof(ret);
812                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
813                 if(sk->conncb != NULL)
814                     sk->conncb(sk, ret, sk->data);
815                 closesock(sk);
816                 continue;
817             }
818             if(pfds[i].revents & (POLLIN | POLLOUT))
819             {
820                 sk->state = SOCK_EST;
821                 if(sk->conncb != NULL)
822                     sk->conncb(sk, 0, sk->data);
823             }
824             break;
825         case SOCK_EST:
826             if(pfds[i].revents & POLLERR)
827             {
828                 retlen = sizeof(ret);
829                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
830                 if(sk->errcb != NULL)
831                     sk->errcb(sk, ret, sk->data);
832                 closesock(sk);
833                 continue;
834             }
835             if(pfds[i].revents & POLLIN)
836                 sockrecv(sk);
837             if(pfds[i].revents & POLLOUT)
838             {
839                 if(sockqueuesize(sk) > 0)
840                     sockflush(sk);
841             }
842             break;
843         }
844         if(pfds[i].revents & POLLNVAL)
845         {
846             flog(LOG_CRIT, "BUG: stale socket struct on fd %i", sk->fd);
847             sk->state = SOCK_STL;
848             unlinksock(sk);
849             continue;
850         }
851         if(pfds[i].revents & POLLHUP)
852         {
853             if(sk->errcb != NULL)
854                 sk->errcb(sk, 0, sk->data);
855             closesock(sk);
856             unlinksock(sk);
857             continue;
858         }
859     }
860     free(pfds);
861     for(sk = sockets; sk != NULL; sk = next)
862     {
863         next = sk->next;
864         if(sk->refcount == 1 && (sockqueuesize(sk) == 0))
865         {
866             unlinksock(sk);
867             continue;
868         }
869         if(sk->close && (sockqueuesize(sk) == 0))
870             closesock(sk);
871         if(sk->state == SOCK_STL)
872         {
873             unlinksock(sk);
874             continue;
875         }
876     }
877     return(1);
878 }
879
880 int socksettos(struct socket *sk, int tos)
881 {
882     int buf;
883     
884     if(sk->family == AF_INET)
885     {
886         switch(tos)
887         {
888         case 0:
889             buf = 0;
890             break;
891         case SOCK_TOS_MINCOST:
892             buf = 0x02;
893             break;
894         case SOCK_TOS_MAXREL:
895             buf = 0x04;
896             break;
897         case SOCK_TOS_MAXTP:
898             buf = 0x08;
899             break;
900         case SOCK_TOS_MINDELAY:
901             buf = 0x10;
902             break;
903         default:
904             flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
905             return(-1);
906         }
907         if(setsockopt(sk->fd, SOL_IP, IP_TOS, &buf, sizeof(buf)) < 0)
908         {
909             flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
910             return(-1);
911         }
912         return(0);
913     }
914     if(sk->family == AF_INET6)
915     {
916         switch(tos)
917         {
918         case 0:
919             buf = 0;
920         case SOCK_TOS_MINCOST:
921             buf = confgetint("net", "diffserv-mincost");
922             break;
923         case SOCK_TOS_MAXREL:
924             buf = confgetint("net", "diffserv-maxrel");
925             break;
926         case SOCK_TOS_MAXTP:
927             buf = confgetint("net", "diffserv-maxtp");
928             break;
929         case SOCK_TOS_MINDELAY:
930             buf = confgetint("net", "diffserv-mindelay");
931             break;
932         default:
933             flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
934             return(-1);
935         }
936         /*
937           On Linux, the API IPv6 flow label management doesn't seem to
938           be entirely complete, so I guess this will have to wait.
939           
940         if(setsockopt(...) < 0)
941         {
942             flog(LOG_WARNING, "could not set sock traffic class to %i: %s", tos, strerror(errno));
943             return(-1);
944         }
945         */
946         return(0);
947     }
948     flog(LOG_WARNING, "could not set TOS on sock of family %i", sk->family);
949     return(1);
950 }
951
952 struct resolvedata
953 {
954     int fd;
955     void (*callback)(struct sockaddr *addr, int addrlen, void *data);
956     void *data;
957     struct sockaddr_storage addr;
958     int addrlen;
959 };
960
961 static void resolvecb(pid_t pid, int status, struct resolvedata *data)
962 {
963     static char buf[80];
964     int ret;
965     struct sockaddr_in *ipv4;
966     
967     if(!status)
968     {
969         if((ret = read(data->fd, buf, sizeof(buf))) != 4)
970         {
971             errno = ENONET;
972             data->callback(NULL, 0, data->data);
973         } else {
974             ipv4 = (struct sockaddr_in *)&data->addr;
975             memcpy(&ipv4->sin_addr, buf, 4);
976             data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
977         }
978     } else {
979         errno = ENONET;
980         data->callback(NULL, 0, data->data);
981     }
982     close(data->fd);
983     free(data);
984 }
985
986 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data)
987 {
988     int i;
989     char *p;
990     int port;
991     int pfd[2];
992     pid_t child;
993     struct resolvedata *rdata;
994     struct sockaddr_in ipv4;
995     struct hostent *he;
996     sigset_t sigset;
997     
998     /* IPv4 */
999     port = -1;
1000     if((p = strchr(addr, ':')) != NULL)
1001     {
1002         *p = 0;
1003         port = atoi(p + 1);
1004     }
1005     ipv4.sin_family = AF_INET;
1006     ipv4.sin_port = htons(port);
1007     if(inet_aton(addr, &ipv4.sin_addr))
1008     {
1009         callback((struct sockaddr *)&ipv4, sizeof(ipv4), data);
1010     } else {
1011         sigemptyset(&sigset);
1012         sigaddset(&sigset, SIGCHLD);
1013         sigprocmask(SIG_BLOCK, &sigset, NULL);
1014         if((pipe(pfd) < 0) || ((child = fork()) < 0))
1015         {
1016             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1017             return(-1);
1018         }
1019         if(child == 0)
1020         {
1021             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1022             for(i = 3; i < FD_SETSIZE; i++)
1023             {
1024                 if(i != pfd[1])
1025                     close(i);
1026             }
1027             signal(SIGALRM, SIG_DFL);
1028             alarm(30);
1029             if((he = gethostbyname(addr)) == NULL)
1030                 exit(1);
1031             write(pfd[1], he->h_addr_list[0], 4);
1032             exit(0);
1033         } else {
1034             close(pfd[1]);
1035             fcntl(pfd[0], F_SETFL, fcntl(pfd[0], F_GETFL) | O_NONBLOCK);
1036             rdata = smalloc(sizeof(*rdata));
1037             rdata->fd = pfd[0];
1038             rdata->callback = callback;
1039             rdata->data = data;
1040             memcpy(&rdata->addr, &ipv4, rdata->addrlen = sizeof(ipv4));
1041             childcallback(child, (void (*)(pid_t, int, void *))resolvecb, rdata);
1042             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1043             return(1);
1044         }
1045     }
1046     return(0);
1047 }
1048
1049 int sockgetlocalname(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
1050 {
1051     socklen_t len;
1052     struct sockaddr_storage name;
1053     
1054     *namebuf = NULL;
1055     if((sk->state == SOCK_STL) || (sk->fd < 0))
1056         return(-1);
1057     len = sizeof(name);
1058     if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
1059     {
1060         flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetlocalname (%s)", strerror(errno));
1061         return(-1);
1062     }
1063     *namebuf = memcpy(smalloc(len), &name, len);
1064     *lenbuf = len;
1065     return(0);
1066 }
1067
1068 static void sethostaddr(struct sockaddr *dst, struct sockaddr *src)
1069 {
1070     if(dst->sa_family != src->sa_family)
1071     {
1072         flog(LOG_ERR, "BUG: non-matching socket families in sethostaddr (%i -> %i)", src->sa_family, dst->sa_family);
1073         return;
1074     }
1075     switch(src->sa_family)
1076     {
1077     case AF_INET:
1078         ((struct sockaddr_in *)dst)->sin_addr = ((struct sockaddr_in *)src)->sin_addr;
1079         break;
1080     case AF_INET6:
1081         ((struct sockaddr_in6 *)dst)->sin6_addr = ((struct sockaddr_in6 *)src)->sin6_addr;
1082         break;
1083     default:
1084         flog(LOG_WARNING, "sethostaddr unimplemented for family %i", src->sa_family);
1085         break;
1086     }
1087 }
1088
1089 static int makepublic(struct sockaddr *addr)
1090 {
1091     int ret;
1092     socklen_t plen;
1093     struct sockaddr *pname;
1094     
1095     if((ret = getpublicaddr(addr->sa_family, &pname, &plen)) < 0)
1096     {
1097         flog(LOG_ERR, "could not get public address: %s", strerror(errno));
1098         return(-1);
1099     }
1100     if(ret)
1101         return(0);
1102     sethostaddr(addr, pname);
1103     free(pname);
1104     return(0);
1105 }
1106
1107 int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
1108 {
1109     socklen_t len;
1110     struct sockaddr *name;
1111     
1112     switch(confgetint("net", "mode"))
1113     {
1114     case 0:
1115         *namebuf = NULL;
1116         if((sk->state == SOCK_STL) || (sk->fd < 0))
1117         {
1118             errno = EBADF;
1119             return(-1);
1120         }
1121         if(!sockgetlocalname(sk, &name, &len))
1122         {
1123             *namebuf = name;
1124             *lenbuf = len;
1125             makepublic(name);
1126             return(0);
1127         }
1128         flog(LOG_ERR, "could not get remotely accessible name by any means");
1129         return(-1);
1130     case 1:
1131         errno = EOPNOTSUPP;
1132         return(-1);
1133     default:
1134         flog(LOG_CRIT, "unknown net mode %i active", confgetint("net", "mode"));
1135         errno = EOPNOTSUPP;
1136         return(-1);
1137     }
1138 }
1139
1140 int sockgetremotename2(struct socket *sk, struct socket *sk2, struct sockaddr **namebuf, socklen_t *lenbuf)
1141 {
1142     struct sockaddr *name1, *name2;
1143     socklen_t len1, len2;
1144     
1145     if(sk->family != sk2->family)
1146     {
1147         flog(LOG_ERR, "using sockgetremotename2 with sockets of differing family: %i %i", sk->family, sk2->family);
1148         return(-1);
1149     }
1150     if(sockgetremotename(sk, &name1, &len1))
1151         return(-1);
1152     if(sockgetremotename(sk2, &name2, &len2)) {
1153         free(name1);
1154         return(-1);
1155     }
1156     sethostaddr(name1, name2);
1157     free(name2);
1158     *namebuf = name1;
1159     *lenbuf = len1;
1160     return(0);
1161 }
1162
1163 int addreq(struct sockaddr *x, struct sockaddr *y)
1164 {
1165     struct sockaddr_un *u1, *u2;
1166     struct sockaddr_in *n1, *n2;
1167 #ifdef HAVE_IPV6
1168     struct sockaddr_in6 *s1, *s2;
1169 #endif
1170     
1171     if(x->sa_family != y->sa_family)
1172         return(0);
1173     switch(x->sa_family) {
1174     case AF_UNIX:
1175         u1 = (struct sockaddr_un *)x; u2 = (struct sockaddr_un *)y;
1176         if(strncmp(u1->sun_path, u2->sun_path, sizeof(u1->sun_path)))
1177             return(0);
1178         break;
1179     case AF_INET:
1180         n1 = (struct sockaddr_in *)x; n2 = (struct sockaddr_in *)y;
1181         if(n1->sin_port != n2->sin_port)
1182             return(0);
1183         if(n1->sin_addr.s_addr != n2->sin_addr.s_addr)
1184             return(0);
1185         break;
1186 #ifdef HAVE_IPV6
1187     case AF_INET6:
1188         s1 = (struct sockaddr_in6 *)x; s2 = (struct sockaddr_in6 *)y;
1189         if(s1->sin6_port != s2->sin6_port)
1190             return(0);
1191         if(memcmp(s1->sin6_addr.s6_addr, s2->sin6_addr.s6_addr, sizeof(s1->sin6_addr.s6_addr)))
1192             return(0);
1193         break;
1194 #endif
1195     }
1196     return(1);
1197 }
1198
1199 char *formataddress(struct sockaddr *arg, socklen_t arglen)
1200 {
1201     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1202                                * lowercase letters to 1, so I do this
1203                                * instead. */
1204     struct sockaddr_in *ipv4;
1205 #ifdef HAVE_IPV6
1206     struct sockaddr_in6 *ipv6;
1207 #endif
1208     static char *ret = NULL;
1209     char buf[1024];
1210     
1211     if(ret != NULL)
1212         free(ret);
1213     ret = NULL;
1214     switch(arg->sa_family)
1215     {
1216     case AF_UNIX:
1217         UNIX = (struct sockaddr_un *)arg;
1218         ret = sprintf2("%s", UNIX->sun_path);
1219         break;
1220     case AF_INET:
1221         ipv4 = (struct sockaddr_in *)arg;
1222         if(inet_ntop(AF_INET, &ipv4->sin_addr, buf, sizeof(buf)) == NULL)
1223             return(NULL);
1224         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv4->sin_port));
1225         break;
1226 #ifdef HAVE_IPV6
1227     case AF_INET6:
1228         ipv6 = (struct sockaddr_in6 *)arg;
1229         if(inet_ntop(AF_INET6, &ipv6->sin6_addr, buf, sizeof(buf)) == NULL)
1230             return(NULL);
1231         ret = sprintf2("[%s]:%i", buf, (int)ntohs(ipv6->sin6_port));
1232         break;
1233 #endif
1234     default:
1235         errno = EPFNOSUPPORT;
1236         break;
1237     }
1238     return(ret);
1239 }
1240
1241 #if 0
1242
1243 /* 
1244  * It was very nice to use this, but it seems
1245  * to mess things up, so I guess it has to go... :-(
1246  */
1247
1248 static int formataddress(FILE *stream, const struct printf_info *info, const void *const *args)
1249 {
1250     struct sockaddr *arg;
1251     socklen_t arglen;
1252     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1253                                * lowercase letters to 1, so I do this
1254                                * instead. */
1255     struct sockaddr_in *ipv4;
1256     int ret;
1257     
1258     arg = *(struct sockaddr **)(args[0]);
1259     arglen = *(socklen_t *)(args[1]);
1260     switch(arg->sa_family)
1261     {
1262     case AF_UNIX:
1263         UNIX = (struct sockaddr_un *)arg;
1264         ret = fprintf(stream, "%s", UNIX->sun_path);
1265         break;
1266     case AF_INET:
1267         ipv4 = (struct sockaddr_in *)arg;
1268         ret = fprintf(stream, "%s:%i", inet_ntoa(ipv4->sin_addr), (int)ntohs(ipv4->sin_port));
1269         break;
1270     default:
1271         ret = -1;
1272         errno = EPFNOSUPPORT;
1273         break;
1274     }
1275     return(ret);
1276 }
1277
1278 static int formataddress_arginfo(const struct printf_info *info, size_t n, int *argtypes)
1279 {
1280     if(n > 0)
1281         argtypes[0] = PA_POINTER;
1282     if(n > 1)
1283         argtypes[1] = PA_INT; /* Sources tell me that socklen_t _must_
1284                                * be an int, so I guess this should be
1285                                * safe. */
1286     return(2);
1287 }
1288 #endif
1289
1290 static int init(int hup)
1291 {
1292     if(!hup)
1293     {
1294         /*
1295         if(register_printf_function('N', formataddress, formataddress_arginfo))
1296         {
1297             flog(LOG_CRIT, "could not register printf handler %%N: %s", strerror(errno));
1298             return(1);
1299         }
1300         */
1301     }
1302     return(0);
1303 }
1304
1305 static void terminate(void)
1306 {
1307     while(sockets != NULL)
1308         unlinksock(sockets);
1309 }
1310
1311 static struct module me =
1312 {
1313     .name = "net",
1314     .conf =
1315     {
1316         .vars = myvars
1317     },
1318     .init = init,
1319     .terminate = terminate
1320 };
1321
1322 MODULE(me)