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