#include "putty.h"
#include "network.h"
#include "mac.h"
+#include "ssh.h"
+
+struct macnet_stack {
+ SockAddr (*namelookup)(char const *, char **);
+ SockAddr (*nonamelookup)(char const *);
+ void (*getaddr)(SockAddr, char *, int);
+ int (*hostname_is_local)(char *);
+ int (*address_is_local)(SockAddr);
+ int (*addrtype)(SockAddr);
+ void (*addrcopy)(SockAddr, char *);
+ void (*addr_free)(SockAddr);
+ Socket (*skregister)(void *, Plug); /* "register" is a reserved word */
+ Socket (*new)(SockAddr, int, int, int, int, int, Plug);
+ Socket (*newlistener)(char *, int, Plug, int, int);
+ char *(*addr_error)(SockAddr);
+ void (*poll)(void);
+ void (*cleanup)(void);
+};
+
+static struct macnet_stack *stack;
+
+static struct macnet_stack ot = {
+ ot_namelookup, ot_nonamelookup, ot_getaddr, ot_hostname_is_local,
+ ot_address_is_local, ot_addrtype, ot_addrcopy, ot_addr_free,
+ ot_register, ot_new, ot_newlistener, ot_addr_error, ot_poll, ot_cleanup
+};
+
+#if !TARGET_API_MAC_CARBON
+static struct macnet_stack mactcp = {
+ mactcp_namelookup, mactcp_nonamelookup, mactcp_getaddr,
+ mactcp_hostname_is_local, mactcp_address_is_local, mactcp_addrtype,
+ mactcp_addrcopy, mactcp_addr_free, mactcp_register, mactcp_new,
+ mactcp_newlistener, mactcp_addr_error, mactcp_poll, mactcp_cleanup
+};
+#endif
+
+void sk_init(void)
+{
+
+#ifndef NO_OT
+ if (ot_init() == noErr)
+ stack = &ot;
+ else
+#endif
+#if !TARGET_API_MAC_CARBON
+ if (mactcp_init() == noErr)
+ stack = &mactcp;
+ else
+#endif
+ stack = NULL;
+}
/*
* Network functions exported to the world. These choose whether to call
* MacTCP or OpenTransport and behave accordingly.
*/
-SockAddr sk_namelookup(char *host, char **canonicalname)
+SockAddr sk_namelookup(char const *host, char **canonicalname, int address_family)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_namelookup(host, canonicalname);
- else
- return NULL;
+ if (stack != NULL)
+ return stack->namelookup(host, canonicalname);
+ return NULL;
}
-SockAddr sk_nonamelookup(char *host)
+SockAddr sk_nonamelookup(char const *host)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_nonamelookup(host);
- else
- return NULL;
+ if (stack != NULL)
+ return stack->nonamelookup(host);
+ return NULL;
}
void sk_getaddr(SockAddr addr, char *buf, int buflen)
{
- if (mac_gestalts.mtcpvers != 0)
- mactcp_getaddr(addr, buf, buflen);
+ if (stack != NULL)
+ stack->getaddr(addr, buf, buflen);
else
*buf = '\0';
}
int sk_hostname_is_local(char *name)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_hostname_is_local(name);
- else
- return 0;
+ if (stack != NULL)
+ return stack->hostname_is_local(name);
+ return 0;
}
int sk_address_is_local(SockAddr addr)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_address_is_local(addr);
- else
- return 0;
+ if (stack != NULL)
+ return stack->address_is_local(addr);
+ return 0;
}
int sk_addrtype(SockAddr addr)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_addrtype(addr);
- else
- return 0;
+ if (stack != NULL)
+ return stack->addrtype(addr);
+ return 0;
}
void sk_addrcopy(SockAddr addr, char *buf)
{
- if (mac_gestalts.mtcpvers != 0)
- mactcp_addrcopy(addr, buf);
+ if (stack != NULL)
+ stack->addrcopy(addr, buf);
}
void sk_addr_free(SockAddr addr)
{
- if (mac_gestalts.mtcpvers != 0)
- mactcp_addr_free(addr);
+ if (stack != NULL)
+ stack->addr_free(addr);
}
Socket sk_register(void *sock, Plug plug)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_register(sock, plug);
- else
- return NULL;
+ if (stack != NULL)
+ return stack->skregister(sock, plug);
+ return NULL;
}
Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
- int nodelay, Plug plug)
+ int nodelay, int keepalive, Plug plug)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_new(addr, port, privport, oobinline, nodelay, plug);
- else
- return NULL;
+ if (stack != NULL)
+ return stack->new(addr, port, privport, oobinline, nodelay, keepalive,
+ plug);
+ return NULL;
}
-Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only)
+Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, int address_family)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_newlistener(srcaddr, port, plug, local_host_only);
- else
- return NULL;
+ if (stack != NULL)
+ return stack->newlistener(srcaddr, port, plug, local_host_only, address_family);
+ return NULL;
}
-char *sk_addr_error(SockAddr addr)
+const char *sk_addr_error(SockAddr addr)
{
- if (mac_gestalts.mtcpvers != 0)
- return mactcp_addr_error(addr);
- else
- return "No TCP/IP stack installed";
+ if (stack != NULL)
+ return stack->addr_error(addr);
+ return "No TCP/IP stack installed";
+}
+
+void sk_poll(void)
+{
+
+ if (stack != NULL)
+ stack->poll();
+}
+
+void sk_cleanup(void)
+{
+
+ if (stack != NULL)
+ stack->cleanup();
+}
+
+/* We should use Internet Config here. */
+int net_service_lookup(char *service)
+{
+
+ return 0;
+}
+
+SockAddr platform_get_x11_unix_address(const char *display, int displaynum,
+ char **canonicalname)
+{
+ return NULL;
}
/*