mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-03-21 22:28:37 -05:00
A first attempt at listening sockets in Open Transport.
[originally from svn r5385]
This commit is contained in:
parent
ee56a6b48f
commit
54d45f602c
@ -188,7 +188,7 @@ extern void mactcp_addrcopy(SockAddr, char *);
|
|||||||
extern void mactcp_addr_free(SockAddr);
|
extern void mactcp_addr_free(SockAddr);
|
||||||
extern Socket mactcp_register(void *, Plug);
|
extern Socket mactcp_register(void *, Plug);
|
||||||
extern Socket mactcp_new(SockAddr addr, int, int, int, int, int, Plug);
|
extern Socket mactcp_new(SockAddr addr, int, int, int, int, int, Plug);
|
||||||
extern Socket mactcp_newlistener(char *, int, Plug, int);
|
extern Socket mactcp_newlistener(char *, int, Plug, int, int);
|
||||||
extern char *mactcp_addr_error(SockAddr);
|
extern char *mactcp_addr_error(SockAddr);
|
||||||
/* from otnet.c */
|
/* from otnet.c */
|
||||||
extern OSErr ot_init(void);
|
extern OSErr ot_init(void);
|
||||||
@ -204,7 +204,7 @@ extern void ot_addrcopy(SockAddr, char *);
|
|||||||
extern void ot_addr_free(SockAddr);
|
extern void ot_addr_free(SockAddr);
|
||||||
extern Socket ot_register(void *, Plug);
|
extern Socket ot_register(void *, Plug);
|
||||||
extern Socket ot_new(SockAddr addr, int, int, int, int, int, Plug);
|
extern Socket ot_new(SockAddr addr, int, int, int, int, int, Plug);
|
||||||
extern Socket ot_newlistener(char *, int, Plug, int);
|
extern Socket ot_newlistener(char *, int, Plug, int, int);
|
||||||
extern char *ot_addr_error(SockAddr);
|
extern char *ot_addr_error(SockAddr);
|
||||||
/* from macabout.c */
|
/* from macabout.c */
|
||||||
extern void mac_openabout(void);
|
extern void mac_openabout(void);
|
||||||
|
@ -14,7 +14,7 @@ struct macnet_stack {
|
|||||||
void (*addr_free)(SockAddr);
|
void (*addr_free)(SockAddr);
|
||||||
Socket (*skregister)(void *, Plug); /* "register" is a reserved word */
|
Socket (*skregister)(void *, Plug); /* "register" is a reserved word */
|
||||||
Socket (*new)(SockAddr, int, int, int, int, int, Plug);
|
Socket (*new)(SockAddr, int, int, int, int, int, Plug);
|
||||||
Socket (*newlistener)(char *, int, Plug, int);
|
Socket (*newlistener)(char *, int, Plug, int, int);
|
||||||
char *(*addr_error)(SockAddr);
|
char *(*addr_error)(SockAddr);
|
||||||
void (*poll)(void);
|
void (*poll)(void);
|
||||||
void (*cleanup)(void);
|
void (*cleanup)(void);
|
||||||
@ -142,7 +142,7 @@ Socket sk_newlistener(char *srcaddr, int port, Plug plug, int local_host_only, i
|
|||||||
{
|
{
|
||||||
|
|
||||||
if (stack != NULL)
|
if (stack != NULL)
|
||||||
return stack->newlistener(srcaddr, port, plug, local_host_only);
|
return stack->newlistener(srcaddr, port, plug, local_host_only, address_family);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -506,10 +506,10 @@ void *enum_settings_start(void) {
|
|||||||
OSErr error;
|
OSErr error;
|
||||||
struct enum_settings_state *state;
|
struct enum_settings_state *state;
|
||||||
|
|
||||||
state = safemalloc(sizeof(*state));
|
state = snew(struct enum_settings_state);
|
||||||
error = get_session_dir(kDontCreateFolder, &state->vRefNum, &state->dirID);
|
error = get_session_dir(kDontCreateFolder, &state->vRefNum, &state->dirID);
|
||||||
if (error != noErr) {
|
if (error != noErr) {
|
||||||
safefree(state);
|
sfree(state);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
state->index = 1;
|
state->index = 1;
|
||||||
|
@ -523,7 +523,7 @@ Socket mactcp_new(SockAddr addr, int port, int privport, int oobinline,
|
|||||||
}
|
}
|
||||||
|
|
||||||
Socket mactcp_newlistener(char *srcaddr, int port, Plug plug,
|
Socket mactcp_newlistener(char *srcaddr, int port, Plug plug,
|
||||||
int local_host_only)
|
int local_host_only, int address_family)
|
||||||
{
|
{
|
||||||
|
|
||||||
fatalbox("mactcp_newlistener");
|
fatalbox("mactcp_newlistener");
|
||||||
|
107
mac/otnet.c
107
mac/otnet.c
@ -187,6 +187,7 @@ static void *ot_tcp_get_private_ptr(Socket s);
|
|||||||
static void ot_tcp_set_frozen(Socket s, int is_frozen);
|
static void ot_tcp_set_frozen(Socket s, int is_frozen);
|
||||||
static const char *ot_tcp_socket_error(Socket s);
|
static const char *ot_tcp_socket_error(Socket s);
|
||||||
static void ot_recv(Actual_Socket s);
|
static void ot_recv(Actual_Socket s);
|
||||||
|
static void ot_listenaccept(Actual_Socket s);
|
||||||
void ot_poll(void);
|
void ot_poll(void);
|
||||||
|
|
||||||
Socket ot_register(void *sock, Plug plug)
|
Socket ot_register(void *sock, Plug plug)
|
||||||
@ -329,11 +330,79 @@ Socket ot_new(SockAddr addr, int port, int privport, int oobinline,
|
|||||||
return (Socket) ret;
|
return (Socket) ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
Socket ot_newlistener(char *foobar, int port, Plug plug, int local_host_only)
|
Socket ot_newlistener(char *srcaddr, int port, Plug plug, int local_host_only,
|
||||||
|
int address_family)
|
||||||
{
|
{
|
||||||
Actual_Socket s;
|
static struct socket_function_table fn_table = {
|
||||||
|
ot_tcp_plug,
|
||||||
|
ot_tcp_close,
|
||||||
|
ot_tcp_write,
|
||||||
|
ot_tcp_write_oob,
|
||||||
|
ot_tcp_flush,
|
||||||
|
ot_tcp_set_private_ptr,
|
||||||
|
ot_tcp_get_private_ptr,
|
||||||
|
ot_tcp_set_frozen,
|
||||||
|
ot_tcp_socket_error
|
||||||
|
};
|
||||||
|
|
||||||
return (Socket) s;
|
Actual_Socket ret;
|
||||||
|
EndpointRef ep;
|
||||||
|
OSStatus err;
|
||||||
|
InetAddress addr;
|
||||||
|
TBind tbind;
|
||||||
|
|
||||||
|
ret = snew(struct Socket_tag);
|
||||||
|
ret->fn = &fn_table;
|
||||||
|
ret->error = kOTNoError;
|
||||||
|
ret->plug = plug;
|
||||||
|
bufchain_init(&ret->output_data);
|
||||||
|
ret->writable = 0; /* to start with */
|
||||||
|
ret->sending_oob = 0;
|
||||||
|
ret->frozen = 0;
|
||||||
|
ret->frozen_readable = 0;
|
||||||
|
ret->localhost_only = local_host_only;
|
||||||
|
ret->pending_error = 0;
|
||||||
|
ret->oobinline = 0;
|
||||||
|
ret->oobpending = FALSE;
|
||||||
|
ret->listener = 1;
|
||||||
|
|
||||||
|
/* Open Endpoint, configure it for TCP over anything, and load the
|
||||||
|
* tilisten module to serialize multiple simultaneous
|
||||||
|
* connections. */
|
||||||
|
|
||||||
|
ep = OTOpenEndpoint(OTCreateConfiguration("tilisten,tcp"), 0, NULL, &err);
|
||||||
|
|
||||||
|
ret->ep = ep;
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
ret->error = err;
|
||||||
|
return (Socket) ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: set SO_REUSEADDR */
|
||||||
|
|
||||||
|
OTInitInetAddress(&addr, port, kOTAnyInetAddress);
|
||||||
|
/* XXX: pay attention to local_host_only */
|
||||||
|
|
||||||
|
tbind.addr.buf = (UInt8 *) &addr;
|
||||||
|
tbind.addr.len = sizeof(addr);
|
||||||
|
tbind.qlen = 10;
|
||||||
|
|
||||||
|
err = OTBind(ep, &tbind, NULL); /* XXX: check qlen we got */
|
||||||
|
|
||||||
|
if (err) {
|
||||||
|
ret->error = err;
|
||||||
|
return (Socket) ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add this to the list of all sockets */
|
||||||
|
ret->next = ot.socklist;
|
||||||
|
ret->prev = &ot.socklist;
|
||||||
|
if (ret->next != NULL)
|
||||||
|
ret->next->prev = &ret->next;
|
||||||
|
ot.socklist = ret;
|
||||||
|
|
||||||
|
return (Socket) ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ot_tcp_close(Socket sock)
|
static void ot_tcp_close(Socket sock)
|
||||||
@ -461,6 +530,9 @@ void ot_poll(void)
|
|||||||
case T_EXDATA: /* Expedited Data (urgent?) */
|
case T_EXDATA: /* Expedited Data (urgent?) */
|
||||||
ot_recv(s);
|
ot_recv(s);
|
||||||
break;
|
break;
|
||||||
|
case T_LISTEN: /* Connection attempt */
|
||||||
|
ot_listenaccept(s);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -480,7 +552,36 @@ void ot_recv(Actual_Socket s)
|
|||||||
plug_closing(s->plug, NULL, 0, 0); /* XXX Error msg */
|
plug_closing(s->plug, NULL, 0, 0); /* XXX Error msg */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ot_listenaccept(Actual_Socket s)
|
||||||
|
{
|
||||||
|
OTResult o;
|
||||||
|
OSStatus err;
|
||||||
|
InetAddress remoteaddr;
|
||||||
|
TCall tcall;
|
||||||
|
EndpointRef ep;
|
||||||
|
|
||||||
|
tcall.addr.maxlen = sizeof(InetAddress);
|
||||||
|
tcall.addr.buf = (unsigned char *)&remoteaddr;
|
||||||
|
tcall.opt.maxlen = 0;
|
||||||
|
tcall.opt.buf = NULL;
|
||||||
|
tcall.udata.maxlen = 0;
|
||||||
|
tcall.udata.buf = NULL;
|
||||||
|
|
||||||
|
o = OTListen(s->ep, &tcall);
|
||||||
|
|
||||||
|
if (o != kOTNoError)
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* We've found an incoming connection, accept it */
|
||||||
|
|
||||||
|
ep = OTOpenEndpoint(OTCreateConfiguration("tcp"), 0, NULL, &err);
|
||||||
|
o = OTAccept(s->ep, ep, &tcall);
|
||||||
|
if (plug_accepting(s->plug, ep)) {
|
||||||
|
OTUnbind(ep);
|
||||||
|
OTCloseProvider(ep);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local Variables:
|
* Local Variables:
|
||||||
* c-file-style: "simon"
|
* c-file-style: "simon"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user