diff --git a/src/common/libremoteio.h b/src/common/libremoteio.h --- a/src/common/libremoteio.h +++ b/src/common/libremoteio.h @@ -58,6 +58,9 @@ struct remoteio { enum remoteio_method method; struct remoteio_opts *opts; struct execio *execio; +#ifndef WINDOWS + int sock; +#endif }; diff --git a/src/common/remoteio.c b/src/common/remoteio.c --- a/src/common/remoteio.c +++ b/src/common/remoteio.c @@ -25,6 +25,10 @@ #include #include #include +#ifndef WINDOWS +#include +#include +#endif /* local */ @@ -270,8 +274,41 @@ int _remoteio_ssh_close(struct remoteio */ int _remoteio_sock_open(struct remoteio *rem, struct remoteio_server *server) { + int sock; + struct sockaddr_un sockaddr; + /* + The POSIX docs pretty much say that I can't depend on sockpath being able to be longer than + some proprietary length. So, if the compiler specifies a long path for RUNSTATEDIR, it could + cause a buffer overflow. + */ + char *sockpath = RUNSTATEDIR "/distrend.sock"; + unsigned int sockaddr_len; - return 1; + sock = socket(AF_UNIX, SOCK_STREAM, 0); + if(sock == -1) + { + perror("socket"); + return 1; + } + + sockaddr.sun_family = AF_UNIX; + /* + The terminating NULL should not be included in what's copied to sun_path, + although it won't hurt as long as strlen(sockpath) < max socket length + */ + for(sockaddr_len = 0; sockpath[sockaddr_len]; sockaddr_len ++) + sockaddr.sun_path[sockaddr_len] = sockpath[sockaddr_len]; + + if(connect(sock, (struct sockaddr *)&sockaddr, sockaddr_len) == -1) + { + perror("connect"); + close(sock); + return 1; + } + + rem->sock = sock; + + return 0; } int _remoteio_sock_read(struct remoteio *rem, void *buf, size_t len, size_t *bytesread)