mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-10 09:58:01 +00:00
20f433efac
No very good reason, but I've occasionally wanted to frob it to see if it makes any difference to problems I'm having, and it was easy. Tested that it does actually cause keepalives on Windows (with tcpdump); should also work on Unix. Not implemented on Mac (does nothing), but then neither is TCP_NODELAY. Quite a big checkin, much of which is adding `keepalive' alongside `nodelay' in network function calls. [originally from svn r4309]
184 lines
3.5 KiB
C
184 lines
3.5 KiB
C
#include "putty.h"
|
|
#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 const *host, char **canonicalname)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->namelookup(host, canonicalname);
|
|
return NULL;
|
|
}
|
|
|
|
SockAddr sk_nonamelookup(char const *host)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->nonamelookup(host);
|
|
return NULL;
|
|
}
|
|
|
|
void sk_getaddr(SockAddr addr, char *buf, int buflen)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
stack->getaddr(addr, buf, buflen);
|
|
else
|
|
*buf = '\0';
|
|
}
|
|
|
|
int sk_hostname_is_local(char *name)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->hostname_is_local(name);
|
|
return 0;
|
|
}
|
|
|
|
int sk_address_is_local(SockAddr addr)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->address_is_local(addr);
|
|
return 0;
|
|
}
|
|
|
|
int sk_addrtype(SockAddr addr)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->addrtype(addr);
|
|
return 0;
|
|
}
|
|
|
|
void sk_addrcopy(SockAddr addr, char *buf)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
stack->addrcopy(addr, buf);
|
|
}
|
|
|
|
void sk_addr_free(SockAddr addr)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
stack->addr_free(addr);
|
|
}
|
|
|
|
Socket sk_register(void *sock, Plug plug)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->skregister(sock, plug);
|
|
return NULL;
|
|
}
|
|
|
|
Socket sk_new(SockAddr addr, int port, int privport, int oobinline,
|
|
int nodelay, int keepalive, Plug plug)
|
|
{
|
|
|
|
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)
|
|
{
|
|
|
|
if (stack != NULL)
|
|
return stack->newlistener(srcaddr, port, plug, local_host_only);
|
|
return NULL;
|
|
}
|
|
|
|
const char *sk_addr_error(SockAddr addr)
|
|
{
|
|
|
|
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"
|
|
* End:
|
|
*/
|
|
|