#include "version.h"
#include "subnet.h"
#include "keys.h"
+#include "random.h"
#ifndef MSG_NOSIGNAL
#define MSG_NOSIGNAL 0
}
}
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
if(filename[0] != '\\' && filename[0] != '/' && !strchr(filename, ':')) {
#else
// wait for tincd to close the connection...
}
- close(fd);
+ closesocket(fd);
pid = 0;
fd = -1;
return true;
}
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
static bool remove_service(void) {
SC_HANDLE manager = NULL;
SC_HANDLE service = NULL;
if(select(fd + 1, &r, NULL, NULL, &tv)) {
fprintf(stderr, "Previous connection to tincd lost, reconnecting.\n");
- close(fd);
+ closesocket(fd);
fd = -1;
} else {
return true;
fclose(f);
-#ifndef HAVE_MINGW
+#ifndef HAVE_WINDOWS
if((pid == 0) || (kill(pid, 0) && (errno == ESRCH))) {
fprintf(stderr, "Could not find tincd running at pid %d\n", pid);
fprintf(stderr, "Cannot connect to UNIX socket %s: %s\n", unixsocketname, sockstrerror(sockerrno));
}
- close(fd);
+ closesocket(fd);
fd = -1;
return false;
}
fprintf(stderr, "Cannot connect to %s port %s: %s\n", host, port, sockstrerror(sockerrno));
}
- close(fd);
+ closesocket(fd);
fd = -1;
return false;
}
fprintf(stderr, "Cannot read greeting from control socket: %s\n", sockstrerror(sockerrno));
}
- close(fd);
+ closesocket(fd);
fd = -1;
return false;
}
fprintf(stderr, "Could not fully establish control socket connection\n");
}
- close(fd);
+ closesocket(fd);
fd = -1;
return false;
}
char *c;
char *slash = strrchr(program_name, '/');
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
if((c = strrchr(program_name, '\\')) > slash) {
slash = c;
char **nargv = xzalloc((optind + argc) * sizeof(*nargv));
char *arg0 = c;
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
/*
Windows has no real concept of an "argv array". A command line is just one string.
The CRT of the new process will decode the command line string to generate argv before calling main(), and (by convention)
nargv[nargc++] = argv[i];
}
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
int status = spawnvp(_P_WAIT, c, nargv);
free(nargv);
return 1;
}
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
return remove_service() ? EXIT_SUCCESS : EXIT_FAILURE;
#else
signal(SIGINT, SIG_DFL);
#endif
- close(fd);
+ closesocket(fd);
fd = -1;
return 0;
}
}
// Replace the configuration file with the new one
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
if(remove(filename)) {
fprintf(stderr, "Error replacing file %s: %s\n", filename, strerror(errno));
check_port(name);
-#ifndef HAVE_MINGW
+#ifndef HAVE_WINDOWS
char filename[PATH_MAX];
snprintf(filename, sizeof(filename), "%s" SLASH "tinc-up", confbase);
}
char *command;
-#ifndef HAVE_MINGW
+#ifndef HAVE_WINDOWS
const char *editor = getenv("VISUAL");
if(!editor) {
}
if(fd >= 0) {
- close(fd);
+ closesocket(fd);
fd = -1;
}
free_names();
}
+static int run_command(int argc, char *argv[]) {
+ if(optind >= argc) {
+ return cmd_shell(argc, argv);
+ }
+
+ for(int i = 0; commands[i].command; i++) {
+ if(!strcasecmp(argv[optind], commands[i].command)) {
+ return commands[i].function(argc - optind, argv + optind);
+ }
+ }
+
+ fprintf(stderr, "Unknown command `%s'.\n", argv[optind]);
+ usage(true);
+ return 1;
+}
+
int main(int argc, char *argv[]) {
program_name = argv[0];
orig_argv = argv;
return 0;
}
-#ifdef HAVE_MINGW
+#ifdef HAVE_WINDOWS
static struct WSAData wsa_state;
if(WSAStartup(MAKEWORD(2, 2), &wsa_state)) {
#endif
gettimeofday(&now, NULL);
+ random_init();
crypto_init();
prng_init();
- if(optind >= argc) {
- return cmd_shell(argc, argv);
- }
+ int result = run_command(argc, argv);
- for(int i = 0; commands[i].command; i++) {
- if(!strcasecmp(argv[optind], commands[i].command)) {
- return commands[i].function(argc - optind, argv + optind);
- }
- }
+ random_exit();
- fprintf(stderr, "Unknown command `%s'.\n", argv[optind]);
- usage(true);
- return 1;
+ return result;
}