#include #include #include #include #include #include #include int main(int argc, char *argv[]) { struct addrinfo hints, *r; int e, fd, n; pid_t pid; char *host, *service; char *pargv[8], _fdbuf[sizeof(int)*3+1], *fdbuf = _fdbuf+sizeof(_fdbuf); if (argc < 2) { fprintf(stderr, "usage: %s host [service]\n", argv[0]); return 1; } host = argv[1]; service = argc >= 3 ? argv[2] : "443"; hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; hints.ai_protocol = 0; if ((e = getaddrinfo(host, service, &hints, &r)) != 0) { fprintf(stderr, "%s:%s: %s", host, service, gai_strerror(e)); return 1; } for (; r; r = r->ai_next) { fd = socket(r->ai_family, r->ai_socktype, r->ai_protocol); if (fd < 0) { if (!r->ai_next) perror("socket"); continue; } if (connect(fd, r->ai_addr, r->ai_addrlen) != 0) { if (!r->ai_next) perror("connect"); close(fd); fd = -1; continue; } break; } if (fd < 0) return 1; *--fdbuf = '\0'; for (n = fd; n; n /= 10) *--fdbuf = '0'+n%10; pargv[0] = "tlsify"; pargv[1] = "-n"; pargv[2] = host; pargv[3] = fdbuf; pargv[4] = NULL; if ((e = posix_spawnp(&pid, "tlsify", NULL, NULL, pargv, NULL)) != 0) { errno = e; perror("posix_spawn"); return 1; } close(fd); close(0); close(1); waitpid(pid, NULL, 0); return 0; }