From deed9e2553ba99e7cd912c924482ba468cab61a1 Mon Sep 17 00:00:00 2001 From: ben Date: Sat, 11 Jan 2003 19:43:59 +0000 Subject: [PATCH 1/1] Add an indirection layer between mtcpnet.c and the rest of PuTTY so that we can have runtime switching between MacTCP and OpenTransport, and so that we can cope if there's no TCP/IP stack available at all (albeit with very little functionality at present). git-svn-id: svn://svn.tartarus.org/sgt/putty@2546 cda61777-01e9-0310-a592-d414129be87e --- Recipe | 2 +- mac/mac.c | 17 ++++++--- mac/mac.h | 13 +++++++ mac/macnet.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mac/mtcpnet.c | 37 +++++++++--------- 5 files changed, 164 insertions(+), 24 deletions(-) create mode 100644 mac/macnet.c diff --git a/Recipe b/Recipe index 2416af29..deb9681f 100644 --- a/Recipe +++ b/Recipe @@ -111,7 +111,7 @@ SFTP = sftp int64 logging WINMISC = misc version winstore settings tree234 winnet proxy cmdline + windefs winmisc UXMISC = misc version uxstore settings tree234 uxnet proxy cmdline -MACMISC = misc version macstore settings tree234 mtcpnet proxy +MACMISC = misc version macstore settings tree234 macnet mtcpnet proxy # Character set library, for use in pterm. CHARSET = sbcsdat slookup sbcs utf8 toucs fromucs xenc mimeenc macenc diff --git a/mac/mac.c b/mac/mac.c index fe46f3f8..632b6a41 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.23 2003/01/10 18:33:35 simon Exp $ */ +/* $Id: mac.c,v 1.24 2003/01/11 19:43:59 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -169,8 +169,13 @@ static void mac_startup(void) { mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures; DisposeHandle((Handle)ti); } - - mactcp_init(); + /* MacTCP? */ + if (Gestalt(FOUR_CHAR_CODE('mtcp'), &mac_gestalts.mtcpvers) != noErr) + mac_gestalts.mtcpvers = 0; + if (mac_gestalts.mtcpvers > 0) { + if (mactcp_init() != noErr) + mac_gestalts.mtcpvers = 0; + } /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) @@ -225,7 +230,8 @@ static void mac_eventloop(void) { mac_adjustcursor(cursrgn); if (gotevent) mac_event(&event); - mactcp_poll(); + if (mac_gestalts.mtcpvers != 0) + mactcp_poll(); mac_pollterm(); } DisposeRgn(cursrgn); @@ -617,7 +623,8 @@ void cleanup_exit(int status) if (mac_gestalts.encvvers != 0) TerminateUnicodeConverter(); #endif - mactcp_shutdown(); + if (mac_gestalts.mtcpvers != 0) + mactcp_shutdown(); exit(status); } diff --git a/mac/mac.h b/mac/mac.h index 1f684d96..d0db75e7 100644 --- a/mac/mac.h +++ b/mac/mac.h @@ -23,6 +23,7 @@ struct mac_gestalts { long windattr; long encvvers; /* TEC version (from TECGetInfo()) */ long uncvattr; /* Unicode Converter attributes (frem TECGetInfo()) */ + long mtcpvers; }; extern struct mac_gestalts mac_gestalts; @@ -95,6 +96,18 @@ extern void init_ucs(void); extern OSErr mactcp_init(void); extern void mactcp_shutdown(void); extern void mactcp_poll(void); +extern SockAddr mactcp_namelookup(char *, char **); +extern SockAddr mactcp_nonamelookup(char *); +extern void mactcp_getaddr(SockAddr, char *, int); +extern int mactcp_hostname_is_local(char *); +extern int mactcp_address_is_local(SockAddr); +extern int mactcp_addrtype(SockAddr); +extern void mactcp_addrcopy(SockAddr, char *); +extern void mactcp_addr_free(SockAddr); +extern Socket mactcp_register(void *, Plug); +extern Socket mactcp_new(SockAddr addr, int, int, int, int, Plug); +extern Socket mactcp_newlistener(char *, int, Plug, int); +extern char *mactcp_addr_error(SockAddr); #endif diff --git a/mac/macnet.c b/mac/macnet.c new file mode 100644 index 00000000..88a5cab4 --- /dev/null +++ b/mac/macnet.c @@ -0,0 +1,119 @@ +#include "putty.h" +#include "network.h" +#include "mac.h" + +/* + * Network functions exported to the world. These choose whether to call + * MacTCP or OpenTransport and behave accordingly. + */ +SockAddr sk_namelookup(char *host, char **canonicalname) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_namelookup(host, canonicalname); + else + return NULL; +} + +SockAddr sk_nonamelookup(char *host) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_nonamelookup(host); + else + return NULL; +} + +void sk_getaddr(SockAddr addr, char *buf, int buflen) +{ + + if (mac_gestalts.mtcpvers != 0) + mactcp_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; +} + +int sk_address_is_local(SockAddr addr) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_address_is_local(addr); + else + return 0; +} + +int sk_addrtype(SockAddr addr) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_addrtype(addr); + else + return 0; +} + +void sk_addrcopy(SockAddr addr, char *buf) +{ + + if (mac_gestalts.mtcpvers != 0) + mactcp_addrcopy(addr, buf); +} + +void sk_addr_free(SockAddr addr) +{ + + if (mac_gestalts.mtcpvers != 0) + mactcp_addr_free(addr); +} + +Socket sk_register(void *sock, Plug plug) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_register(sock, plug); + else + return NULL; +} + +Socket sk_new(SockAddr addr, int port, int privport, int oobinline, + int nodelay, Plug plug) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_new(addr, port, privport, oobinline, nodelay, plug); + else + return NULL; +} + +Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_newlistener(srcaddr, port, plug, local_host_only); + else + return NULL; +} + +char *sk_addr_error(SockAddr addr) +{ + + if (mac_gestalts.mtcpvers != 0) + return mactcp_addr_error(addr); + else + return "No TCP/IP stack installed"; +} + +/* + * Local Variables: + * c-file-style: "simon" + * End: + */ + diff --git a/mac/mtcpnet.c b/mac/mtcpnet.c index 54ca10ca..91b402dd 100644 --- a/mac/mtcpnet.c +++ b/mac/mtcpnet.c @@ -270,7 +270,7 @@ void mactcp_shutdown(void) static ResultUPP mactcp_lookupdone_upp; -SockAddr sk_namelookup(char *host, char **canonicalname) +SockAddr mactcp_namelookup(char *host, char **canonicalname) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); OSErr err; @@ -308,7 +308,7 @@ static pascal void mactcp_lookupdone(struct hostInfo *hi, char *cookie) *donep = TRUE; } -SockAddr sk_nonamelookup(char *host) +SockAddr mactcp_nonamelookup(char *host) { SockAddr ret = smalloc(sizeof(struct SockAddr_tag)); @@ -319,7 +319,7 @@ SockAddr sk_nonamelookup(char *host) return ret; } -void sk_getaddr(SockAddr addr, char *buf, int buflen) +void mactcp_getaddr(SockAddr addr, char *buf, int buflen) { char mybuf[16]; OSErr err; @@ -338,13 +338,13 @@ void sk_getaddr(SockAddr addr, char *buf, int buflen) /* I think "local" here really means "loopback" */ -int sk_hostname_is_local(char *name) +int mactcp_hostname_is_local(char *name) { return !strcmp(name, "localhost"); } -int sk_address_is_local(SockAddr addr) +int mactcp_address_is_local(SockAddr addr) { int i; @@ -355,7 +355,7 @@ int sk_address_is_local(SockAddr addr) return FALSE; } -int sk_addrtype(SockAddr addr) +int mactcp_addrtype(SockAddr addr) { if (addr->resolved) @@ -363,14 +363,14 @@ int sk_addrtype(SockAddr addr) return ADDRTYPE_NAME; } -void sk_addrcopy(SockAddr addr, char *buf) +void mactcp_addrcopy(SockAddr addr, char *buf) { /* XXX only return first address */ memcpy(buf, &addr->hostinfo.addr[0], 4); } -void sk_addr_free(SockAddr addr) +void mactcp_addr_free(SockAddr addr) { sfree(addr); @@ -389,18 +389,18 @@ static Plug mactcp_plug(Socket sock, Plug p) static void mactcp_flush(Socket s) { - fatalbox("sk_tcp_flush"); + fatalbox("mactcp_flush"); } -Socket sk_register(void *sock, Plug plug) +Socket mactcp_register(void *sock, Plug plug) { - fatalbox("sk_register"); + fatalbox("mactcp_register"); } static TCPNotifyUPP mactcp_asr_upp; -Socket sk_new(SockAddr addr, int port, int privport, int oobinline, +Socket mactcp_new(SockAddr addr, int port, int privport, int oobinline, int nodelay, Plug plug) { static struct socket_function_table fn_table = { @@ -510,10 +510,11 @@ Socket sk_new(SockAddr addr, int port, int privport, int oobinline, return (Socket)ret; } -Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only) +Socket mactcp_newlistener(char *srcaddr, int port, Plug plug, + int local_host_only) { - fatalbox("sk_newlistener"); + fatalbox("mactcp_newlistener"); } static void mactcp_close(Socket sock) @@ -674,11 +675,11 @@ static void *mactcp_get_private_ptr(Socket sock) } /* - * Special error values are returned from sk_namelookup and sk_new - * if there's a problem. These functions extract an error message, - * or return NULL if there's no problem. + * Special error values are returned from mactcp_namelookup and + * mactcp_new if there's a problem. These functions extract an error + * message, or return NULL if there's no problem. */ -char *sk_addr_error(SockAddr addr) +char *mactcp_addr_error(SockAddr addr) { static char buf[64]; -- 2.11.0