]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - mac/macnet.c
Integrate unfix.org's IPv6 patches up to level 10, with rather a lot
[PuTTY.git] / 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, 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 #if !TARGET_API_MAC_CARBON
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 };
37 #endif
38
39 void sk_init(void)
40 {
41
42 #if 0
43     if (ot_init() == noErr)
44         stack = &ot;
45     else
46 #endif
47 #if !TARGET_API_MAC_CARBON
48     if (mactcp_init() == noErr)
49         stack = &mactcp;
50     else
51 #endif
52         stack = NULL;
53 }
54
55 /*
56  * Network functions exported to the world.  These choose whether to call
57  * MacTCP or OpenTransport and behave accordingly.
58  */
59 SockAddr sk_namelookup(char const *host, char **canonicalname, int address_family)
60 {
61
62     if (stack != NULL)
63         return stack->namelookup(host, canonicalname);
64     return NULL;
65 }
66
67 SockAddr sk_nonamelookup(char const *host)
68 {
69
70     if (stack != NULL)
71         return stack->nonamelookup(host);
72     return NULL;
73 }
74
75 void sk_getaddr(SockAddr addr, char *buf, int buflen)
76 {
77
78     if (stack != NULL)
79         stack->getaddr(addr, buf, buflen);
80     else
81         *buf = '\0';
82 }
83
84 int sk_hostname_is_local(char *name)
85 {
86
87     if (stack != NULL)
88         return stack->hostname_is_local(name);
89     return 0;
90 }
91
92 int sk_address_is_local(SockAddr addr)
93 {
94
95     if (stack != NULL)
96         return stack->address_is_local(addr);
97     return 0;
98 }
99
100 int sk_addrtype(SockAddr addr)
101 {
102
103     if (stack != NULL)
104         return stack->addrtype(addr);
105     return 0;
106 }
107
108 void sk_addrcopy(SockAddr addr, char *buf)
109 {
110
111     if (stack != NULL)
112         stack->addrcopy(addr, buf);
113 }
114
115 void sk_addr_free(SockAddr addr)
116 {
117
118     if (stack != NULL)
119         stack->addr_free(addr);
120 }
121
122 Socket sk_register(void *sock, Plug plug)
123 {
124
125     if (stack != NULL)
126         return stack->skregister(sock, plug);
127     return NULL;
128 }
129
130 Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
131               int nodelay, int keepalive, Plug plug)
132 {
133
134     if (stack != NULL)
135         return stack->new(addr, port, privport, oobinline, nodelay, keepalive,
136                           plug);
137     return NULL;
138 }
139
140 Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, int address_family)
141 {
142
143     if (stack != NULL)
144         return stack->newlistener(srcaddr, port, plug, local_host_only);
145     return NULL;
146 }
147
148 const char *sk_addr_error(SockAddr addr)
149 {
150
151     if (stack != NULL)
152         return stack->addr_error(addr);
153     return "No TCP/IP stack installed";
154 }
155
156 void sk_poll(void)
157 {
158
159     if (stack != NULL)
160         stack->poll();
161 }
162
163 void sk_cleanup(void)
164 {
165
166     if (stack != NULL)
167         stack->cleanup();
168 }
169
170 /* We should use Internet Config here. */
171 int net_service_lookup(char *service)
172 {
173
174     return 0;
175 }
176
177
178 /*
179  * Local Variables:
180  * c-file-style: "simon"
181  * End:
182  */
183