static struct option const long_options[] = {
{"config", required_argument, NULL, 'c'},
static struct option const long_options[] = {
{"config", required_argument, NULL, 'c'},
{"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},
- while((r = getopt_long(argc, argv, "c:n:", long_options, &option_index)) != EOF) {
+ while((r = getopt_long(argc, argv, "c:n:h:", long_options, &option_index)) != EOF) {
fprintf(stderr, "Could not open control socket cookie file %s: %s\n", controlcookiename, strerror(errno));
return 1;
}
fprintf(stderr, "Could not open control socket cookie file %s: %s\n", controlcookiename, strerror(errno));
return 1;
}
- if(fscanf(f, "%1024s %d %d", controlcookie, &port, &pid) != 3) {
+ if(fscanf(f, "%1024s %128s %d", controlcookie, port, &pid) != 3) {
- 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));