X-Git-Url: https://www.tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Ftincctl.c;h=784c6a94759abe3e8b3a3c9e1303729f163c450b;hb=c388527e341658dc915dd67c90bbc9b52b8539c0;hp=f98547ba70aa9e248887be1c397262c2629b387f;hpb=108b238915c5f58b3d94ab433dc5d04e064c2b11;p=tinc diff --git a/src/tincctl.c b/src/tincctl.c index f98547ba..784c6a94 100644 --- a/src/tincctl.c +++ b/src/tincctl.c @@ -19,13 +19,13 @@ #include "system.h" -#include #include #include "xalloc.h" #include "protocol.h" #include "control_common.h" #include "rsagen.h" +#include "utils.h" /* The name this program was run with. */ char *program_name = NULL; @@ -47,6 +47,10 @@ static char *controlsocketname = NULL; /* pid file location */ char *netname = NULL; char *confbase = NULL; +#ifdef HAVE_MINGW +static struct WSAData wsa_state; +#endif + static struct option const long_options[] = { {"config", required_argument, NULL, 'c'}, {"net", required_argument, NULL, 'n'}, @@ -261,8 +265,6 @@ static void make_names(void) { #ifdef HAVE_MINGW if(!RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\tinc", 0, KEY_READ, &key)) { if(!RegQueryValueEx(key, NULL, 0, 0, installdir, &len)) { - if(!logfilename) - xasprintf(&logfilename, "%s/log/%s.log", identname); if(!confbase) { if(netname) xasprintf(&confbase, "%s/%s", installdir, netname); @@ -294,13 +296,17 @@ static int fullread(int fd, void *data, size_t datalen) { int rv, len = 0; while(len < datalen) { - rv = read(fd, data + len, datalen - len); + rv = recv(fd, data + len, datalen - len, 0); if(rv == -1 && errno == EINTR) continue; else if(rv == -1) return rv; else if(rv == 0) { +#ifdef HAVE_MINGW + errno = 0; +#else errno = ENODATA; +#endif return -1; } len += rv; @@ -317,23 +323,29 @@ static int send_ctl_request(int fd, enum request_type type, size_t *indatalen_p) { tinc_ctl_request_t req; int rv; + void *indata; + + memset(&req, 0, sizeof req); + req.length = sizeof req + outdatalen; + req.type = type; + req.res_errno = 0; + +#ifdef HAVE_MINGW + if(send(fd, (void *)&req, sizeof req, 0) != sizeof req || send(fd, outdata, outdatalen, 0) != outdatalen) + return -1; +#else struct iovec vector[2] = { {&req, sizeof req}, {(void*) outdata, outdatalen} }; - void *indata; if(res_errno_p == NULL) return -1; - memset(&req, 0, sizeof req); - req.length = sizeof req + outdatalen; - req.type = type; - req.res_errno = 0; - while((rv = writev(fd, vector, 2)) == -1 && errno == EINTR) ; if(rv != req.length) return -1; +#endif if(fullread(fd, &req, sizeof req) == -1) return -1; @@ -394,7 +406,6 @@ static int send_ctl_request_cooked(int fd, enum request_type type, void const *o } int main(int argc, char *argv[], char *envp[]) { - struct sockaddr_un addr; tinc_ctl_greeting_t greeting; int fd; int result; @@ -449,6 +460,31 @@ int main(int argc, char *argv[], char *envp[]) { * ancestors are writable only by trusted users, which we don't verify. */ +#ifdef HAVE_MINGW + if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) { + fprintf(stderr, "System call `%s' failed: %s", "WSAStartup", winerror(GetLastError())); + return 1; + } + + struct sockaddr_in addr; + memset(&addr, 0, sizeof addr); + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = htonl(0x7f000001); + addr.sin_port = htons(55555); + + fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if(fd < 0) { + fprintf(stderr, "Cannot create TCP socket: %s\n", sockstrerror(sockerrno)); + return 1; + } + + unsigned long arg = 0; + + if(ioctlsocket(fd, FIONBIO, &arg) != 0) { + fprintf(stderr, "ioctlsocket failed: %s", sockstrerror(sockerrno)); + } +#else + struct sockaddr_un addr; struct stat statbuf; char *lastslash = strrchr(controlsocketname, '/'); if(lastslash != NULL) { @@ -483,15 +519,17 @@ int main(int argc, char *argv[], char *envp[]) { memset(&addr, 0, sizeof addr); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, controlsocketname, sizeof addr.sun_path - 1); +#endif if(connect(fd, (struct sockaddr *)&addr, sizeof addr) < 0) { - fprintf(stderr, "Cannot connect to %s: %s\n", controlsocketname, strerror(errno)); + + fprintf(stderr, "Cannot connect to %s: %s\n", controlsocketname, sockstrerror(sockerrno)); return 1; } if(fullread(fd, &greeting, sizeof greeting) == -1) { fprintf(stderr, "Cannot read greeting from control socket: %s\n", - strerror(errno)); + sockstrerror(sockerrno)); return 1; }