mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-01 03:22:48 -05:00
Make Socket and Plug into structs.
I think that means that _every_ one of my traitoids is now a struct containing a vtable pointer as one of its fields (albeit sometimes the only field), and never just a bare pointer.
This commit is contained in:
62
unix/uxnet.c
62
unix/uxnet.c
@ -89,7 +89,7 @@ struct NetSocket {
|
||||
*/
|
||||
NetSocket *parent, *child;
|
||||
|
||||
const SocketVtable *sockvt;
|
||||
Socket sock;
|
||||
};
|
||||
|
||||
struct SockAddr {
|
||||
@ -484,7 +484,7 @@ SockAddr *sk_addr_dup(SockAddr *addr)
|
||||
|
||||
static Plug *sk_net_plug(Socket *sock, Plug *p)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
Plug *ret = s->plug;
|
||||
if (p)
|
||||
s->plug = p;
|
||||
@ -528,7 +528,7 @@ static Socket *sk_net_accept(accept_ctx_t ctx, Plug *plug)
|
||||
* Create NetSocket structure.
|
||||
*/
|
||||
ret = snew(NetSocket);
|
||||
ret->sockvt = &NetSocket_sockvt;
|
||||
ret->sock.vt = &NetSocket_sockvt;
|
||||
ret->error = NULL;
|
||||
ret->plug = plug;
|
||||
bufchain_init(&ret->output_data);
|
||||
@ -549,7 +549,7 @@ static Socket *sk_net_accept(accept_ctx_t ctx, Plug *plug)
|
||||
|
||||
if (ret->s < 0) {
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
ret->oobinline = 0;
|
||||
@ -557,7 +557,7 @@ static Socket *sk_net_accept(accept_ctx_t ctx, Plug *plug)
|
||||
uxsel_tell(ret);
|
||||
add234(sktree, ret);
|
||||
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
static int try_connect(NetSocket *sock)
|
||||
@ -769,7 +769,7 @@ Socket *sk_new(SockAddr *addr, int port, int privport, int oobinline,
|
||||
* Create NetSocket structure.
|
||||
*/
|
||||
ret = snew(NetSocket);
|
||||
ret->sockvt = &NetSocket_sockvt;
|
||||
ret->sock.vt = &NetSocket_sockvt;
|
||||
ret->error = NULL;
|
||||
ret->plug = plug;
|
||||
bufchain_init(&ret->output_data);
|
||||
@ -801,7 +801,7 @@ Socket *sk_new(SockAddr *addr, int port, int privport, int oobinline,
|
||||
if (err)
|
||||
ret->error = strerror(err);
|
||||
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
@ -824,7 +824,7 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
* Create NetSocket structure.
|
||||
*/
|
||||
ret = snew(NetSocket);
|
||||
ret->sockvt = &NetSocket_sockvt;
|
||||
ret->sock.vt = &NetSocket_sockvt;
|
||||
ret->error = NULL;
|
||||
ret->plug = plug;
|
||||
bufchain_init(&ret->output_data);
|
||||
@ -875,7 +875,7 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
|
||||
if (s < 0) {
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
cloexec(s);
|
||||
@ -886,7 +886,7 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
(const char *)&on, sizeof(on)) < 0) {
|
||||
ret->error = strerror(errno);
|
||||
close(s);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
retcode = -1;
|
||||
@ -964,13 +964,13 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
if (retcode < 0) {
|
||||
close(s);
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
if (listen(s, SOMAXCONN) < 0) {
|
||||
close(s);
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
#ifndef NO_IPV6
|
||||
@ -984,7 +984,7 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
other = FROMFIELD(
|
||||
sk_newlistener(srcaddr, port, plug,
|
||||
local_host_only, ADDRTYPE_IPV4),
|
||||
NetSocket, sockvt);
|
||||
NetSocket, sock);
|
||||
|
||||
if (other) {
|
||||
if (!other->error) {
|
||||
@ -995,7 +995,7 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
* as IPv6, we must return an error overall. */
|
||||
close(s);
|
||||
sfree(ret);
|
||||
return &other->sockvt;
|
||||
return &other->sock;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1006,15 +1006,15 @@ Socket *sk_newlistener(const char *srcaddr, int port, Plug *plug,
|
||||
uxsel_tell(ret);
|
||||
add234(sktree, ret);
|
||||
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
static void sk_net_close(Socket *sock)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
|
||||
if (s->child)
|
||||
sk_net_close(&s->child->sockvt);
|
||||
sk_net_close(&s->child->sock);
|
||||
|
||||
del234(sktree, s);
|
||||
if (s->s >= 0) {
|
||||
@ -1038,9 +1038,9 @@ void *sk_getxdmdata(Socket *sock, int *lenp)
|
||||
* We must check that this socket really _is_ a NetSocket before
|
||||
* downcasting it.
|
||||
*/
|
||||
if (*sock != &NetSocket_sockvt)
|
||||
if (sock->vt != &NetSocket_sockvt)
|
||||
return NULL; /* failure */
|
||||
s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
s = FROMFIELD(sock, NetSocket, sock);
|
||||
|
||||
addrlen = sizeof(u);
|
||||
if (getsockname(s->s, &u.sa, &addrlen) < 0)
|
||||
@ -1186,7 +1186,7 @@ void try_send(NetSocket *s)
|
||||
|
||||
static int sk_net_write(Socket *sock, const void *buf, int len)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
|
||||
assert(s->outgoingeof == EOF_NO);
|
||||
|
||||
@ -1212,7 +1212,7 @@ static int sk_net_write(Socket *sock, const void *buf, int len)
|
||||
|
||||
static int sk_net_write_oob(Socket *sock, const void *buf, int len)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
|
||||
assert(s->outgoingeof == EOF_NO);
|
||||
|
||||
@ -1241,7 +1241,7 @@ static int sk_net_write_oob(Socket *sock, const void *buf, int len)
|
||||
|
||||
static void sk_net_write_eof(Socket *sock)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
|
||||
assert(s->outgoingeof == EOF_NO);
|
||||
|
||||
@ -1468,13 +1468,13 @@ const char *sk_addr_error(SockAddr *addr)
|
||||
}
|
||||
static const char *sk_net_socket_error(Socket *sock)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
return s->error;
|
||||
}
|
||||
|
||||
static void sk_net_set_frozen(Socket *sock, int is_frozen)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
if (s->frozen == is_frozen)
|
||||
return;
|
||||
s->frozen = is_frozen;
|
||||
@ -1483,7 +1483,7 @@ static void sk_net_set_frozen(Socket *sock, int is_frozen)
|
||||
|
||||
static char *sk_net_peer_info(Socket *sock)
|
||||
{
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sockvt);
|
||||
NetSocket *s = FROMFIELD(sock, NetSocket, sock);
|
||||
union sockaddr_union addr;
|
||||
socklen_t addrlen = sizeof(addr);
|
||||
#ifndef NO_IPV6
|
||||
@ -1644,7 +1644,7 @@ Socket *new_unix_listener(SockAddr *listenaddr, Plug *plug)
|
||||
* Create NetSocket structure.
|
||||
*/
|
||||
ret = snew(NetSocket);
|
||||
ret->sockvt = &NetSocket_sockvt;
|
||||
ret->sock.vt = &NetSocket_sockvt;
|
||||
ret->error = NULL;
|
||||
ret->plug = plug;
|
||||
bufchain_init(&ret->output_data);
|
||||
@ -1669,7 +1669,7 @@ Socket *new_unix_listener(SockAddr *listenaddr, Plug *plug)
|
||||
s = socket(AF_UNIX, SOCK_STREAM, 0);
|
||||
if (s < 0) {
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
cloexec(s);
|
||||
@ -1692,20 +1692,20 @@ Socket *new_unix_listener(SockAddr *listenaddr, Plug *plug)
|
||||
if (unlink(u.su.sun_path) < 0 && errno != ENOENT) {
|
||||
close(s);
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
retcode = bind(s, &addr->sa, addrlen);
|
||||
if (retcode < 0) {
|
||||
close(s);
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
if (listen(s, SOMAXCONN) < 0) {
|
||||
close(s);
|
||||
ret->error = strerror(errno);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
||||
ret->s = s;
|
||||
@ -1713,5 +1713,5 @@ Socket *new_unix_listener(SockAddr *listenaddr, Plug *plug)
|
||||
uxsel_tell(ret);
|
||||
add234(sktree, ret);
|
||||
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ static void x11_closing(Plug *plug, const char *error_msg, int error_code,
|
||||
time_to_die = TRUE;
|
||||
}
|
||||
struct X11Connection {
|
||||
const PlugVtable *plugvt;
|
||||
Plug plug;
|
||||
};
|
||||
|
||||
char *socketname;
|
||||
@ -809,10 +809,10 @@ void run_agent(void)
|
||||
disp = x11_setup_display(display, conf);
|
||||
|
||||
conn = snew(struct X11Connection);
|
||||
conn->plugvt = &X11Connection_plugvt;
|
||||
conn->plug.vt = &X11Connection_plugvt;
|
||||
s = new_connection(sk_addr_dup(disp->addr),
|
||||
disp->realhost, disp->port,
|
||||
0, 1, 0, 0, &conn->plugvt, conf);
|
||||
0, 1, 0, 0, &conn->plug, conf);
|
||||
if ((err = sk_socket_error(s)) != NULL) {
|
||||
fprintf(stderr, "pageant: unable to connect to X server: %s", err);
|
||||
exit(1);
|
||||
|
@ -29,7 +29,7 @@ typedef struct LocalProxySocket {
|
||||
|
||||
int pending_error;
|
||||
|
||||
const SocketVtable *sockvt;
|
||||
Socket sock;
|
||||
} LocalProxySocket;
|
||||
|
||||
static void localproxy_select_result(int fd, int event);
|
||||
@ -105,7 +105,7 @@ static int localproxy_errfd_find(void *av, void *bv)
|
||||
|
||||
static Plug *sk_localproxy_plug (Socket *s, Plug *p)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
Plug *ret = ps->plug;
|
||||
if (p)
|
||||
ps->plug = p;
|
||||
@ -114,7 +114,7 @@ static Plug *sk_localproxy_plug (Socket *s, Plug *p)
|
||||
|
||||
static void sk_localproxy_close (Socket *s)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
|
||||
if (ps->to_cmd >= 0) {
|
||||
del234(localproxy_by_tofd, ps);
|
||||
@ -202,7 +202,7 @@ static int localproxy_try_send(LocalProxySocket *ps)
|
||||
|
||||
static int sk_localproxy_write (Socket *s, const void *data, int len)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
|
||||
assert(ps->outgoingeof == EOF_NO);
|
||||
|
||||
@ -224,7 +224,7 @@ static int sk_localproxy_write_oob (Socket *s, const void *data, int len)
|
||||
|
||||
static void sk_localproxy_write_eof (Socket *s)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
|
||||
assert(ps->outgoingeof == EOF_NO);
|
||||
ps->outgoingeof = EOF_PENDING;
|
||||
@ -234,13 +234,13 @@ static void sk_localproxy_write_eof (Socket *s)
|
||||
|
||||
static void sk_localproxy_flush (Socket *s)
|
||||
{
|
||||
/* LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt); */
|
||||
/* LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock); */
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
static void sk_localproxy_set_frozen (Socket *s, int is_frozen)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
|
||||
if (ps->from_cmd < 0)
|
||||
return;
|
||||
@ -253,7 +253,7 @@ static void sk_localproxy_set_frozen (Socket *s, int is_frozen)
|
||||
|
||||
static const char * sk_localproxy_socket_error (Socket *s)
|
||||
{
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sockvt);
|
||||
LocalProxySocket *ps = FROMFIELD(s, LocalProxySocket, sock);
|
||||
return ps->error;
|
||||
}
|
||||
|
||||
@ -330,7 +330,7 @@ Socket *platform_new_connection(SockAddr *addr, const char *hostname,
|
||||
return NULL;
|
||||
|
||||
ret = snew(LocalProxySocket);
|
||||
ret->sockvt = &LocalProxySocket_sockvt;
|
||||
ret->sock.vt = &LocalProxySocket_sockvt;
|
||||
ret->plug = plug;
|
||||
ret->error = NULL;
|
||||
ret->outgoingeof = EOF_NO;
|
||||
@ -358,7 +358,7 @@ Socket *platform_new_connection(SockAddr *addr, const char *hostname,
|
||||
pipe(cmd_err_pipe) < 0) {
|
||||
ret->error = dupprintf("pipe: %s", strerror(errno));
|
||||
sfree(cmd);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
cloexec(to_cmd_pipe[1]);
|
||||
cloexec(from_cmd_pipe[0]);
|
||||
@ -369,7 +369,7 @@ Socket *platform_new_connection(SockAddr *addr, const char *hostname,
|
||||
if (pid < 0) {
|
||||
ret->error = dupprintf("fork: %s", strerror(errno));
|
||||
sfree(cmd);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
} else if (pid == 0) {
|
||||
close(0);
|
||||
close(1);
|
||||
@ -399,13 +399,13 @@ Socket *platform_new_connection(SockAddr *addr, const char *hostname,
|
||||
if (ret->to_cmd == -1) {
|
||||
ret->error = dupprintf("/dev/null: %s", strerror(errno));
|
||||
sfree(cmd);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
ret->from_cmd = open(cmd, O_RDONLY);
|
||||
if (ret->from_cmd == -1) {
|
||||
ret->error = dupprintf("%s: %s", cmd, strerror(errno));
|
||||
sfree(cmd);
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
sfree(cmd);
|
||||
ret->cmd_err = -1;
|
||||
@ -430,5 +430,5 @@ Socket *platform_new_connection(SockAddr *addr, const char *hostname,
|
||||
/* We are responsible for this and don't need it any more */
|
||||
sk_addr_free(addr);
|
||||
|
||||
return &ret->sockvt;
|
||||
return &ret->sock;
|
||||
}
|
||||
|
Reference in New Issue
Block a user