/* If nonzero, print the version on standard output and exit. */
static bool show_version = false;
/* If nonzero, print the version on standard output and exit. */
static bool show_version = false;
-/* If nonzero, it will attempt to kill a running tincd and exit. */
-static int kill_tincd = 0;
-
-/* If nonzero, generate public/private keypair for this host/net. */
-static int generate_keys = 0;
-
{"net", required_argument, NULL, 'n'},
{"help", no_argument, NULL, 1},
{"version", no_argument, NULL, 2},
{"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},
else {
printf("Usage: %s [options] command\n\n", program_name);
printf("Valid options are:\n"
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"
- if(!controlcookiename)
- xasprintf(&controlcookiename, "%s/run/%s.cookie", LOCALSTATEDIR, identname);
+ if(!pidfilename)
+ xasprintf(&pidfilename, "%s/run/%s.pid", LOCALSTATEDIR, identname);
- 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));
- 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);
- 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(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));