Fix reuseaddr in netcslistenlocal, too.
[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 #include <printf.h>
37 #ifdef HAVE_LINUX_SOCKIOS_H
38 #include <linux/sockios.h>
39 #endif
40 #include <errno.h>
41 #include <net/if.h>
42
43 #include "conf.h"
44 #include "net.h"
45 #include "module.h"
46 #include "log.h"
47 #include "utils.h"
48 #include "sysevents.h"
49
50 static struct configvar myvars[] =
51 {
52     /* 0 = Direct mode, 1 = Passive mode, 2 = SOCKS proxy */
53     {CONF_VAR_INT, "mode", {.num = 0}},
54     {CONF_VAR_BOOL, "reuseaddr", {.num = 0}},
55     /* Only for direct mode */
56     {CONF_VAR_IPV4, "visibleipv4", {.ipv4 = {0}}},
57     {CONF_VAR_STRING, "publicif", {.str = L""}},
58     {CONF_VAR_END}
59 };
60
61 static struct socket *sockets = NULL;
62 int numsocks = 0;
63
64 /* XXX: Get autoconf for all this... */
65 int getpublicaddr(int af, struct sockaddr **addr, socklen_t *lenbuf)
66 {
67     struct sockaddr_in *ipv4;
68     struct configvar *var;
69     void *bufend;
70     int sock;
71     struct ifconf conf;
72     struct ifreq *ifr, req;
73     char *pif;
74     
75     if(af == AF_INET)
76     {
77         var = confgetvar("net", "visibleipv4");
78         if(var->val.ipv4.s_addr != 0)
79         {
80             ipv4 = smalloc(sizeof(*ipv4));
81             ipv4->sin_family = AF_INET;
82             ipv4->sin_addr.s_addr = var->val.ipv4.s_addr;
83             *addr = (struct sockaddr *)ipv4;
84             *lenbuf = sizeof(*ipv4);
85             return(0);
86         }
87         if((pif = icwcstombs(confgetstr("net", "publicif"), NULL)) == NULL)
88         {
89             flog(LOG_ERR, "could not convert net.publicif into local charset: %s", strerror(errno));
90             return(-1);
91         }
92         if((sock = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
93             return(-1);
94         conf.ifc_buf = smalloc(conf.ifc_len = 65536);
95         if(ioctl(sock, SIOCGIFCONF, &conf) < 0)
96         {
97             free(conf.ifc_buf);
98             close(sock);
99             return(-1);
100         }
101         bufend = ((char *)conf.ifc_buf) + conf.ifc_len;
102         ipv4 = NULL;
103         for(ifr = conf.ifc_ifcu.ifcu_req; (void *)ifr < bufend; ifr++)
104         {
105             memset(&req, 0, sizeof(req));
106             memcpy(req.ifr_name, ifr->ifr_name, sizeof(ifr->ifr_name));
107             if(ioctl(sock, SIOCGIFFLAGS, &req) < 0)
108             {
109                 free(conf.ifc_buf);
110                 close(sock);
111                 return(-1);
112             }
113             if(!(req.ifr_flags & IFF_UP))
114                 continue;
115             if(ifr->ifr_addr.sa_family == AF_INET)
116             {
117                 if(ntohl(((struct sockaddr_in *)&ifr->ifr_addr)->sin_addr.s_addr) == 0x7f000001)
118                     continue;
119                 if(ipv4 == NULL)
120                 {
121                     ipv4 = smalloc(sizeof(*ipv4));
122                     memcpy(ipv4, &ifr->ifr_addr, sizeof(ifr->ifr_addr));
123                 } else {
124                     free(ipv4);
125                     flog(LOG_WARNING, "could not locate an unambiguous interface for determining your public IP address - set net.publicif");
126                     errno = ENFILE; /* XXX: There's no appropriate one for this... */
127                     return(-1);
128                 }
129             }
130         }
131         close(sock);
132         if(ipv4 != NULL)
133         {
134             *addr = (struct sockaddr *)ipv4;
135             *lenbuf = sizeof(*ipv4);
136             return(0);
137         }
138         errno = ENETDOWN;
139         return(-1);
140     }
141     errno = EPFNOSUPPORT;
142     return(-1);
143 }
144
145 static struct socket *newsock(int type)
146 {
147     struct socket *new;
148     
149     new = smalloc(sizeof(*new));
150     new->refcount = 2;
151     new->fd = -1;
152     new->isrealsocket = 1;
153     new->family = -1;
154     new->tos = 0;
155     new->type = type;
156     new->state = -1;
157     new->ignread = 0;
158     new->close = 0;
159     new->remote = NULL;
160     new->remotelen = 0;
161     switch(type)
162     {
163     case SOCK_STREAM:
164         new->outbuf.s.buf = NULL;
165         new->outbuf.s.bufsize = 0;
166         new->outbuf.s.datasize = 0;
167         new->inbuf.s.buf = NULL;
168         new->inbuf.s.bufsize = 0;
169         new->inbuf.s.datasize = 0;
170         break;
171     case SOCK_DGRAM:
172         new->outbuf.d.f = new->outbuf.d.l = NULL;
173         new->inbuf.d.f = new->inbuf.d.l = NULL;
174         break;
175     }
176     new->conncb = NULL;
177     new->errcb = NULL;
178     new->readcb = NULL;
179     new->writecb = NULL;
180     new->acceptcb = NULL;
181     new->next = sockets;
182     new->prev = NULL;
183     if(sockets != NULL)
184         sockets->prev = new;
185     sockets = new;
186     numsocks++;
187     return(new);
188 }
189
190 static struct socket *mksock(int domain, int type)
191 {
192     int fd;
193     struct socket *new;
194     
195     if((fd = socket(domain, type, 0)) < 0)
196     {
197         flog(LOG_CRIT, "could not create socket: %s", strerror(errno));
198         return(NULL);
199     }
200     new = newsock(type);
201     new->fd = fd;
202     new->family = domain;
203     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
204     return(new);
205 }
206
207 struct socket *wrapsock(int fd)
208 {
209     struct socket *new;
210     
211     new = newsock(SOCK_STREAM);
212     new->fd = fd;
213     new->state = SOCK_EST;
214     new->isrealsocket = 0;
215     fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);
216     return(new);
217 }
218
219 static void unlinksock(struct socket *sk)
220 {
221     if(sk->prev != NULL)
222         sk->prev->next = sk->next;
223     if(sk->next != NULL)
224         sk->next->prev = sk->prev;
225     if(sk == sockets)
226         sockets = sk->next;
227     putsock(sk);
228     numsocks--;
229 }
230
231 void getsock(struct socket *sk)
232 {
233     sk->refcount++;
234 }
235
236 void putsock(struct socket *sk)
237 {
238     struct dgrambuf *buf;
239     
240     if(--(sk->refcount) == 0)
241     {
242         switch(sk->type)
243         {
244         case SOCK_STREAM:
245             if(sk->outbuf.s.buf != NULL)
246                 free(sk->outbuf.s.buf);
247             if(sk->inbuf.s.buf != NULL)
248                 free(sk->inbuf.s.buf);
249             break;
250         case SOCK_DGRAM:
251             while((buf = sk->outbuf.d.f) != NULL)
252             {
253                 sk->outbuf.d.f = buf->next;
254                 free(buf->data);
255                 free(buf);
256             }
257             while((buf = sk->inbuf.d.f) != NULL)
258             {
259                 sk->inbuf.d.f = buf->next;
260                 free(buf->data);
261                 free(buf);
262             }
263             break;
264         }
265         if(sk->fd >= 0)
266             close(sk->fd);
267         if(sk->remote != NULL)
268             free(sk->remote);
269         free(sk);
270     }
271 }
272
273 void *sockgetinbuf(struct socket *sk, size_t *size)
274 {
275     void *buf;
276     struct dgrambuf *dbuf;
277     
278     switch(sk->type)
279     {
280     case SOCK_STREAM:
281         if((sk->inbuf.s.buf == NULL) || (sk->inbuf.s.datasize == 0))
282         {
283             *size = 0;
284             return(NULL);
285         }
286         buf = sk->inbuf.s.buf;
287         *size = sk->inbuf.s.datasize;
288         sk->inbuf.s.buf = NULL;
289         sk->inbuf.s.bufsize = sk->inbuf.s.datasize = 0;
290         return(buf);
291     case SOCK_DGRAM:
292         if((dbuf = sk->inbuf.d.f) == NULL)
293             return(NULL);
294         sk->inbuf.d.f = dbuf->next;
295         if(dbuf->next == NULL)
296             sk->inbuf.d.l = NULL;
297         buf = dbuf->data;
298         *size = dbuf->size;
299         free(dbuf->addr);
300         free(dbuf);
301         return(buf);
302     }
303     return(NULL);
304 }
305
306 static void sockrecv(struct socket *sk)
307 {
308     int ret, inq;
309     struct dgrambuf *dbuf;
310     
311     switch(sk->type)
312     {
313     case SOCK_STREAM:
314 #if defined(HAVE_LINUX_SOCKIOS_H) && defined(SIOCINQ)
315         /* SIOCINQ is Linux-specific AFAIK, but I really have no idea
316          * how to read the inqueue size on other OSs */
317         if(ioctl(sk->fd, SIOCINQ, &inq))
318         {
319             /* I don't really know what could go wrong here, so let's
320              * assume it's transient. */
321             flog(LOG_WARNING, "SIOCINQ return %s on socket %i, falling back to 2048 bytes", strerror(errno), sk->fd);
322             inq = 2048;
323         }
324 #else
325         inq = 2048;
326 #endif
327         if(inq > 65536)
328             inq = 65536;
329         sizebuf(&sk->inbuf.s.buf, &sk->inbuf.s.bufsize, sk->inbuf.s.datasize + inq, 1, 1);
330         ret = read(sk->fd, sk->inbuf.s.buf + sk->inbuf.s.datasize, inq);
331         if(ret < 0)
332         {
333             if((errno == EINTR) || (errno == EAGAIN))
334                 return;
335             if(sk->errcb != NULL)
336                 sk->errcb(sk, errno, sk->data);
337             closesock(sk);
338             return;
339         }
340         if(ret == 0)
341         {
342             if(sk->errcb != NULL)
343                 sk->errcb(sk, 0, sk->data);
344             closesock(sk);
345             return;
346         }
347         sk->inbuf.s.datasize += ret;
348         if(sk->readcb != NULL)
349             sk->readcb(sk, sk->data);
350         break;
351     case SOCK_DGRAM:
352         if(ioctl(sk->fd, SIOCINQ, &inq))
353         {
354             /* I don't really know what could go wrong here, so let's
355              * assume it's transient. */
356             flog(LOG_WARNING, "SIOCINQ return %s on socket %i", strerror(errno), sk->fd);
357             return;
358         }
359         dbuf = smalloc(sizeof(*dbuf));
360         dbuf->data = smalloc(inq);
361         dbuf->addr = smalloc(dbuf->addrlen = sizeof(struct sockaddr_storage));
362         ret = recvfrom(sk->fd, dbuf->data, inq, 0, dbuf->addr, &dbuf->addrlen);
363         if(ret < 0)
364         {
365             free(dbuf->addr);
366             free(dbuf->data);
367             free(dbuf);
368             if((errno == EINTR) || (errno == EAGAIN))
369                 return;
370             if(sk->errcb != NULL)
371                 sk->errcb(sk, errno, sk->data);
372             closesock(sk);
373             return;
374         }
375         /* On UDP/IPv[46], ret == 0 doesn't mean EOF (since UDP can't
376          * have EOF), but rather an empty packet. I don't know if any
377          * other potential DGRAM protocols might have an EOF
378          * condition, so let's play safe. */
379         if(ret == 0)
380         {
381             free(dbuf->addr);
382             free(dbuf->data);
383             free(dbuf);
384             if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
385             {
386                 if(sk->errcb != NULL)
387                     sk->errcb(sk, 0, sk->data);
388                 closesock(sk);
389             }
390             return;
391         }
392         dbuf->addr = srealloc(dbuf->addr, dbuf->addrlen);
393         dbuf->data = srealloc(dbuf->data, dbuf->size = ret);
394         dbuf->next = NULL;
395         if(sk->inbuf.d.l != NULL)
396             sk->inbuf.d.l->next = dbuf;
397         else
398             sk->inbuf.d.f = dbuf;
399         sk->inbuf.d.l = dbuf;
400         if(sk->readcb != NULL)
401             sk->readcb(sk, sk->data);
402         break;
403     }
404 }
405
406 static void sockflush(struct socket *sk)
407 {
408     int ret;
409     struct dgrambuf *dbuf;
410     
411     switch(sk->type)
412     {
413     case SOCK_STREAM:
414         if(sk->isrealsocket)
415             ret = send(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize, MSG_DONTWAIT | MSG_NOSIGNAL);
416         else
417             ret = write(sk->fd, sk->outbuf.s.buf, sk->outbuf.s.datasize);
418         if(ret < 0)
419         {
420             /* For now, assume transient error, since
421              * the socket is polled for errors */
422             break;
423         }
424         if(ret > 0)
425         {
426             memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
427             if(sk->writecb != NULL)
428                 sk->writecb(sk, sk->data);
429         }
430         break;
431     case SOCK_DGRAM:
432         dbuf = sk->outbuf.d.f;
433         if((sk->outbuf.d.f = dbuf->next) == NULL)
434             sk->outbuf.d.l = NULL;
435         sendto(sk->fd, dbuf->data, dbuf->size, MSG_DONTWAIT | MSG_NOSIGNAL, dbuf->addr, dbuf->addrlen);
436         free(dbuf->data);
437         free(dbuf->addr);
438         free(dbuf);
439         if(sk->writecb != NULL)
440             sk->writecb(sk, sk->data);
441         break;
442     }
443 }
444
445 void closesock(struct socket *sk)
446 {
447     sk->state = SOCK_STL;
448     close(sk->fd);
449     sk->fd = -1;
450     sk->close = 0;
451 }
452
453 void sockqueue(struct socket *sk, void *data, size_t size)
454 {
455     struct dgrambuf *new;
456     
457     if(sk->state == SOCK_STL)
458         return;
459     switch(sk->type)
460     {
461     case SOCK_STREAM:
462         sizebuf(&(sk->outbuf.s.buf), &(sk->outbuf.s.bufsize), sk->outbuf.s.datasize + size, 1, 1);
463         memcpy(sk->outbuf.s.buf + sk->outbuf.s.datasize, data, size);
464         sk->outbuf.s.datasize += size;
465         break;
466     case SOCK_DGRAM:
467         if(sk->remote == NULL)
468             return;
469         new = smalloc(sizeof(*new));
470         new->next = NULL;
471         memcpy(new->data = smalloc(size), data, new->size = size);
472         memcpy(new->addr = smalloc(sk->remotelen), sk->remote, new->addrlen = sk->remotelen);
473         if(sk->outbuf.d.l == NULL)
474         {
475             sk->outbuf.d.l = sk->outbuf.d.f = new;
476         } else {
477             sk->outbuf.d.l->next = new;
478             sk->outbuf.d.l = new;
479         }
480         break;
481     }
482 }
483
484 size_t sockgetdatalen(struct socket *sk)
485 {
486     struct dgrambuf *b;
487     size_t ret;
488     
489     switch(sk->type)
490     {
491     case SOCK_STREAM:
492         ret = sk->inbuf.s.datasize;
493         break;
494     case SOCK_DGRAM:
495         ret = 0;
496         for(b = sk->inbuf.d.f; b != NULL; b = b->next)
497             ret += b->size;
498         break;
499     }
500     return(ret);
501 }
502
503 size_t sockqueuesize(struct socket *sk)
504 {
505     struct dgrambuf *b;
506     size_t ret;
507     
508     switch(sk->type)
509     {
510     case SOCK_STREAM:
511         ret = sk->outbuf.s.datasize;
512         break;
513     case SOCK_DGRAM:
514         ret = 0;
515         for(b = sk->outbuf.d.f; b != NULL; b = b->next)
516             ret += b->size;
517         break;
518     }
519     return(ret);
520 }
521
522 struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
523 {
524     struct socket *sk;
525     int intbuf;
526     
527     if(confgetint("net", "mode") == 1)
528     {
529         errno = EOPNOTSUPP;
530         return(NULL);
531     }
532     /* I don't know if this is actually correct (it probably isn't),
533      * but since, at on least Linux systems, PF_* are specifically
534      * #define'd to their AF_* counterparts, it allows for a severely
535      * smoother implementation. If it breaks something on your
536      * platform, please tell me so.
537      */
538     if(confgetint("net", "mode") == 0)
539     {
540         if((sk = mksock(name->sa_family, type)) == NULL)
541             return(NULL);
542         sk->state = SOCK_LST;
543         if(confgetint("net", "reuseaddr"))
544         {
545             intbuf = 1;
546             setsockopt(sk->fd, SOL_SOCKET, SO_REUSEADDR, &intbuf, sizeof(intbuf));
547         }
548         if(bind(sk->fd, name, namelen) < 0)
549         {
550             putsock(sk);
551             return(NULL);
552         }
553         if(listen(sk->fd, 16) < 0)
554         {
555             putsock(sk);
556             return(NULL);
557         }
558         sk->acceptcb = func;
559         sk->data = data;
560         return(sk);
561     }
562     errno = EOPNOTSUPP;
563     return(NULL);
564 }
565
566 /*
567  * The difference between netcslisten() and netcslistenlocal() is that
568  * netcslistenlocal() always listens on the local host, instead of
569  * following proxy/passive mode directions. It is suitable for eg. the
570  * UI channel, while the file sharing networks should, naturally, use
571  * netcslisten() instead.
572 */
573
574 struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
575 {
576     struct socket *sk;
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 *netcsdgram(struct sockaddr *name, socklen_t namelen)
608 {
609     struct socket *sk;
610     int mode;
611     
612     mode = confgetint("net", "mode");
613     if((mode == 0) || (mode == 1))
614     {
615         if((sk = mksock(name->sa_family, SOCK_DGRAM)) == NULL)
616             return(NULL);
617         if(bind(sk->fd, name, namelen) < 0)
618         {
619             putsock(sk);
620             return(NULL);
621         }
622         sk->state = SOCK_EST;
623         return(sk);
624     }
625     errno = EOPNOTSUPP;
626     return(NULL);
627 }
628
629 struct socket *netdupsock(struct socket *sk)
630 {
631     struct socket *newsk;
632     
633     newsk = newsock(sk->type);
634     if((newsk->fd = dup(sk->fd)) < 0)
635     {
636         flog(LOG_WARNING, "could not dup() socket: %s", strerror(errno));
637         putsock(newsk);
638         return(NULL);
639     }
640     newsk->state = sk->state;
641     newsk->ignread = sk->ignread;
642     if(sk->remote != NULL)
643         memcpy(newsk->remote = smalloc(sk->remotelen), sk->remote, newsk->remotelen = sk->remotelen);
644     return(newsk);
645 }
646
647 void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
648 {
649     if(sk->remote != NULL)
650         free(sk->remote);
651     memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
652     sk->ignread = 1;
653 }
654
655 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data)
656 {
657     struct socket *sk;
658     int mode;
659     
660     mode = confgetint("net", "mode");
661     if((mode == 0) || (mode == 1))
662     {
663         if((sk = mksock(addr->sa_family, SOCK_STREAM)) == NULL)
664             return(NULL);
665         memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
666         if(!connect(sk->fd, addr, addrlen))
667         {
668             sk->state = SOCK_EST;
669             func(sk, 0, data);
670             return(sk);
671         }
672         if(errno == EINPROGRESS)
673         {
674             sk->state = SOCK_SYN;
675             sk->conncb = func;
676             sk->data = data;
677             return(sk);
678         }
679         putsock(sk);
680         return(NULL);
681     }
682     errno = EOPNOTSUPP;
683     return(NULL);
684 }
685
686 int pollsocks(int timeout)
687 {
688     int i, num, ret, retlen;
689     int newfd;
690     struct pollfd *pfds;
691     struct socket *sk, *next, *newsk;
692     struct sockaddr_storage ss;
693     socklen_t sslen;
694     
695     pfds = smalloc(sizeof(*pfds) * (num = numsocks));
696     for(i = 0, sk = sockets; i < num; sk = sk->next)
697     {
698         if(sk->state == SOCK_STL)
699         {
700             num--;
701             continue;
702         }
703         pfds[i].fd = sk->fd;
704         pfds[i].events = 0;
705         if(!sk->ignread)
706             pfds[i].events |= POLLIN;
707         if((sk->state == SOCK_SYN) || (sockqueuesize(sk) > 0))
708             pfds[i].events |= POLLOUT;
709         pfds[i].revents = 0;
710         i++;
711     }
712     ret = poll(pfds, num, timeout);
713     if(ret < 0)
714     {
715         if(errno != EINTR)
716         {
717             flog(LOG_CRIT, "pollsocks: poll errored out: %s", strerror(errno));
718             /* To avoid CPU hogging in case it's bad, which it
719              * probably is. */
720             sleep(1);
721         }
722         free(pfds);
723         return(1);
724     }
725     for(sk = sockets; sk != NULL; sk = next)
726     {
727         next = sk->next;
728         for(i = 0; i < num; i++)
729         {
730             if(pfds[i].fd == sk->fd)
731                 break;
732         }
733         if(i == num)
734             continue;
735         switch(sk->state)
736         {
737         case SOCK_LST:
738             if(pfds[i].revents & POLLIN)
739             {
740                 sslen = sizeof(ss);
741                 if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
742                 {
743                     if(sk->errcb != NULL)
744                         sk->errcb(sk, errno, sk->data);
745                 }
746                 newsk = newsock(sk->type);
747                 newsk->fd = newfd;
748                 newsk->family = sk->family;
749                 newsk->state = SOCK_EST;
750                 memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
751                 newsk->remotelen = sslen;
752                 putsock(newsk);
753                 if(sk->acceptcb != NULL)
754                     sk->acceptcb(sk, newsk, sk->data);
755             }
756             if(pfds[i].revents & POLLERR)
757             {
758                 retlen = sizeof(ret);
759                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
760                 if(sk->errcb != NULL)
761                     sk->errcb(sk, ret, sk->data);
762                 continue;
763             }
764             break;
765         case SOCK_SYN:
766             if(pfds[i].revents & POLLERR)
767             {
768                 retlen = sizeof(ret);
769                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
770                 if(sk->conncb != NULL)
771                     sk->conncb(sk, ret, sk->data);
772                 closesock(sk);
773                 continue;
774             }
775             if(pfds[i].revents & (POLLIN | POLLOUT))
776             {
777                 sk->state = SOCK_EST;
778                 if(sk->conncb != NULL)
779                     sk->conncb(sk, 0, sk->data);
780             }
781             break;
782         case SOCK_EST:
783             if(pfds[i].revents & POLLERR)
784             {
785                 retlen = sizeof(ret);
786                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
787                 if(sk->errcb != NULL)
788                     sk->errcb(sk, ret, sk->data);
789                 closesock(sk);
790                 continue;
791             }
792             if(pfds[i].revents & POLLIN)
793                 sockrecv(sk);
794             if(pfds[i].revents & POLLOUT)
795             {
796                 if(sockqueuesize(sk) > 0)
797                     sockflush(sk);
798             }
799             break;
800         }
801         if(pfds[i].revents & POLLNVAL)
802         {
803             flog(LOG_CRIT, "BUG: stale socket struct on fd %i", sk->fd);
804             sk->state = SOCK_STL;
805             unlinksock(sk);
806             continue;
807         }
808         if(pfds[i].revents & POLLHUP)
809         {
810             if(sk->errcb != NULL)
811                 sk->errcb(sk, 0, sk->data);
812             closesock(sk);
813             unlinksock(sk);
814             continue;
815         }
816     }
817     free(pfds);
818     for(sk = sockets; sk != NULL; sk = next)
819     {
820         next = sk->next;
821         if(sk->refcount == 1 && (sockqueuesize(sk) == 0))
822         {
823             unlinksock(sk);
824             continue;
825         }
826         if(sk->close && (sockqueuesize(sk) == 0))
827             closesock(sk);
828         if(sk->state == SOCK_STL)
829         {
830             unlinksock(sk);
831             continue;
832         }
833     }
834     return(1);
835 }
836
837 int socksettos(struct socket *sk, int tos)
838 {
839     if(sk->family == AF_INET)
840     {
841         if(setsockopt(sk->fd, SOL_IP, IP_TOS, &tos, sizeof(tos)) < 0)
842         {
843             flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
844             return(-1);
845         }
846         return(0);
847     }
848     /* XXX: How does the IPv6 traffic class work? */
849     flog(LOG_WARNING, "could not set TOS on sock of family %i", sk->family);
850     return(1);
851 }
852
853 struct resolvedata
854 {
855     int fd;
856     void (*callback)(struct sockaddr *addr, int addrlen, void *data);
857     void *data;
858     struct sockaddr_storage addr;
859     int addrlen;
860 };
861
862 static void resolvecb(pid_t pid, int status, struct resolvedata *data)
863 {
864     static char buf[80];
865     int ret;
866     struct sockaddr_in *ipv4;
867     
868     if(!status)
869     {
870         if((ret = read(data->fd, buf, sizeof(buf))) != 4)
871         {
872             errno = ENONET;
873             data->callback(NULL, 0, data->data);
874         } else {
875             ipv4 = (struct sockaddr_in *)&data->addr;
876             memcpy(&ipv4->sin_addr, buf, 4);
877             data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
878         }
879     } else {
880         errno = ENONET;
881         data->callback(NULL, 0, data->data);
882     }
883     close(data->fd);
884     free(data);
885 }
886
887 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data)
888 {
889     int i;
890     char *p;
891     int port;
892     int pfd[2];
893     pid_t child;
894     struct resolvedata *rdata;
895     struct sockaddr_in ipv4;
896     struct hostent *he;
897     sigset_t sigset;
898     
899     /* IPv4 */
900     port = -1;
901     if((p = strchr(addr, ':')) != NULL)
902     {
903         *p = 0;
904         port = atoi(p + 1);
905     }
906     ipv4.sin_family = AF_INET;
907     ipv4.sin_port = htons(port);
908     if(inet_aton(addr, &ipv4.sin_addr))
909     {
910         callback((struct sockaddr *)&ipv4, sizeof(ipv4), data);
911     } else {
912         sigemptyset(&sigset);
913         sigaddset(&sigset, SIGCHLD);
914         sigprocmask(SIG_BLOCK, &sigset, NULL);
915         if((pipe(pfd) < 0) || ((child = fork()) < 0))
916         {
917             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
918             return(-1);
919         }
920         if(child == 0)
921         {
922             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
923             for(i = 3; i < FD_SETSIZE; i++)
924             {
925                 if(i != pfd[1])
926                     close(i);
927             }
928             signal(SIGALRM, SIG_DFL);
929             alarm(30);
930             if((he = gethostbyname(addr)) == NULL)
931                 exit(1);
932             write(pfd[1], he->h_addr_list[0], 4);
933             exit(0);
934         } else {
935             close(pfd[1]);
936             fcntl(pfd[0], F_SETFL, fcntl(pfd[0], F_GETFL) | O_NONBLOCK);
937             rdata = smalloc(sizeof(*rdata));
938             rdata->fd = pfd[0];
939             rdata->callback = callback;
940             rdata->data = data;
941             memcpy(&rdata->addr, &ipv4, rdata->addrlen = sizeof(ipv4));
942             childcallback(child, (void (*)(pid_t, int, void *))resolvecb, rdata);
943             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
944             return(1);
945         }
946     }
947     return(0);
948 }
949
950 int sockgetlocalname(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
951 {
952     socklen_t len;
953     struct sockaddr_storage name;
954     
955     *namebuf = NULL;
956     if((sk->state == SOCK_STL) || (sk->fd < 0))
957         return(-1);
958     len = sizeof(name);
959     if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
960     {
961         flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetlocalname");
962         return(-1);
963     }
964     *namebuf = memcpy(smalloc(len), &name, len);
965     *lenbuf = len;
966     return(0);
967 }
968
969 int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
970 {
971     socklen_t len;
972     struct sockaddr_storage name;
973     struct sockaddr_in *ipv4;
974     struct sockaddr *pname;
975     socklen_t pnamelen;
976     
977     switch(confgetint("net", "mode"))
978     {
979     case 0:
980         *namebuf = NULL;
981         if((sk->state == SOCK_STL) || (sk->fd < 0))
982             return(-1);
983         len = sizeof(name);
984         if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
985         {
986             flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetremotename");
987             return(-1);
988         }
989         if(name.ss_family == AF_INET)
990         {
991             ipv4 = (struct sockaddr_in *)&name;
992             if(getpublicaddr(AF_INET, &pname, &pnamelen) < 0)
993             {
994                 flog(LOG_WARNING, "could not determine public IP address - strange things may happen");
995                 return(-1);
996             }
997             ipv4->sin_addr.s_addr = ((struct sockaddr_in *)pname)->sin_addr.s_addr;
998             free(pname);
999         }
1000         *namebuf = memcpy(smalloc(len), &name, len);
1001         *lenbuf = len;
1002         return(0);
1003     case 1:
1004         errno = EOPNOTSUPP;
1005         return(-1);
1006     default:
1007         flog(LOG_CRIT, "unknown net mode %i active", confgetint("net", "mode"));
1008         errno = EOPNOTSUPP;
1009         return(-1);
1010     }
1011 }
1012
1013 char *formataddress(struct sockaddr *arg, socklen_t arglen)
1014 {
1015     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1016                                * lowercase letters to 1, so I do this
1017                                * instead. */
1018     struct sockaddr_in *ipv4;
1019 #ifdef HAVE_IPV6
1020     struct sockaddr_in6 *ipv6;
1021 #endif
1022     static char *ret = NULL;
1023     char buf[1024];
1024     
1025     if(ret != NULL)
1026         free(ret);
1027     ret = NULL;
1028     switch(arg->sa_family)
1029     {
1030     case AF_UNIX:
1031         UNIX = (struct sockaddr_un *)arg;
1032         ret = sprintf2("%s", UNIX->sun_path);
1033         break;
1034     case AF_INET:
1035         ipv4 = (struct sockaddr_in *)arg;
1036         if(inet_ntop(AF_INET, &ipv4->sin_addr, buf, sizeof(buf)) == NULL)
1037             return(NULL);
1038         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv4->sin_port));
1039         break;
1040 #ifdef HAVE_IPV6
1041     case AF_INET6:
1042         ipv6 = (struct sockaddr_in6 *)arg;
1043         if(inet_ntop(AF_INET6, &ipv6->sin6_addr, buf, sizeof(buf)) == NULL)
1044             return(NULL);
1045         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv6->sin6_port));
1046         break;
1047 #endif
1048     default:
1049         errno = EPFNOSUPPORT;
1050         break;
1051     }
1052     return(ret);
1053 }
1054
1055 #if 0
1056
1057 /* 
1058  * It was very nice to use this, but it seems
1059  * to mess things up, so I guess it has to go... :-(
1060  */
1061
1062 static int formataddress(FILE *stream, const struct printf_info *info, const void *const *args)
1063 {
1064     struct sockaddr *arg;
1065     socklen_t arglen;
1066     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1067                                * lowercase letters to 1, so I do this
1068                                * instead. */
1069     struct sockaddr_in *ipv4;
1070     int ret;
1071     
1072     arg = *(struct sockaddr **)(args[0]);
1073     arglen = *(socklen_t *)(args[1]);
1074     switch(arg->sa_family)
1075     {
1076     case AF_UNIX:
1077         UNIX = (struct sockaddr_un *)arg;
1078         ret = fprintf(stream, "%s", UNIX->sun_path);
1079         break;
1080     case AF_INET:
1081         ipv4 = (struct sockaddr_in *)arg;
1082         ret = fprintf(stream, "%s:%i", inet_ntoa(ipv4->sin_addr), (int)ntohs(ipv4->sin_port));
1083         break;
1084     default:
1085         ret = -1;
1086         errno = EPFNOSUPPORT;
1087         break;
1088     }
1089     return(ret);
1090 }
1091
1092 static int formataddress_arginfo(const struct printf_info *info, size_t n, int *argtypes)
1093 {
1094     if(n > 0)
1095         argtypes[0] = PA_POINTER;
1096     if(n > 1)
1097         argtypes[1] = PA_INT; /* Sources tell me that socklen_t _must_
1098                                * be an int, so I guess this should be
1099                                * safe. */
1100     return(2);
1101 }
1102 #endif
1103
1104 static int init(int hup)
1105 {
1106     if(!hup)
1107     {
1108         /*
1109         if(register_printf_function('N', formataddress, formataddress_arginfo))
1110         {
1111             flog(LOG_CRIT, "could not register printf handler %%N: %s", strerror(errno));
1112             return(1);
1113         }
1114         */
1115     }
1116     return(0);
1117 }
1118
1119 static void terminate(void)
1120 {
1121     while(sockets != NULL)
1122         unlinksock(sockets);
1123 }
1124
1125 static struct module me =
1126 {
1127     .name = "net",
1128     .conf =
1129     {
1130         .vars = myvars
1131     },
1132     .init = init,
1133     .terminate = terminate
1134 };
1135
1136 MODULE(me)