Redesign the macnet.c infrastructure, largely so as to avoid using Gestalt(),
[u/mdw/putty] / mac / macnet.c
1 #include "putty.h"
2 #include "network.h"
3 #include "mac.h"
4
5 struct 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 */
15 Socket (*new)(SockAddr, int, int, int, int, Plug);
16 Socket (*newlistener)(char *, int, Plug, int);
17 char *(*addr_error)(SockAddr);
18 void (*poll)(void);
19 void (*cleanup)(void);
20 };
21
22 static struct macnet_stack *stack;
23
24 static 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
30 static struct macnet_stack mactcp = {
31 mactcp_namelookup, mactcp_nonamelookup, mactcp_getaddr,
32 mactcp_hostname_is_local, mactcp_address_is_local, mactcp_addrtype,
33 mactcp_addrcopy, mactcp_addr_free, mactcp_register, mactcp_new,
34 mactcp_newlistener, mactcp_addr_error, mactcp_poll, mactcp_cleanup
35 };
36
37 void sk_init(void)
38 {
39
40 #if 0
41 if (ot_init() == noErr)
42 stack = &ot;
43 else
44 #endif
45 if (mactcp_init() == noErr)
46 stack = &mactcp;
47 else
48 stack = NULL;
49 }
50
51 /*
52 * Network functions exported to the world. These choose whether to call
53 * MacTCP or OpenTransport and behave accordingly.
54 */
55 SockAddr sk_namelookup(char const *host, char **canonicalname)
56 {
57
58 if (stack != NULL)
59 return stack->namelookup(host, canonicalname);
60 return NULL;
61 }
62
63 SockAddr sk_nonamelookup(char const *host)
64 {
65
66 if (stack != NULL)
67 return stack->nonamelookup(host);
68 return NULL;
69 }
70
71 void sk_getaddr(SockAddr addr, char *buf, int buflen)
72 {
73
74 if (stack != NULL)
75 stack->getaddr(addr, buf, buflen);
76 else
77 *buf = '\0';
78 }
79
80 int sk_hostname_is_local(char *name)
81 {
82
83 if (stack != NULL)
84 return stack->hostname_is_local(name);
85 return 0;
86 }
87
88 int sk_address_is_local(SockAddr addr)
89 {
90
91 if (stack != NULL)
92 return stack->address_is_local(addr);
93 return 0;
94 }
95
96 int sk_addrtype(SockAddr addr)
97 {
98
99 if (stack != NULL)
100 return stack->addrtype(addr);
101 return 0;
102 }
103
104 void sk_addrcopy(SockAddr addr, char *buf)
105 {
106
107 if (stack != NULL)
108 stack->addrcopy(addr, buf);
109 }
110
111 void sk_addr_free(SockAddr addr)
112 {
113
114 if (stack != NULL)
115 stack->addr_free(addr);
116 }
117
118 Socket sk_register(void *sock, Plug plug)
119 {
120
121 if (stack != NULL)
122 return stack->skregister(sock, plug);
123 return NULL;
124 }
125
126 Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
127 int nodelay, Plug plug)
128 {
129
130 if (stack != NULL)
131 return stack->new(addr, port, privport, oobinline, nodelay, plug);
132 return NULL;
133 }
134
135 Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only)
136 {
137
138 if (stack != NULL)
139 return stack->newlistener(srcaddr, port, plug, local_host_only);
140 return NULL;
141 }
142
143 char *sk_addr_error(SockAddr addr)
144 {
145
146 if (stack != NULL)
147 return stack->addr_error(addr);
148 return "No TCP/IP stack installed";
149 }
150
151 void sk_poll(void)
152 {
153
154 if (stack != NULL)
155 stack->poll();
156 }
157
158 void sk_cleanup(void)
159 {
160
161 if (stack != NULL)
162 stack->cleanup();
163 }
164
165 /*
166 * Local Variables:
167 * c-file-style: "simon"
168 * End:
169 */
170