#include "top.h"
/* The name this program was run with. */
-char *program_name = NULL;
+static char *program_name = NULL;
/* If nonzero, display usage information and exit. */
-bool show_help = false;
+static bool show_help = false;
/* If nonzero, print the version on standard output and exit. */
-bool show_version = false;
-
-/* If nonzero, it will attempt to kill a running tincd and exit. */
-int kill_tincd = 0;
-
-/* If nonzero, generate public/private keypair for this host/net. */
-int generate_keys = 0;
+static bool show_version = false;
static char *name = NULL;
static char *identname = NULL; /* program name for syslog */
-static char *controlcookiename = NULL; /* cookie file location */
+static char *pidfilename = NULL; /* pid file location */
static char controlcookie[1024];
char *netname = NULL;
char *confbase = NULL;
{"net", required_argument, NULL, 'n'},
{"help", no_argument, NULL, 1},
{"version", no_argument, NULL, 2},
- {"controlcookie", required_argument, NULL, 5},
+ {"pidfile", required_argument, NULL, 5},
{NULL, 0, NULL, 0}
};
else {
printf("Usage: %s [options] command\n\n", program_name);
printf("Valid options are:\n"
- " -c, --config=DIR Read configuration options from DIR.\n"
- " -n, --net=NETNAME Connect to net NETNAME.\n"
- " --controlcookie=FILENAME Read control socket from FILENAME.\n"
- " --help Display this help and exit.\n"
- " --version Output version information and exit.\n"
+ " -c, --config=DIR Read configuration options from DIR.\n"
+ " -n, --net=NETNAME Connect to net NETNAME.\n"
+ " --pidfile=FILENAME Read control cookie from FILENAME.\n"
+ " --help Display this help and exit.\n"
+ " --version Output version information and exit.\n"
"\n"
"Valid commands are:\n"
" start Start tincd.\n"
break;
case 5: /* open control socket here */
- controlcookiename = xstrdup(optarg);
+ pidfilename = xstrdup(optarg);
break;
case '?':
char *directory;
char buf[PATH_MAX];
char buf2[PATH_MAX];
- size_t len;
/* Check stdin and stdout */
if(isatty(0) && isatty(1)) {
what, filename);
fflush(stdout);
- if(fgets(buf, sizeof buf, stdin) < 0) {
+ if(fgets(buf, sizeof buf, stdin) == NULL) {
fprintf(stderr, "Error while reading stdin: %s\n",
strerror(errno));
return NULL;
}
- len = strlen(buf);
+ size_t len = strlen(buf);
if(len)
buf[--len] = 0;
xasprintf(&confbase, "%s", installdir);
}
}
- if(!controlcookiename)
- xasprintf(&controlcookiename, "%s/cookie", confbase);
+ if(!pidfilename)
+ xasprintf(&pidfilename, "%s/pid", confbase);
RegCloseKey(key);
if(*installdir)
return;
}
#endif
- if(!controlcookiename)
- xasprintf(&controlcookiename, "%s/run/%s.cookie", LOCALSTATEDIR, identname);
+ if(!pidfilename)
+ xasprintf(&pidfilename, "%s/run/%s.pid", LOCALSTATEDIR, identname);
if(netname) {
if(!confbase)
int main(int argc, char *argv[], char *envp[]) {
int fd;
int result;
- int port;
+ char host[128];
+ char port[128];
int pid;
program_name = argv[0];
* ancestors are writable only by trusted users, which we don't verify.
*/
- FILE *f = fopen(controlcookiename, "r");
+ FILE *f = fopen(pidfilename, "r");
if(!f) {
- fprintf(stderr, "Could not open control socket cookie file %s: %s\n", controlcookiename, strerror(errno));
+ fprintf(stderr, "Could not open pid file %s: %s\n", pidfilename, strerror(errno));
return 1;
}
- if(fscanf(f, "%1024s %d %d", controlcookie, &port, &pid) != 3) {
- fprintf(stderr, "Could not parse control socket cookie file %s\n", controlcookiename);
+ if(fscanf(f, "%20d %1024s %128s port %128s", &pid, controlcookie, host, port) != 4) {
+ fprintf(stderr, "Could not parse pid file %s\n", pidfilename);
return 1;
}
}
#endif
- 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(port);
+ struct addrinfo hints = {
+ .ai_family = AF_UNSPEC,
+ .ai_socktype = SOCK_STREAM,
+ .ai_protocol = IPPROTO_TCP,
+ .ai_flags = 0,
+ };
+
+ struct addrinfo *res = NULL;
- fd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
+ if(getaddrinfo(host, port, &hints, &res) || !res) {
+ fprintf(stderr, "Cannot resolve %s port %s: %s", host ?: "localhost", port, strerror(errno));
+ return 1;
+ }
+
+ fd = socket(res->ai_family, SOCK_STREAM, IPPROTO_TCP);
if(fd < 0) {
fprintf(stderr, "Cannot create TCP socket: %s\n", sockstrerror(sockerrno));
return 1;
}
#endif
- if(connect(fd, (struct sockaddr *)&addr, sizeof addr) < 0) {
-
- fprintf(stderr, "Cannot connect to %s: %s\n", controlcookiename, sockstrerror(sockerrno));
+ if(connect(fd, res->ai_addr, res->ai_addrlen) < 0) {
+ fprintf(stderr, "Cannot connect to %s port %s: %s\n", host ?: "localhost", port, sockstrerror(sockerrno));
return 1;
}
+ freeaddrinfo(res);
+
char line[4096];
char data[4096];
int code, version, req;