deed9e25 |
1 | #include "putty.h" |
2 | #include "network.h" |
3 | #include "mac.h" |
76249e6f |
4 | #include "ssh.h" |
deed9e25 |
5 | |
f6fc0010 |
6 | struct 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); |
f6fc0010 |
17 | Socket (*newlistener)(char *, int, Plug, int); |
18 | char *(*addr_error)(SockAddr); |
19 | void (*poll)(void); |
20 | void (*cleanup)(void); |
21 | }; |
22 | |
23 | static struct macnet_stack *stack; |
24 | |
25 | static 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 |
32 | static 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 | |
40 | void sk_init(void) |
41 | { |
42 | |
43 | #if 0 |
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 |
60 | SockAddr 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 |
68 | SockAddr sk_nonamelookup(char const *host) |
deed9e25 |
69 | { |
70 | |
f6fc0010 |
71 | if (stack != NULL) |
72 | return stack->nonamelookup(host); |
73 | return NULL; |
deed9e25 |
74 | } |
75 | |
76 | void 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 | |
85 | int 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 | |
93 | int 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 | |
101 | int sk_addrtype(SockAddr addr) |
102 | { |
103 | |
f6fc0010 |
104 | if (stack != NULL) |
105 | return stack->addrtype(addr); |
106 | return 0; |
deed9e25 |
107 | } |
108 | |
109 | void sk_addrcopy(SockAddr addr, char *buf) |
110 | { |
111 | |
f6fc0010 |
112 | if (stack != NULL) |
113 | stack->addrcopy(addr, buf); |
deed9e25 |
114 | } |
115 | |
116 | void sk_addr_free(SockAddr addr) |
117 | { |
118 | |
f6fc0010 |
119 | if (stack != NULL) |
120 | stack->addr_free(addr); |
deed9e25 |
121 | } |
122 | |
123 | Socket 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 | |
131 | Socket 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 |
141 | Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, int address_family) |
deed9e25 |
142 | { |
143 | |
f6fc0010 |
144 | if (stack != NULL) |
145 | return stack->newlistener(srcaddr, port, plug, local_host_only); |
146 | return NULL; |
deed9e25 |
147 | } |
148 | |
cbe2d68f |
149 | const 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 | |
157 | void sk_poll(void) |
158 | { |
159 | |
160 | if (stack != NULL) |
161 | stack->poll(); |
deed9e25 |
162 | } |
163 | |
27a3458f |
164 | void sk_cleanup(void) |
165 | { |
166 | |
f6fc0010 |
167 | if (stack != NULL) |
168 | stack->cleanup(); |
27a3458f |
169 | } |
170 | |
ebb7ac45 |
171 | /* We should use Internet Config here. */ |
172 | int net_service_lookup(char *service) |
173 | { |
174 | |
175 | return 0; |
176 | } |
177 | |
e479b152 |
178 | SockAddr platform_get_x11_unix_address(int displaynum, char **canonicalname) |
179 | { |
180 | return NULL; |
181 | } |
ebb7ac45 |
182 | |
deed9e25 |
183 | /* |
184 | * Local Variables: |
185 | * c-file-style: "simon" |
186 | * End: |
187 | */ |
188 | |