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 | |
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 | |
deed9e25 |
51 | /* |
52 | * Network functions exported to the world. These choose whether to call |
53 | * MacTCP or OpenTransport and behave accordingly. |
54 | */ |
2e96d504 |
55 | SockAddr sk_namelookup(char const *host, char **canonicalname) |
deed9e25 |
56 | { |
57 | |
f6fc0010 |
58 | if (stack != NULL) |
59 | return stack->namelookup(host, canonicalname); |
60 | return NULL; |
deed9e25 |
61 | } |
62 | |
2e96d504 |
63 | SockAddr sk_nonamelookup(char const *host) |
deed9e25 |
64 | { |
65 | |
f6fc0010 |
66 | if (stack != NULL) |
67 | return stack->nonamelookup(host); |
68 | return NULL; |
deed9e25 |
69 | } |
70 | |
71 | void sk_getaddr(SockAddr addr, char *buf, int buflen) |
72 | { |
73 | |
f6fc0010 |
74 | if (stack != NULL) |
75 | stack->getaddr(addr, buf, buflen); |
deed9e25 |
76 | else |
77 | *buf = '\0'; |
78 | } |
79 | |
80 | int sk_hostname_is_local(char *name) |
81 | { |
82 | |
f6fc0010 |
83 | if (stack != NULL) |
84 | return stack->hostname_is_local(name); |
85 | return 0; |
deed9e25 |
86 | } |
87 | |
88 | int sk_address_is_local(SockAddr addr) |
89 | { |
90 | |
f6fc0010 |
91 | if (stack != NULL) |
92 | return stack->address_is_local(addr); |
93 | return 0; |
deed9e25 |
94 | } |
95 | |
96 | int sk_addrtype(SockAddr addr) |
97 | { |
98 | |
f6fc0010 |
99 | if (stack != NULL) |
100 | return stack->addrtype(addr); |
101 | return 0; |
deed9e25 |
102 | } |
103 | |
104 | void sk_addrcopy(SockAddr addr, char *buf) |
105 | { |
106 | |
f6fc0010 |
107 | if (stack != NULL) |
108 | stack->addrcopy(addr, buf); |
deed9e25 |
109 | } |
110 | |
111 | void sk_addr_free(SockAddr addr) |
112 | { |
113 | |
f6fc0010 |
114 | if (stack != NULL) |
115 | stack->addr_free(addr); |
deed9e25 |
116 | } |
117 | |
118 | Socket sk_register(void *sock, Plug plug) |
119 | { |
120 | |
f6fc0010 |
121 | if (stack != NULL) |
122 | return stack->skregister(sock, plug); |
123 | return NULL; |
deed9e25 |
124 | } |
125 | |
126 | Socket sk_new(SockAddr addr, int port, int privport, int oobinline, |
127 | int nodelay, Plug plug) |
128 | { |
129 | |
f6fc0010 |
130 | if (stack != NULL) |
131 | return stack->new(addr, port, privport, oobinline, nodelay, plug); |
132 | return NULL; |
deed9e25 |
133 | } |
134 | |
135 | Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) |
136 | { |
137 | |
f6fc0010 |
138 | if (stack != NULL) |
139 | return stack->newlistener(srcaddr, port, plug, local_host_only); |
140 | return NULL; |
deed9e25 |
141 | } |
142 | |
143 | char *sk_addr_error(SockAddr addr) |
144 | { |
145 | |
f6fc0010 |
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(); |
deed9e25 |
156 | } |
157 | |
27a3458f |
158 | void sk_cleanup(void) |
159 | { |
160 | |
f6fc0010 |
161 | if (stack != NULL) |
162 | stack->cleanup(); |
27a3458f |
163 | } |
164 | |
deed9e25 |
165 | /* |
166 | * Local Variables: |
167 | * c-file-style: "simon" |
168 | * End: |
169 | */ |
170 | |