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];