Add a configuration option for TCP keepalives (SO_KEEPALIVE), default off.
[u/mdw/putty] / mac / macnet.c
CommitLineData
deed9e25 1#include "putty.h"
2#include "network.h"
3#include "mac.h"
4
f6fc0010 5struct macnet_stack {
6 SockAddr (*namelookup)(char const *, char **);
7 SockAddr (*nonamelookup)(char const *);
8 void (*getaddr)(SockAddr, char *, int);
9 int (*hostname_is_local)(char *);
10 int (*address_is_local)(SockAddr);
11 int (*addrtype)(SockAddr);
12 void (*addrcopy)(SockAddr, char *);
13 void (*addr_free)(SockAddr);
14 Socket (*skregister)(void *, Plug); /* "register" is a reserved word */
79bf227b 15 Socket (*new)(SockAddr, int, int, int, int, int, Plug);
f6fc0010 16 Socket (*newlistener)(char *, int, Plug, int);
17 char *(*addr_error)(SockAddr);
18 void (*poll)(void);
19 void (*cleanup)(void);
20};
21
22static struct macnet_stack *stack;
23
24static struct macnet_stack ot = {
25 ot_namelookup, ot_nonamelookup, ot_getaddr, ot_hostname_is_local,
26 ot_address_is_local, ot_addrtype, ot_addrcopy, ot_addr_free,
27 ot_register, ot_new, ot_newlistener, ot_addr_error, ot_poll, ot_cleanup
28};
29
b2859f7a 30#if !TARGET_API_MAC_CARBON
f6fc0010 31static struct macnet_stack mactcp = {
32 mactcp_namelookup, mactcp_nonamelookup, mactcp_getaddr,
33 mactcp_hostname_is_local, mactcp_address_is_local, mactcp_addrtype,
34 mactcp_addrcopy, mactcp_addr_free, mactcp_register, mactcp_new,
35 mactcp_newlistener, mactcp_addr_error, mactcp_poll, mactcp_cleanup
36};
b2859f7a 37#endif
f6fc0010 38
39void sk_init(void)
40{
41
42#if 0
43 if (ot_init() == noErr)
44 stack = &ot;
45 else
46#endif
b2859f7a 47#if !TARGET_API_MAC_CARBON
f6fc0010 48 if (mactcp_init() == noErr)
49 stack = &mactcp;
50 else
b2859f7a 51#endif
f6fc0010 52 stack = NULL;
53}
54
deed9e25 55/*
56 * Network functions exported to the world. These choose whether to call
57 * MacTCP or OpenTransport and behave accordingly.
58 */
2e96d504 59SockAddr sk_namelookup(char const *host, char **canonicalname)
deed9e25 60{
61
f6fc0010 62 if (stack != NULL)
63 return stack->namelookup(host, canonicalname);
64 return NULL;
deed9e25 65}
66
2e96d504 67SockAddr sk_nonamelookup(char const *host)
deed9e25 68{
69
f6fc0010 70 if (stack != NULL)
71 return stack->nonamelookup(host);
72 return NULL;
deed9e25 73}
74
75void sk_getaddr(SockAddr addr, char *buf, int buflen)
76{
77
f6fc0010 78 if (stack != NULL)
79 stack->getaddr(addr, buf, buflen);
deed9e25 80 else
81 *buf = '\0';
82}
83
84int sk_hostname_is_local(char *name)
85{
86
f6fc0010 87 if (stack != NULL)
88 return stack->hostname_is_local(name);
89 return 0;
deed9e25 90}
91
92int sk_address_is_local(SockAddr addr)
93{
94
f6fc0010 95 if (stack != NULL)
96 return stack->address_is_local(addr);
97 return 0;
deed9e25 98}
99
100int sk_addrtype(SockAddr addr)
101{
102
f6fc0010 103 if (stack != NULL)
104 return stack->addrtype(addr);
105 return 0;
deed9e25 106}
107
108void sk_addrcopy(SockAddr addr, char *buf)
109{
110
f6fc0010 111 if (stack != NULL)
112 stack->addrcopy(addr, buf);
deed9e25 113}
114
115void sk_addr_free(SockAddr addr)
116{
117
f6fc0010 118 if (stack != NULL)
119 stack->addr_free(addr);
deed9e25 120}
121
122Socket sk_register(void *sock, Plug plug)
123{
124
f6fc0010 125 if (stack != NULL)
126 return stack->skregister(sock, plug);
127 return NULL;
deed9e25 128}
129
130Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
79bf227b 131 int nodelay, int keepalive, Plug plug)
deed9e25 132{
133
f6fc0010 134 if (stack != NULL)
79bf227b 135 return stack->new(addr, port, privport, oobinline, nodelay, keepalive,
136 plug);
f6fc0010 137 return NULL;
deed9e25 138}
139
140Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only)
141{
142
f6fc0010 143 if (stack != NULL)
144 return stack->newlistener(srcaddr, port, plug, local_host_only);
145 return NULL;
deed9e25 146}
147
cbe2d68f 148const char *sk_addr_error(SockAddr addr)
deed9e25 149{
150
f6fc0010 151 if (stack != NULL)
152 return stack->addr_error(addr);
153 return "No TCP/IP stack installed";
154}
155
156void sk_poll(void)
157{
158
159 if (stack != NULL)
160 stack->poll();
deed9e25 161}
162
27a3458f 163void sk_cleanup(void)
164{
165
f6fc0010 166 if (stack != NULL)
167 stack->cleanup();
27a3458f 168}
169
ebb7ac45 170/* We should use Internet Config here. */
171int net_service_lookup(char *service)
172{
173
174 return 0;
175}
176
177
deed9e25 178/*
179 * Local Variables:
180 * c-file-style: "simon"
181 * End:
182 */
183