X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/deed9e2553ba99e7cd912c924482ba468cab61a1..055817455466c8eb60392f30bb7c689763962e17:/mac/macnet.c diff --git a/mac/macnet.c b/mac/macnet.c index 88a5cab4..63d0cc42 100644 --- a/mac/macnet.c +++ b/mac/macnet.c @@ -2,33 +2,81 @@ #include "network.h" #include "mac.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); + 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) +{ + +#if 0 + 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'; } @@ -36,81 +84,97 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen) 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); + 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; +} + + /* * Local Variables: * c-file-style: "simon"