Ensure that UNIX sockets are automatically unlinked upon close.
[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         closesock(sk);
292         if(sk->remote != NULL)
293             free(sk->remote);
294         free(sk);
295     }
296 }
297
298 void sockpushdata(struct socket *sk, void *buf, size_t size)
299 {
300     switch(sk->type)
301     {
302     case SOCK_STREAM:
303         sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + size, 1, 1);
304         memmove(sk->inbuf.s.buf + size, sk->inbuf.s.buf, sk->inbuf.s.datasize);
305         memcpy(sk->inbuf.s.buf, buf, size);
306         sk->inbuf.s.datasize += size;
307         break;
308     case SOCK_DGRAM:
309         /* XXX */
310         break;
311     }
312     return;
313 }
314
315 void *sockgetinbuf(struct socket *sk, size_t *size)
316 {
317     void *buf;
318     struct dgrambuf *dbuf;
319     
320     switch(sk->type)
321     {
322     case SOCK_STREAM:
323         if((sk->inbuf.s.buf == NULL) || (sk->inbuf.s.datasize == 0))
324         {
325             *size = 0;
326             return(NULL);
327         }
328         buf = sk->inbuf.s.buf;
329         *size = sk->inbuf.s.datasize;
330         sk->inbuf.s.buf = NULL;
331         sk->inbuf.s.bufsize = sk->inbuf.s.datasize = 0;
332         return(buf);
333     case SOCK_DGRAM:
334         if((dbuf = sk->inbuf.d.f) == NULL)
335             return(NULL);
336         sk->inbuf.d.f = dbuf->next;
337         if(dbuf->next == NULL)
338             sk->inbuf.d.l = NULL;
339         buf = dbuf->data;
340         *size = dbuf->size;
341         free(dbuf->addr);
342         free(dbuf);
343         return(buf);
344     }
345     return(NULL);
346 }
347
348 static void sockrecv(struct socket *sk)
349 {
350     int ret, inq;
351     struct dgrambuf *dbuf;
352     
353     switch(sk->type)
354     {
355     case SOCK_STREAM:
356 #if defined(HAVE_LINUX_SOCKIOS_H) && defined(SIOCINQ)
357         /* SIOCINQ is Linux-specific AFAIK, but I really have no idea
358          * how to read the inqueue size on other OSs */
359         if(ioctl(sk->fd, SIOCINQ, &inq))
360         {
361             /* I don't really know what could go wrong here, so let's
362              * assume it's transient. */
363             flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
364             inq = 2048;
365         }
366 #else
367         inq = 2048;
368 #endif
369         if(inq > 65536)
370             inq = 65536;
371         sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + inq, 1, 1);
372         ret = read(sk->fd, sk->inbuf.s.buf + sk->inbuf.s.datasize, inq);
373         if(ret < 0)
374         {
375             if((errno == EINTR) || (errno == EAGAIN))
376                 return;
377             if(sk->errcb != NULL)
378                 sk->errcb(sk, errno, sk->data);
379             closesock(sk);
380             return;
381         }
382         if(ret == 0)
383         {
384             if(sk->errcb != NULL)
385                 sk->errcb(sk, 0, sk->data);
386             closesock(sk);
387             return;
388         }
389         sk->inbuf.s.datasize += ret;
390         if(sk->readcb != NULL)
391             sk->readcb(sk, sk->data);
392         break;
393     case SOCK_DGRAM:
394         if(ioctl(sk->fd, SIOCINQ, &inq))
395         {
396             /* I don't really know what could go wrong here, so let's
397              * assume it's transient. */
398             flog(LOG_WARNING, "SIOCINQ return %s on socket %i", strerror(errno), sk->fd);
399             return;
400         }
401         dbuf = smalloc(sizeof(*dbuf));
402         dbuf->data = smalloc(inq);
403         dbuf->addr = smalloc(dbuf->addrlen = sizeof(struct sockaddr_storage));
404         ret = recvfrom(sk->fd, dbuf->data, inq, 0, dbuf->addr, &dbuf->addrlen);
405         if(ret < 0)
406         {
407             free(dbuf->addr);
408             free(dbuf->data);
409             free(dbuf);
410             if((errno == EINTR) || (errno == EAGAIN))
411                 return;
412             if(sk->errcb != NULL)
413                 sk->errcb(sk, errno, sk->data);
414             closesock(sk);
415             return;
416         }
417         /* On UDP/IPv[46], ret == 0 doesn't mean EOF (since UDP can't
418          * have EOF), but rather an empty packet. I don't know if any
419          * other potential DGRAM protocols might have an EOF
420          * condition, so let's play safe. */
421         if(ret == 0)
422         {
423             free(dbuf->addr);
424             free(dbuf->data);
425             free(dbuf);
426             if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
427             {
428                 if(sk->errcb != NULL)
429                     sk->errcb(sk, 0, sk->data);
430                 closesock(sk);
431             }
432             return;
433         }
434         dbuf->addr = srealloc(dbuf->addr, dbuf->addrlen);
435         dbuf->data = srealloc(dbuf->data, dbuf->size = ret);
436         dbuf->next = NULL;
437         if(sk->inbuf.d.l != NULL)
438             sk->inbuf.d.l->next = dbuf;
439         else
440             sk->inbuf.d.f = dbuf;
441         sk->inbuf.d.l = dbuf;
442         if(sk->readcb != NULL)
443             sk->readcb(sk, sk->data);
444         break;
445     }
446 }
447
448 static void sockflush(struct socket *sk)
449 {
450     int ret;
451     struct dgrambuf *dbuf;
452     
453     switch(sk->type)
454     {
455     case SOCK_STREAM:
456         if(sk->isrealsocket)
457             ret = send(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize, MSG_DONTWAIT | MSG_NOSIGNAL);
458         else
459             ret = write(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize);
460         if(ret < 0)
461         {
462             /* For now, assume transient error, since
463              * the socket is polled for errors */
464             break;
465         }
466         if(ret > 0)
467         {
468             memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
469             if(sk->writecb != NULL)
470                 sk->writecb(sk, sk->data);
471         }
472         break;
473     case SOCK_DGRAM:
474         dbuf = sk->outbuf.d.f;
475         if((sk->outbuf.d.f = dbuf->next) == NULL)
476             sk->outbuf.d.l = NULL;
477         sendto(sk->fd, dbuf->data, dbuf->size, MSG_DONTWAIT | MSG_NOSIGNAL, dbuf->addr, dbuf->addrlen);
478         free(dbuf->data);
479         free(dbuf->addr);
480         free(dbuf);
481         if(sk->writecb != NULL)
482             sk->writecb(sk, sk->data);
483         break;
484     }
485 }
486
487 void closesock(struct socket *sk)
488 {
489     struct sockaddr_un *un;
490     
491     if((sk->family == AF_UNIX) && !sockgetlocalname(sk, (struct sockaddr **)&un, NULL) && (un->sun_family == PF_UNIX))
492     {
493         if(strchr(un->sun_path, '/'))
494         {
495             if(unlink(un->sun_path))
496                 flog(LOG_WARNING, "could not unlink UNIX socket %s: %s", un->sun_path, strerror(errno));
497         }
498     }
499     sk->state = SOCK_STL;
500     close(sk->fd);
501     sk->fd = -1;
502     sk->close = 0;
503 }
504
505 void sockqueue(struct socket *sk, void *data, size_t size)
506 {
507     struct dgrambuf *new;
508     
509     if(sk->state == SOCK_STL)
510         return;
511     switch(sk->type)
512     {
513     case SOCK_STREAM:
514         sizebuf(&(sk->outbuf.s.buf), &(sk->outbuf.s.bufsize), sk->outbuf.s.datasize + size, 1, 1);
515         memcpy(sk->outbuf.s.buf + sk->outbuf.s.datasize, data, size);
516         sk->outbuf.s.datasize += size;
517         break;
518     case SOCK_DGRAM:
519         if(sk->remote == NULL)
520             return;
521         new = smalloc(sizeof(*new));
522         new->next = NULL;
523         memcpy(new->data = smalloc(size), data, new->size = size);
524         memcpy(new->addr = smalloc(sk->remotelen), sk->remote, new->addrlen = sk->remotelen);
525         if(sk->outbuf.d.l == NULL)
526         {
527             sk->outbuf.d.l = sk->outbuf.d.f = new;
528         } else {
529             sk->outbuf.d.l->next = new;
530             sk->outbuf.d.l = new;
531         }
532         break;
533     }
534 }
535
536 size_t sockgetdatalen(struct socket *sk)
537 {
538     struct dgrambuf *b;
539     size_t ret;
540     
541     switch(sk->type)
542     {
543     case SOCK_STREAM:
544         ret = sk->inbuf.s.datasize;
545         break;
546     case SOCK_DGRAM:
547         ret = 0;
548         for(b = sk->inbuf.d.f; b != NULL; b = b->next)
549             ret += b->size;
550         break;
551     }
552     return(ret);
553 }
554
555 size_t sockqueuesize(struct socket *sk)
556 {
557     struct dgrambuf *b;
558     size_t ret;
559     
560     switch(sk->type)
561     {
562     case SOCK_STREAM:
563         ret = sk->outbuf.s.datasize;
564         break;
565     case SOCK_DGRAM:
566         ret = 0;
567         for(b = sk->outbuf.d.f; b != NULL; b = b->next)
568             ret += b->size;
569         break;
570     }
571     return(ret);
572 }
573
574 /*
575  * The difference between netcslisten() and netcslistenlocal() is that
576  * netcslistenlocal() always listens on the local host, instead of
577  * following proxy/passive mode directions. It is suitable for eg. the
578  * UI channel, while the file sharing networks should, naturally, use
579  * netcslisten() instead.
580 */
581
582 struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
583 {
584     struct socket *sk;
585     int intbuf;
586     
587     /* I don't know if this is actually correct (it probably isn't),
588      * but since, at on least Linux systems, PF_* are specifically
589      * #define'd to their AF_* counterparts, it allows for a severely
590      * smoother implementation. If it breaks something on your
591      * platform, please tell me so.
592      */
593     if((sk = mksock(name->sa_family, type)) == NULL)
594         return(NULL);
595     sk->state = SOCK_LST;
596     if(confgetint("net", "reuseaddr"))
597     {
598         intbuf = 1;
599         setsockopt(sk->fd, SOL_SOCKET, SO_REUSEADDR, &intbuf, sizeof(intbuf));
600     }
601     if(bind(sk->fd, name, namelen) < 0)
602     {
603         putsock(sk);
604         return(NULL);
605     }
606     if(listen(sk->fd, 16) < 0)
607     {
608         putsock(sk);
609         return(NULL);
610     }
611     sk->acceptcb = func;
612     sk->data = data;
613     return(sk);
614 }
615
616 struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
617 {
618     if(confgetint("net", "mode") == 1)
619     {
620         errno = EOPNOTSUPP;
621         return(NULL);
622     }
623     if(confgetint("net", "mode") == 0)
624         return(netcslistenlocal(type, name, namelen, func, data));
625     errno = EOPNOTSUPP;
626     return(NULL);
627 }
628
629 struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data)
630 {
631     struct sockaddr_in addr;
632 #ifdef HAVE_IPV6
633     struct sockaddr_in6 addr6;
634 #endif
635     struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *);
636     struct socket *ret;
637     
638     if(local)
639         csfunc = netcslistenlocal;
640     else
641         csfunc = netcslisten;
642 #ifdef HAVE_IPV6
643     memset(&addr6, 0, sizeof(addr6));
644     addr6.sin6_family = AF_INET6;
645     addr6.sin6_port = htons(port);
646     addr6.sin6_addr = in6addr_any;
647     if((ret = csfunc(SOCK_STREAM, (struct sockaddr *)&addr6, sizeof(addr6), func, data)) != NULL)
648         return(ret);
649     if((ret == NULL) && (errno != EAFNOSUPPORT))
650         return(NULL);
651 #endif
652     memset(&addr, 0, sizeof(addr));
653     addr.sin_family = AF_INET;
654     addr.sin_port = htons(port);
655     return(csfunc(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), func, data));
656 }
657
658 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen)
659 {
660     struct socket *sk;
661     int mode;
662     
663     mode = confgetint("net", "mode");
664     if((mode == 0) || (mode == 1))
665     {
666         if((sk = mksock(name->sa_family, SOCK_DGRAM)) == NULL)
667             return(NULL);
668         if(bind(sk->fd, name, namelen) < 0)
669         {
670             putsock(sk);
671             return(NULL);
672         }
673         sk->state = SOCK_EST;
674         return(sk);
675     }
676     errno = EOPNOTSUPP;
677     return(NULL);
678 }
679
680 struct socket *netdupsock(struct socket *sk)
681 {
682     struct socket *newsk;
683     
684     newsk = newsock(sk->type);
685     if((newsk->fd = dup(sk->fd)) < 0)
686     {
687         flog(LOG_WARNING, "could not dup() socket: %s", strerror(errno));
688         putsock(newsk);
689         return(NULL);
690     }
691     newsk->state = sk->state;
692     newsk->ignread = sk->ignread;
693     if(sk->remote != NULL)
694         memcpy(newsk->remote = smalloc(sk->remotelen), sk->remote, newsk->remotelen = sk->remotelen);
695     return(newsk);
696 }
697
698 void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
699 {
700     if(sk->remote != NULL)
701         free(sk->remote);
702     memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
703     sk->ignread = 1;
704 }
705
706 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data)
707 {
708     struct socket *sk;
709     int mode;
710     
711     mode = confgetint("net", "mode");
712     if((mode == 0) || (mode == 1))
713     {
714         if((sk = mksock(addr->sa_family, SOCK_STREAM)) == NULL)
715             return(NULL);
716         memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
717         if(!connect(sk->fd, addr, addrlen))
718         {
719             sk->state = SOCK_EST;
720             func(sk, 0, data);
721             return(sk);
722         }
723         if(errno == EINPROGRESS)
724         {
725             sk->state = SOCK_SYN;
726             sk->conncb = func;
727             sk->data = data;
728             return(sk);
729         }
730         putsock(sk);
731         return(NULL);
732     }
733     errno = EOPNOTSUPP;
734     return(NULL);
735 }
736
737 int pollsocks(int timeout)
738 {
739     int i, num, ret;
740     socklen_t retlen;
741     int newfd;
742     struct pollfd *pfds;
743     struct socket *sk, *next, *newsk;
744     struct sockaddr_storage ss;
745     socklen_t sslen;
746     
747     pfds = smalloc(sizeof(*pfds) * (num = numsocks));
748     for(i = 0, sk = sockets; i < num; sk = sk->next)
749     {
750         if(sk->state == SOCK_STL)
751         {
752             num--;
753             continue;
754         }
755         pfds[i].fd = sk->fd;
756         pfds[i].events = 0;
757         if(!sk->ignread)
758             pfds[i].events |= POLLIN;
759         if((sk->state == SOCK_SYN) || (sockqueuesize(sk) > 0))
760             pfds[i].events |= POLLOUT;
761         pfds[i].revents = 0;
762         i++;
763     }
764     ret = poll(pfds, num, timeout);
765     if(ret < 0)
766     {
767         if(errno != EINTR)
768         {
769             flog(LOG_CRIT, "pollsocks: poll errored out: %s", strerror(errno));
770             /* To avoid CPU hogging in case it's bad, which it
771              * probably is. */
772             sleep(1);
773         }
774         free(pfds);
775         return(1);
776     }
777     for(sk = sockets; sk != NULL; sk = next)
778     {
779         next = sk->next;
780         for(i = 0; i < num; i++)
781         {
782             if(pfds[i].fd == sk->fd)
783                 break;
784         }
785         if(i == num)
786             continue;
787         switch(sk->state)
788         {
789         case SOCK_LST:
790             if(pfds[i].revents & POLLIN)
791             {
792                 sslen = sizeof(ss);
793                 if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
794                 {
795                     if(sk->errcb != NULL)
796                         sk->errcb(sk, errno, sk->data);
797                 }
798                 newsk = newsock(sk->type);
799                 newsk->fd = newfd;
800                 newsk->family = sk->family;
801                 newsk->state = SOCK_EST;
802                 memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
803                 newsk->remotelen = sslen;
804                 putsock(newsk);
805                 if(sk->acceptcb != NULL)
806                     sk->acceptcb(sk, newsk, sk->data);
807             }
808             if(pfds[i].revents & POLLERR)
809             {
810                 retlen = sizeof(ret);
811                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
812                 if(sk->errcb != NULL)
813                     sk->errcb(sk, ret, sk->data);
814                 continue;
815             }
816             break;
817         case SOCK_SYN:
818             if(pfds[i].revents & POLLERR)
819             {
820                 retlen = sizeof(ret);
821                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
822                 if(sk->conncb != NULL)
823                     sk->conncb(sk, ret, sk->data);
824                 closesock(sk);
825                 continue;
826             }
827             if(pfds[i].revents & (POLLIN | POLLOUT))
828             {
829                 sk->state = SOCK_EST;
830                 if(sk->conncb != NULL)
831                     sk->conncb(sk, 0, sk->data);
832             }
833             break;
834         case SOCK_EST:
835             if(pfds[i].revents & POLLERR)
836             {
837                 retlen = sizeof(ret);
838                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
839                 if(sk->errcb != NULL)
840                     sk->errcb(sk, ret, sk->data);
841                 closesock(sk);
842                 continue;
843             }
844             if(pfds[i].revents & POLLIN)
845                 sockrecv(sk);
846             if(pfds[i].revents & POLLOUT)
847             {
848                 if(sockqueuesize(sk) > 0)
849                     sockflush(sk);
850             }
851             break;
852         }
853         if(pfds[i].revents & POLLNVAL)
854         {
855             flog(LOG_CRIT, "BUG: stale socket struct on fd %i", sk->fd);
856             sk->state = SOCK_STL;
857             unlinksock(sk);
858             continue;
859         }
860         if(pfds[i].revents & POLLHUP)
861         {
862             if(sk->errcb != NULL)
863                 sk->errcb(sk, 0, sk->data);
864             closesock(sk);
865             unlinksock(sk);
866             continue;
867         }
868     }
869     free(pfds);
870     for(sk = sockets; sk != NULL; sk = next)
871     {
872         next = sk->next;
873         if(sk->refcount == 1 && (sockqueuesize(sk) == 0))
874         {
875             unlinksock(sk);
876             continue;
877         }
878         if(sk->close && (sockqueuesize(sk) == 0))
879             closesock(sk);
880         if(sk->state == SOCK_STL)
881         {
882             unlinksock(sk);
883             continue;
884         }
885     }
886     return(1);
887 }
888
889 int socksettos(struct socket *sk, int tos)
890 {
891     int buf;
892     
893     if(sk->family == AF_INET)
894     {
895         switch(tos)
896         {
897         case 0:
898             buf = 0;
899             break;
900         case SOCK_TOS_MINCOST:
901             buf = 0x02;
902             break;
903         case SOCK_TOS_MAXREL:
904             buf = 0x04;
905             break;
906         case SOCK_TOS_MAXTP:
907             buf = 0x08;
908             break;
909         case SOCK_TOS_MINDELAY:
910             buf = 0x10;
911             break;
912         default:
913             flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
914             return(-1);
915         }
916         if(setsockopt(sk->fd, SOL_IP, IP_TOS, &buf, sizeof(buf)) < 0)
917         {
918             flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
919             return(-1);
920         }
921         return(0);
922     }
923     if(sk->family == AF_INET6)
924     {
925         switch(tos)
926         {
927         case 0:
928             buf = 0;
929         case SOCK_TOS_MINCOST:
930             buf = confgetint("net", "diffserv-mincost");
931             break;
932         case SOCK_TOS_MAXREL:
933             buf = confgetint("net", "diffserv-maxrel");
934             break;
935         case SOCK_TOS_MAXTP:
936             buf = confgetint("net", "diffserv-maxtp");
937             break;
938         case SOCK_TOS_MINDELAY:
939             buf = confgetint("net", "diffserv-mindelay");
940             break;
941         default:
942             flog(LOG_WARNING, "attempted to set unknown TOS value %i to IPv4 sock", tos);
943             return(-1);
944         }
945         /*
946           On Linux, the API IPv6 flow label management doesn't seem to
947           be entirely complete, so I guess this will have to wait.
948           
949         if(setsockopt(...) < 0)
950         {
951             flog(LOG_WARNING, "could not set sock traffic class to %i: %s", tos, strerror(errno));
952             return(-1);
953         }
954         */
955         return(0);
956     }
957     flog(LOG_WARNING, "could not set TOS on sock of family %i", sk->family);
958     return(1);
959 }
960
961 struct resolvedata
962 {
963     int fd;
964     void (*callback)(struct sockaddr *addr, int addrlen, void *data);
965     void *data;
966     struct sockaddr_storage addr;
967     int addrlen;
968 };
969
970 static void resolvecb(pid_t pid, int status, struct resolvedata *data)
971 {
972     static char buf[80];
973     int ret;
974     struct sockaddr_in *ipv4;
975     
976     if(!status)
977     {
978         if((ret = read(data->fd, buf, sizeof(buf))) != 4)
979         {
980             errno = ENONET;
981             data->callback(NULL, 0, data->data);
982         } else {
983             ipv4 = (struct sockaddr_in *)&data->addr;
984             memcpy(&ipv4->sin_addr, buf, 4);
985             data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
986         }
987     } else {
988         errno = ENONET;
989         data->callback(NULL, 0, data->data);
990     }
991     close(data->fd);
992     free(data);
993 }
994
995 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data)
996 {
997     int i;
998     char *p;
999     int port;
1000     int pfd[2];
1001     pid_t child;
1002     struct resolvedata *rdata;
1003     struct sockaddr_in ipv4;
1004     struct hostent *he;
1005     sigset_t sigset;
1006     
1007     /* IPv4 */
1008     port = -1;
1009     if((p = strchr(addr, ':')) != NULL)
1010     {
1011         *p = 0;
1012         port = atoi(p + 1);
1013     }
1014     ipv4.sin_family = AF_INET;
1015     ipv4.sin_port = htons(port);
1016     if(inet_aton(addr, &ipv4.sin_addr))
1017     {
1018         callback((struct sockaddr *)&ipv4, sizeof(ipv4), data);
1019     } else {
1020         sigemptyset(&sigset);
1021         sigaddset(&sigset, SIGCHLD);
1022         sigprocmask(SIG_BLOCK, &sigset, NULL);
1023         if((pipe(pfd) < 0) || ((child = fork()) < 0))
1024         {
1025             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1026             return(-1);
1027         }
1028         if(child == 0)
1029         {
1030             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1031             for(i = 3; i < FD_SETSIZE; i++)
1032             {
1033                 if(i != pfd[1])
1034                     close(i);
1035             }
1036             signal(SIGALRM, SIG_DFL);
1037             alarm(30);
1038             if((he = gethostbyname(addr)) == NULL)
1039                 exit(1);
1040             write(pfd[1], he->h_addr_list[0], 4);
1041             exit(0);
1042         } else {
1043             close(pfd[1]);
1044             fcntl(pfd[0], F_SETFL, fcntl(pfd[0], F_GETFL) | O_NONBLOCK);
1045             rdata = smalloc(sizeof(*rdata));
1046             rdata->fd = pfd[0];
1047             rdata->callback = callback;
1048             rdata->data = data;
1049             memcpy(&rdata->addr, &ipv4, rdata->addrlen = sizeof(ipv4));
1050             childcallback(child, (void (*)(pid_t, int, void *))resolvecb, rdata);
1051             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
1052             return(1);
1053         }
1054     }
1055     return(0);
1056 }
1057
1058 int sockgetlocalname(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
1059 {
1060     socklen_t len;
1061     struct sockaddr_storage name;
1062     
1063     *namebuf = NULL;
1064     if((sk->state == SOCK_STL) || (sk->fd < 0))
1065         return(-1);
1066     len = sizeof(name);
1067     if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
1068     {
1069         flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetlocalname (%s)", strerror(errno));
1070         return(-1);
1071     }
1072     *namebuf = memcpy(smalloc(len), &name, len);
1073     if(lenbuf != NULL)
1074         *lenbuf = len;
1075     return(0);
1076 }
1077
1078 static void sethostaddr(struct sockaddr *dst, struct sockaddr *src)
1079 {
1080     if(dst->sa_family != src->sa_family)
1081     {
1082         flog(LOG_ERR, "BUG: non-matching socket families in sethostaddr (%i -> %i)", src->sa_family, dst->sa_family);
1083         return;
1084     }
1085     switch(src->sa_family)
1086     {
1087     case AF_INET:
1088         ((struct sockaddr_in *)dst)->sin_addr = ((struct sockaddr_in *)src)->sin_addr;
1089         break;
1090     case AF_INET6:
1091         ((struct sockaddr_in6 *)dst)->sin6_addr = ((struct sockaddr_in6 *)src)->sin6_addr;
1092         break;
1093     default:
1094         flog(LOG_WARNING, "sethostaddr unimplemented for family %i", src->sa_family);
1095         break;
1096     }
1097 }
1098
1099 static int makepublic(struct sockaddr *addr)
1100 {
1101     int ret;
1102     socklen_t plen;
1103     struct sockaddr *pname;
1104     
1105     if((ret = getpublicaddr(addr->sa_family, &pname, &plen)) < 0)
1106     {
1107         flog(LOG_ERR, "could not get public address: %s", strerror(errno));
1108         return(-1);
1109     }
1110     if(ret)
1111         return(0);
1112     sethostaddr(addr, pname);
1113     free(pname);
1114     return(0);
1115 }
1116
1117 int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
1118 {
1119     socklen_t len;
1120     struct sockaddr *name;
1121     
1122     switch(confgetint("net", "mode"))
1123     {
1124     case 0:
1125         *namebuf = NULL;
1126         if((sk->state == SOCK_STL) || (sk->fd < 0))
1127         {
1128             errno = EBADF;
1129             return(-1);
1130         }
1131         if(!sockgetlocalname(sk, &name, &len))
1132         {
1133             *namebuf = name;
1134             *lenbuf = len;
1135             makepublic(name);
1136             return(0);
1137         }
1138         flog(LOG_ERR, "could not get remotely accessible name by any means");
1139         return(-1);
1140     case 1:
1141         errno = EOPNOTSUPP;
1142         return(-1);
1143     default:
1144         flog(LOG_CRIT, "unknown net mode %i active", confgetint("net", "mode"));
1145         errno = EOPNOTSUPP;
1146         return(-1);
1147     }
1148 }
1149
1150 int sockgetremotename2(struct socket *sk, struct socket *sk2, struct sockaddr **namebuf, socklen_t *lenbuf)
1151 {
1152     struct sockaddr *name1, *name2;
1153     socklen_t len1, len2;
1154     
1155     if(sk->family != sk2->family)
1156     {
1157         flog(LOG_ERR, "using sockgetremotename2 with sockets of differing family: %i %i", sk->family, sk2->family);
1158         return(-1);
1159     }
1160     if(sockgetremotename(sk, &name1, &len1))
1161         return(-1);
1162     if(sockgetremotename(sk2, &name2, &len2)) {
1163         free(name1);
1164         return(-1);
1165     }
1166     sethostaddr(name1, name2);
1167     free(name2);
1168     *namebuf = name1;
1169     *lenbuf = len1;
1170     return(0);
1171 }
1172
1173 int addreq(struct sockaddr *x, struct sockaddr *y)
1174 {
1175     struct sockaddr_un *u1, *u2;
1176     struct sockaddr_in *n1, *n2;
1177 #ifdef HAVE_IPV6
1178     struct sockaddr_in6 *s1, *s2;
1179 #endif
1180     
1181     if(x->sa_family != y->sa_family)
1182         return(0);
1183     switch(x->sa_family) {
1184     case AF_UNIX:
1185         u1 = (struct sockaddr_un *)x; u2 = (struct sockaddr_un *)y;
1186         if(strncmp(u1->sun_path, u2->sun_path, sizeof(u1->sun_path)))
1187             return(0);
1188         break;
1189     case AF_INET:
1190         n1 = (struct sockaddr_in *)x; n2 = (struct sockaddr_in *)y;
1191         if(n1->sin_port != n2->sin_port)
1192             return(0);
1193         if(n1->sin_addr.s_addr != n2->sin_addr.s_addr)
1194             return(0);
1195         break;
1196 #ifdef HAVE_IPV6
1197     case AF_INET6:
1198         s1 = (struct sockaddr_in6 *)x; s2 = (struct sockaddr_in6 *)y;
1199         if(s1->sin6_port != s2->sin6_port)
1200             return(0);
1201         if(memcmp(s1->sin6_addr.s6_addr, s2->sin6_addr.s6_addr, sizeof(s1->sin6_addr.s6_addr)))
1202             return(0);
1203         break;
1204 #endif
1205     }
1206     return(1);
1207 }
1208
1209 char *formataddress(struct sockaddr *arg, socklen_t arglen)
1210 {
1211     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1212                                * lowercase letters to 1, so I do this
1213                                * instead. */
1214     struct sockaddr_in *ipv4;
1215 #ifdef HAVE_IPV6
1216     struct sockaddr_in6 *ipv6;
1217 #endif
1218     static char *ret = NULL;
1219     char buf[1024];
1220     
1221     if(ret != NULL)
1222         free(ret);
1223     ret = NULL;
1224     switch(arg->sa_family)
1225     {
1226     case AF_UNIX:
1227         UNIX = (struct sockaddr_un *)arg;
1228         ret = sprintf2("%s", UNIX->sun_path);
1229         break;
1230     case AF_INET:
1231         ipv4 = (struct sockaddr_in *)arg;
1232         if(inet_ntop(AF_INET, &ipv4->sin_addr, buf, sizeof(buf)) == NULL)
1233             return(NULL);
1234         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv4->sin_port));
1235         break;
1236 #ifdef HAVE_IPV6
1237     case AF_INET6:
1238         ipv6 = (struct sockaddr_in6 *)arg;
1239         if(inet_ntop(AF_INET6, &ipv6->sin6_addr, buf, sizeof(buf)) == NULL)
1240             return(NULL);
1241         ret = sprintf2("[%s]:%i", buf, (int)ntohs(ipv6->sin6_port));
1242         break;
1243 #endif
1244     default:
1245         errno = EPFNOSUPPORT;
1246         break;
1247     }
1248     return(ret);
1249 }
1250
1251 #if 0
1252
1253 /* 
1254  * It was very nice to use this, but it seems
1255  * to mess things up, so I guess it has to go... :-(
1256  */
1257
1258 static int formataddress(FILE *stream, const struct printf_info *info, const void *const *args)
1259 {
1260     struct sockaddr *arg;
1261     socklen_t arglen;
1262     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1263                                * lowercase letters to 1, so I do this
1264                                * instead. */
1265     struct sockaddr_in *ipv4;
1266     int ret;
1267     
1268     arg = *(struct sockaddr **)(args[0]);
1269     arglen = *(socklen_t *)(args[1]);
1270     switch(arg->sa_family)
1271     {
1272     case AF_UNIX:
1273         UNIX = (struct sockaddr_un *)arg;
1274         ret = fprintf(stream, "%s", UNIX->sun_path);
1275         break;
1276     case AF_INET:
1277         ipv4 = (struct sockaddr_in *)arg;
1278         ret = fprintf(stream, "%s:%i", inet_ntoa(ipv4->sin_addr), (int)ntohs(ipv4->sin_port));
1279         break;
1280     default:
1281         ret = -1;
1282         errno = EPFNOSUPPORT;
1283         break;
1284     }
1285     return(ret);
1286 }
1287
1288 static int formataddress_arginfo(const struct printf_info *info, size_t n, int *argtypes)
1289 {
1290     if(n > 0)
1291         argtypes[0] = PA_POINTER;
1292     if(n > 1)
1293         argtypes[1] = PA_INT; /* Sources tell me that socklen_t _must_
1294                                * be an int, so I guess this should be
1295                                * safe. */
1296     return(2);
1297 }
1298 #endif
1299
1300 static int init(int hup)
1301 {
1302     if(!hup)
1303     {
1304         /*
1305         if(register_printf_function('N', formataddress, formataddress_arginfo))
1306         {
1307             flog(LOG_CRIT, "could not register printf handler %%N: %s", strerror(errno));
1308             return(1);
1309         }
1310         */
1311     }
1312     return(0);
1313 }
1314
1315 static void terminate(void)
1316 {
1317     while(sockets != NULL)
1318         unlinksock(sockets);
1319 }
1320
1321 static struct module me =
1322 {
1323     .name = "net",
1324     .conf =
1325     {
1326         .vars = myvars
1327     },
1328     .init = init,
1329     .terminate = terminate
1330 };
1331
1332 MODULE(me)