Add an indirection layer between mtcpnet.c and the rest of PuTTY so that
authorben <ben@cda61777-01e9-0310-a592-d414129be87e>
Sat, 11 Jan 2003 19:43:59 +0000 (19:43 +0000)
committerben <ben@cda61777-01e9-0310-a592-d414129be87e>
Sat, 11 Jan 2003 19:43:59 +0000 (19:43 +0000)
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
mac/mac.c
mac/mac.h
mac/macnet.c [new file with mode: 0644]
mac/mtcpnet.c

diff --git a/Recipe b/Recipe
index 2416af2..deb9681 100644 (file)
--- 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
index fe46f3f..632b6a4 100644 (file)
--- 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);
 }
 
index 1f684d9..d0db75e 100644 (file)
--- 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 (file)
index 0000000..88a5cab
--- /dev/null
@@ -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:
+ */
+
index 54ca10c..91b402d 100644 (file)
@@ -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];