deed9e25 |
1 | #include "putty.h" |
2 | #include "network.h" |
3 | #include "mac.h" |
4 | |
f6fc0010 |
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 | |
b2859f7a |
30 | #if !TARGET_API_MAC_CARBON |
f6fc0010 |
31 | static 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 | |
39 | void 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 |
59 | SockAddr 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 |
67 | SockAddr sk_nonamelookup(char const *host) |
deed9e25 |
68 | { |
69 | |
f6fc0010 |
70 | if (stack != NULL) |
71 | return stack->nonamelookup(host); |
72 | return NULL; |
deed9e25 |
73 | } |
74 | |
75 | void 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 | |
84 | int 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 | |
92 | int 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 | |
100 | int sk_addrtype(SockAddr addr) |
101 | { |
102 | |
f6fc0010 |
103 | if (stack != NULL) |
104 | return stack->addrtype(addr); |
105 | return 0; |
deed9e25 |
106 | } |
107 | |
108 | void sk_addrcopy(SockAddr addr, char *buf) |
109 | { |
110 | |
f6fc0010 |
111 | if (stack != NULL) |
112 | stack->addrcopy(addr, buf); |
deed9e25 |
113 | } |
114 | |
115 | void sk_addr_free(SockAddr addr) |
116 | { |
117 | |
f6fc0010 |
118 | if (stack != NULL) |
119 | stack->addr_free(addr); |
deed9e25 |
120 | } |
121 | |
122 | Socket 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 | |
130 | Socket sk_new(SockAddr addr, int port, int privport, int oobinline, |
131 | int nodelay, Plug plug) |
132 | { |
133 | |
f6fc0010 |
134 | if (stack != NULL) |
135 | return stack->new(addr, port, privport, oobinline, nodelay, plug); |
136 | return NULL; |
deed9e25 |
137 | } |
138 | |
139 | Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) |
140 | { |
141 | |
f6fc0010 |
142 | if (stack != NULL) |
143 | return stack->newlistener(srcaddr, port, plug, local_host_only); |
144 | return NULL; |
deed9e25 |
145 | } |
146 | |
147 | char *sk_addr_error(SockAddr addr) |
148 | { |
149 | |
f6fc0010 |
150 | if (stack != NULL) |
151 | return stack->addr_error(addr); |
152 | return "No TCP/IP stack installed"; |
153 | } |
154 | |
155 | void sk_poll(void) |
156 | { |
157 | |
158 | if (stack != NULL) |
159 | stack->poll(); |
deed9e25 |
160 | } |
161 | |
27a3458f |
162 | void sk_cleanup(void) |
163 | { |
164 | |
f6fc0010 |
165 | if (stack != NULL) |
166 | stack->cleanup(); |
27a3458f |
167 | } |
168 | |
ebb7ac45 |
169 | /* We should use Internet Config here. */ |
170 | int net_service_lookup(char *service) |
171 | { |
172 | |
173 | return 0; |
174 | } |
175 | |
176 | |
deed9e25 |
177 | /* |
178 | * Local Variables: |
179 | * c-file-style: "simon" |
180 | * End: |
181 | */ |
182 | |