Incremental work on excorcising the transfer iface.
[doldaconnect.git] / daemon / net.h
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 #ifndef _NET_H
20 #define _NET_H
21
22 #include <sys/socket.h>
23 #include <sys/un.h>
24
25 #define SOCK_SYN 0 /* Connecting */
26 #define SOCK_EST 1 /* Established */
27 #define SOCK_STL 2 /* Stale, dead */
28 #define SOCK_TOS_MINDELAY 4
29 #define SOCK_TOS_MAXTP 3
30 #define SOCK_TOS_MAXREL 2
31 #define SOCK_TOS_MINCOST 1
32
33 struct dgrambuf
34 {
35     struct dgrambuf *next;
36     struct sockaddr *addr;
37     socklen_t addrlen;
38     void *data;
39     size_t size;
40 };
41
42 struct socket
43 {
44     int refcount;
45     int state;
46     int dgram;
47     int eos;
48     size_t maxbuf;
49     struct socket *back, *pnext;
50     union
51     {
52         struct
53         {
54             struct dgrambuf *f, *l;
55         } d;
56         struct
57         {
58             void *buf;
59             size_t bufsize;
60             size_t datasize;
61         } s;
62     } buf;
63     void (*conncb)(struct socket *sk, int err, void *data);
64     void (*errcb)(struct socket *sk, int err, void *data);
65     void (*readcb)(struct socket *sk, void *data);
66     void (*writecb)(struct socket *sk, void *data);
67     struct ufd *ufd;
68     void *data;
69 };
70
71 struct lport {
72     struct ufd *ufd;
73     void (*acceptcb)(struct lport *lp, struct socket *newsk, void *data);
74     void (*errcb)(struct lport *lp, int err, void *data);
75     void *data;
76 };
77
78 void putsock(struct socket *sk);
79 void getsock(struct socket *sk);
80 struct socket *netsockpipe(void);
81 struct lport *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct lport *, struct socket *, void *), void *data);
82 struct lport *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct lport *, struct socket *, void *), void *data);
83 struct lport *netcstcplisten(int port, int local, void (*func)(struct lport *, struct socket *, void *), void *data);
84 struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data);
85 int pollsocks(int timeout);
86 void freedgbuf(struct dgrambuf *dg);
87 void sockqueue(struct socket *sk, void *data, size_t size);
88 void sockerror(struct socket *sk, int en);
89 /* size_t sockqueuesize(struct socket *sk); */
90 ssize_t sockqueueleft(struct socket *sk);
91 int netresolve(char *addr, void (*callback)(struct sockaddr *addr, int addrlen, void *data), void *data);
92 struct socket *netcsdgram(struct sockaddr *name, socklen_t namelen);
93 struct socket *netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen);
94 int sockgetremotename(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf);
95 int sockgetremotename2(struct socket *sk, struct socket *sk2, struct sockaddr **namebuf, socklen_t *lenbuf);
96 int lstgetremotename(struct lport *lp, struct sockaddr **namebuf, socklen_t *lenbuf);
97 int lstgetremotename2(struct lport *lp, struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf);
98 void closesock(struct socket *sk);
99 void closelport(struct lport *lp);
100 void *sockgetinbuf(struct socket *sk, size_t *size);
101 struct socket *wrapsock(int fd);
102 size_t sockgetdatalen(struct socket *sk);
103 int socksettos(struct socket *sk, int tos);
104 int addreq(struct sockaddr *x, struct sockaddr *y);
105 char *formataddress(struct sockaddr *arg, socklen_t arglen);
106 char *formatsockpeer(struct socket *sk);
107 void sockpushdata(struct socket *sk, void *buf, size_t size);
108 /* void sockblock(struct socket *sk, int block); */
109 int sockpeeraddr(struct socket *sk, struct sockaddr **namebuf, socklen_t *lenbuf);
110 int getucred(struct socket *sk, uid_t *uid, gid_t *gid);
111 int sockfamily(struct socket *sk);
112
113 #endif