#include #include #include #include #include "tunnel.h" #include "macro.h" #include "utils.h" static void sendcmd(int sock, int argc, char *argv[]) { char *buf = NULL; size_t len = 0; let (fp, open_memstream(&buf, &len), fclose) { for (int n = 0; n < argc; n++) { if (n) fputc('\0', fp); fprintf(fp, "%s", argv[n]); } } if (write(sock, buf, len) < 0) err(EXIT_FAILURE, "write"); free(buf); } int main(int argc, char *argv[]) { char reply[1024]; if (argc == 1) errx(EXIT_FAILURE, "bad usage"); if (!strcmp(argv[1], "server")) { if (!tunnel_server()) errx(EXIT_FAILURE, "start server failed"); return 0; } int sock = tunnel_client(); if (sock < 0) errx(EXIT_FAILURE, "init client failed"); sendcmd(sock, argc - 1, argv + 1); int n = read(sock, reply, sizeof(reply)); if (n < 0) err(EXIT_FAILURE, "read"); if (n) { if (reply[n - 1] == '\n') printf("%.*s", n, reply); else printf("%.*s\n", n, reply); } close(sock); return 0; }