1
0
mirror of https://git.tartarus.org/simon/putty.git synced 2025-04-13 09:08:06 -05:00

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).

[originally from svn r2546]
This commit is contained in:
Ben Harris 2003-01-11 19:43:59 +00:00
parent 2506a26ab4
commit 4818639014
5 changed files with 164 additions and 24 deletions

2
Recipe
View File

@ -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

View File

@ -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);
}

View File

@ -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

119
mac/macnet.c Normal file
View File

@ -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:
*/

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