Bleh
[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     int intbuf;
578     
579     /* I don't know if this is actually correct (it probably isn't),
580      * but since, at on least Linux systems, PF_* are specifically
581      * #define'd to their AF_* counterparts, it allows for a severely
582      * smoother implementation. If it breaks something on your
583      * platform, please tell me so.
584      */
585     if((sk = mksock(name->sa_family, type)) == NULL)
586         return(NULL);
587     sk->state = SOCK_LST;
588     if(confgetint("net", "reuseaddr"))
589     {
590         intbuf = 1;
591         setsockopt(sk->fd, SOL_SOCKET, SO_REUSEADDR, &intbuf, sizeof(intbuf));
592     }
593     if(bind(sk->fd, name, namelen) < 0)
594     {
595         putsock(sk);
596         return(NULL);
597     }
598     if(listen(sk->fd, 16) < 0)
599     {
600         putsock(sk);
601         return(NULL);
602     }
603     sk->acceptcb = func;
604     sk->data = data;
605     return(sk);
606 }
607
608 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen)
609 {
610     struct socket *sk;
611     int mode;
612     
613     mode = confgetint("net", "mode");
614     if((mode == 0) || (mode == 1))
615     {
616         if((sk = mksock(name->sa_family, SOCK_DGRAM)) == NULL)
617             return(NULL);
618         if(bind(sk->fd, name, namelen) < 0)
619         {
620             putsock(sk);
621             return(NULL);
622         }
623         sk->state = SOCK_EST;
624         return(sk);
625     }
626     errno = EOPNOTSUPP;
627     return(NULL);
628 }
629
630 struct socket *netdupsock(struct socket *sk)
631 {
632     struct socket *newsk;
633     
634     newsk = newsock(sk->type);
635     if((newsk->fd = dup(sk->fd)) < 0)
636     {
637         flog(LOG_WARNING, "could not dup() socket: %s", strerror(errno));
638         putsock(newsk);
639         return(NULL);
640     }
641     newsk->state = sk->state;
642     newsk->ignread = sk->ignread;
643     if(sk->remote != NULL)
644         memcpy(newsk->remote = smalloc(sk->remotelen), sk->remote, newsk->remotelen = sk->remotelen);
645     return(newsk);
646 }
647
648 void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
649 {
650     if(sk->remote != NULL)
651         free(sk->remote);
652     memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
653     sk->ignread = 1;
654 }
655
656 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data)
657 {
658     struct socket *sk;
659     int mode;
660     
661     mode = confgetint("net", "mode");
662     if((mode == 0) || (mode == 1))
663     {
664         if((sk = mksock(addr->sa_family, SOCK_STREAM)) == NULL)
665             return(NULL);
666         memcpy(sk->remote = smalloc(addrlen), addr, sk->remotelen = addrlen);
667         if(!connect(sk->fd, addr, addrlen))
668         {
669             sk->state = SOCK_EST;
670             func(sk, 0, data);
671             return(sk);
672         }
673         if(errno == EINPROGRESS)
674         {
675             sk->state = SOCK_SYN;
676             sk->conncb = func;
677             sk->data = data;
678             return(sk);
679         }
680         putsock(sk);
681         return(NULL);
682     }
683     errno = EOPNOTSUPP;
684     return(NULL);
685 }
686
687 int pollsocks(int timeout)
688 {
689     int i, num, ret, retlen;
690     int newfd;
691     struct pollfd *pfds;
692     struct socket *sk, *next, *newsk;
693     struct sockaddr_storage ss;
694     socklen_t sslen;
695     
696     pfds = smalloc(sizeof(*pfds) * (num = numsocks));
697     for(i = 0, sk = sockets; i < num; sk = sk->next)
698     {
699         if(sk->state == SOCK_STL)
700         {
701             num--;
702             continue;
703         }
704         pfds[i].fd = sk->fd;
705         pfds[i].events = 0;
706         if(!sk->ignread)
707             pfds[i].events |= POLLIN;
708         if((sk->state == SOCK_SYN) || (sockqueuesize(sk) > 0))
709             pfds[i].events |= POLLOUT;
710         pfds[i].revents = 0;
711         i++;
712     }
713     ret = poll(pfds, num, timeout);
714     if(ret < 0)
715     {
716         if(errno != EINTR)
717         {
718             flog(LOG_CRIT, "pollsocks: poll errored out: %s", strerror(errno));
719             /* To avoid CPU hogging in case it's bad, which it
720              * probably is. */
721             sleep(1);
722         }
723         free(pfds);
724         return(1);
725     }
726     for(sk = sockets; sk != NULL; sk = next)
727     {
728         next = sk->next;
729         for(i = 0; i < num; i++)
730         {
731             if(pfds[i].fd == sk->fd)
732                 break;
733         }
734         if(i == num)
735             continue;
736         switch(sk->state)
737         {
738         case SOCK_LST:
739             if(pfds[i].revents & POLLIN)
740             {
741                 sslen = sizeof(ss);
742                 if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
743                 {
744                     if(sk->errcb != NULL)
745                         sk->errcb(sk, errno, sk->data);
746                 }
747                 newsk = newsock(sk->type);
748                 newsk->fd = newfd;
749                 newsk->family = sk->family;
750                 newsk->state = SOCK_EST;
751                 memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
752                 newsk->remotelen = sslen;
753                 putsock(newsk);
754                 if(sk->acceptcb != NULL)
755                     sk->acceptcb(sk, newsk, sk->data);
756             }
757             if(pfds[i].revents & POLLERR)
758             {
759                 retlen = sizeof(ret);
760                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
761                 if(sk->errcb != NULL)
762                     sk->errcb(sk, ret, sk->data);
763                 continue;
764             }
765             break;
766         case SOCK_SYN:
767             if(pfds[i].revents & POLLERR)
768             {
769                 retlen = sizeof(ret);
770                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
771                 if(sk->conncb != NULL)
772                     sk->conncb(sk, ret, sk->data);
773                 closesock(sk);
774                 continue;
775             }
776             if(pfds[i].revents & (POLLIN | POLLOUT))
777             {
778                 sk->state = SOCK_EST;
779                 if(sk->conncb != NULL)
780                     sk->conncb(sk, 0, sk->data);
781             }
782             break;
783         case SOCK_EST:
784             if(pfds[i].revents & POLLERR)
785             {
786                 retlen = sizeof(ret);
787                 getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
788                 if(sk->errcb != NULL)
789                     sk->errcb(sk, ret, sk->data);
790                 closesock(sk);
791                 continue;
792             }
793             if(pfds[i].revents & POLLIN)
794                 sockrecv(sk);
795             if(pfds[i].revents & POLLOUT)
796             {
797                 if(sockqueuesize(sk) > 0)
798                     sockflush(sk);
799             }
800             break;
801         }
802         if(pfds[i].revents & POLLNVAL)
803         {
804             flog(LOG_CRIT, "BUG: stale socket struct on fd %i", sk->fd);
805             sk->state = SOCK_STL;
806             unlinksock(sk);
807             continue;
808         }
809         if(pfds[i].revents & POLLHUP)
810         {
811             if(sk->errcb != NULL)
812                 sk->errcb(sk, 0, sk->data);
813             closesock(sk);
814             unlinksock(sk);
815             continue;
816         }
817     }
818     free(pfds);
819     for(sk = sockets; sk != NULL; sk = next)
820     {
821         next = sk->next;
822         if(sk->refcount == 1 && (sockqueuesize(sk) == 0))
823         {
824             unlinksock(sk);
825             continue;
826         }
827         if(sk->close && (sockqueuesize(sk) == 0))
828             closesock(sk);
829         if(sk->state == SOCK_STL)
830         {
831             unlinksock(sk);
832             continue;
833         }
834     }
835     return(1);
836 }
837
838 int socksettos(struct socket *sk, int tos)
839 {
840     if(sk->family == AF_INET)
841     {
842         if(setsockopt(sk->fd, SOL_IP, IP_TOS, &tos, sizeof(tos)) < 0)
843         {
844             flog(LOG_WARNING, "could not set sock TOS to %i: %s", tos, strerror(errno));
845             return(-1);
846         }
847         return(0);
848     }
849     /* XXX: How does the IPv6 traffic class work? */
850     flog(LOG_WARNING, "could not set TOS on sock of family %i", sk->family);
851     return(1);
852 }
853
854 struct resolvedata
855 {
856     int fd;
857     void (*callback)(struct sockaddr *addr, int addrlen, void *data);
858     void *data;
859     struct sockaddr_storage addr;
860     int addrlen;
861 };
862
863 static void resolvecb(pid_t pid, int status, struct resolvedata *data)
864 {
865     static char buf[80];
866     int ret;
867     struct sockaddr_in *ipv4;
868     
869     if(!status)
870     {
871         if((ret = read(data->fd, buf, sizeof(buf))) != 4)
872         {
873             errno = ENONET;
874             data->callback(NULL, 0, data->data);
875         } else {
876             ipv4 = (struct sockaddr_in *)&data->addr;
877             memcpy(&ipv4->sin_addr, buf, 4);
878             data->callback((struct sockaddr *)ipv4, sizeof(*ipv4), data->data);
879         }
880     } else {
881         errno = ENONET;
882         data->callback(NULL, 0, data->data);
883     }
884     close(data->fd);
885     free(data);
886 }
887
888 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data)
889 {
890     int i;
891     char *p;
892     int port;
893     int pfd[2];
894     pid_t child;
895     struct resolvedata *rdata;
896     struct sockaddr_in ipv4;
897     struct hostent *he;
898     sigset_t sigset;
899     
900     /* IPv4 */
901     port = -1;
902     if((p = strchr(addr, ':')) != NULL)
903     {
904         *p = 0;
905         port = atoi(p + 1);
906     }
907     ipv4.sin_family = AF_INET;
908     ipv4.sin_port = htons(port);
909     if(inet_aton(addr, &ipv4.sin_addr))
910     {
911         callback((struct sockaddr *)&ipv4, sizeof(ipv4), data);
912     } else {
913         sigemptyset(&sigset);
914         sigaddset(&sigset, SIGCHLD);
915         sigprocmask(SIG_BLOCK, &sigset, NULL);
916         if((pipe(pfd) < 0) || ((child = fork()) < 0))
917         {
918             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
919             return(-1);
920         }
921         if(child == 0)
922         {
923             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
924             for(i = 3; i < FD_SETSIZE; i++)
925             {
926                 if(i != pfd[1])
927                     close(i);
928             }
929             signal(SIGALRM, SIG_DFL);
930             alarm(30);
931             if((he = gethostbyname(addr)) == NULL)
932                 exit(1);
933             write(pfd[1], he->h_addr_list[0], 4);
934             exit(0);
935         } else {
936             close(pfd[1]);
937             fcntl(pfd[0], F_SETFL, fcntl(pfd[0], F_GETFL) | O_NONBLOCK);
938             rdata = smalloc(sizeof(*rdata));
939             rdata->fd = pfd[0];
940             rdata->callback = callback;
941             rdata->data = data;
942             memcpy(&rdata->addr, &ipv4, rdata->addrlen = sizeof(ipv4));
943             childcallback(child, (void (*)(pid_t, int, void *))resolvecb, rdata);
944             sigprocmask(SIG_UNBLOCK, &sigset, NULL);
945             return(1);
946         }
947     }
948     return(0);
949 }
950
951 int sockgetlocalname(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
952 {
953     socklen_t len;
954     struct sockaddr_storage name;
955     
956     *namebuf = NULL;
957     if((sk->state == SOCK_STL) || (sk->fd < 0))
958         return(-1);
959     len = sizeof(name);
960     if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
961     {
962         flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetlocalname");
963         return(-1);
964     }
965     *namebuf = memcpy(smalloc(len), &name, len);
966     *lenbuf = len;
967     return(0);
968 }
969
970 int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf)
971 {
972     socklen_t len;
973     struct sockaddr_storage name;
974     struct sockaddr_in *ipv4;
975     struct sockaddr *pname;
976     socklen_t pnamelen;
977     
978     switch(confgetint("net", "mode"))
979     {
980     case 0:
981         *namebuf = NULL;
982         if((sk->state == SOCK_STL) || (sk->fd < 0))
983             return(-1);
984         len = sizeof(name);
985         if(getsockname(sk->fd, (struct sockaddr *)&name, &len) < 0)
986         {
987             flog(LOG_ERR, "BUG: alive socket with dead fd in sockgetremotename");
988             return(-1);
989         }
990         if(name.ss_family == AF_INET)
991         {
992             ipv4 = (struct sockaddr_in *)&name;
993             if(getpublicaddr(AF_INET, &pname, &pnamelen) < 0)
994             {
995                 flog(LOG_WARNING, "could not determine public IP address - strange things may happen");
996                 return(-1);
997             }
998             ipv4->sin_addr.s_addr = ((struct sockaddr_in *)pname)->sin_addr.s_addr;
999             free(pname);
1000         }
1001         *namebuf = memcpy(smalloc(len), &name, len);
1002         *lenbuf = len;
1003         return(0);
1004     case 1:
1005         errno = EOPNOTSUPP;
1006         return(-1);
1007     default:
1008         flog(LOG_CRIT, "unknown net mode %i active", confgetint("net", "mode"));
1009         errno = EOPNOTSUPP;
1010         return(-1);
1011     }
1012 }
1013
1014 char *formataddress(struct sockaddr *arg, socklen_t arglen)
1015 {
1016     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1017                                * lowercase letters to 1, so I do this
1018                                * instead. */
1019     struct sockaddr_in *ipv4;
1020 #ifdef HAVE_IPV6
1021     struct sockaddr_in6 *ipv6;
1022 #endif
1023     static char *ret = NULL;
1024     char buf[1024];
1025     
1026     if(ret != NULL)
1027         free(ret);
1028     ret = NULL;
1029     switch(arg->sa_family)
1030     {
1031     case AF_UNIX:
1032         UNIX = (struct sockaddr_un *)arg;
1033         ret = sprintf2("%s", UNIX->sun_path);
1034         break;
1035     case AF_INET:
1036         ipv4 = (struct sockaddr_in *)arg;
1037         if(inet_ntop(AF_INET, &ipv4->sin_addr, buf, sizeof(buf)) == NULL)
1038             return(NULL);
1039         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv4->sin_port));
1040         break;
1041 #ifdef HAVE_IPV6
1042     case AF_INET6:
1043         ipv6 = (struct sockaddr_in6 *)arg;
1044         if(inet_ntop(AF_INET6, &ipv6->sin6_addr, buf, sizeof(buf)) == NULL)
1045             return(NULL);
1046         ret = sprintf2("%s:%i", buf, (int)ntohs(ipv6->sin6_port));
1047         break;
1048 #endif
1049     default:
1050         errno = EPFNOSUPPORT;
1051         break;
1052     }
1053     return(ret);
1054 }
1055
1056 #if 0
1057
1058 /* 
1059  * It was very nice to use this, but it seems
1060  * to mess things up, so I guess it has to go... :-(
1061  */
1062
1063 static int formataddress(FILE *stream, const struct printf_info *info, const void *const *args)
1064 {
1065     struct sockaddr *arg;
1066     socklen_t arglen;
1067     struct sockaddr_un *UNIX; /* Some wise guy has #defined unix with
1068                                * lowercase letters to 1, so I do this
1069                                * instead. */
1070     struct sockaddr_in *ipv4;
1071     int ret;
1072     
1073     arg = *(struct sockaddr **)(args[0]);
1074     arglen = *(socklen_t *)(args[1]);
1075     switch(arg->sa_family)
1076     {
1077     case AF_UNIX:
1078         UNIX = (struct sockaddr_un *)arg;
1079         ret = fprintf(stream, "%s", UNIX->sun_path);
1080         break;
1081     case AF_INET:
1082         ipv4 = (struct sockaddr_in *)arg;
1083         ret = fprintf(stream, "%s:%i", inet_ntoa(ipv4->sin_addr), (int)ntohs(ipv4->sin_port));
1084         break;
1085     default:
1086         ret = -1;
1087         errno = EPFNOSUPPORT;
1088         break;
1089     }
1090     return(ret);
1091 }
1092
1093 static int formataddress_arginfo(const struct printf_info *info, size_t n, int *argtypes)
1094 {
1095     if(n > 0)
1096         argtypes[0] = PA_POINTER;
1097     if(n > 1)
1098         argtypes[1] = PA_INT; /* Sources tell me that socklen_t _must_
1099                                * be an int, so I guess this should be
1100                                * safe. */
1101     return(2);
1102 }
1103 #endif
1104
1105 static int init(int hup)
1106 {
1107     if(!hup)
1108     {
1109         /*
1110         if(register_printf_function('N', formataddress, formataddress_arginfo))
1111         {
1112             flog(LOG_CRIT, "could not register printf handler %%N: %s", strerror(errno));
1113             return(1);
1114         }
1115         */
1116     }
1117     return(0);
1118 }
1119
1120 static void terminate(void)
1121 {
1122     while(sockets != NULL)
1123         unlinksock(sockets);
1124 }
1125
1126 static struct module me =
1127 {
1128     .name = "net",
1129     .conf =
1130     {
1131         .vars = myvars
1132     },
1133     .init = init,
1134     .terminate = terminate
1135 };
1136
1137 MODULE(me)