summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c44
1 files changed, 35 insertions, 9 deletions
diff --git a/main.c b/main.c
index 5a43f51..e8b0026 100644
--- a/main.c
+++ b/main.c
@@ -5,25 +5,51 @@
#include "tunnel.h"
#include "macro.h"
+#include "utils.h"
-int main(int argc __unused, char *argv[] __unused)
+static void sendcmd(int sock, int argc, char *argv[])
{
-#if 0
- if (geteuid() != 0)
- errx(EXIT_FAILURE, "running as root required");
-#endif
+ 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");
int sock = tunnel_client();
if (sock < 0)
- errx(EXIT_FAILURE, "tunnel_connect failed");
+ errx(EXIT_FAILURE, "tunnel_client failed");
- char buf[512];
+ sendcmd(sock, argc - 1, argv + 1);
- int n = read(sock, buf, sizeof(buf));
+ int n = read(sock, reply, sizeof(reply));
if (n < 0)
err(EXIT_FAILURE, "read");
- printf("%.*s\n", n, buf);
+ if (n) {
+ if (reply[n - 1] == '\n')
+ printf("%.*s", n, reply);
+ else
+ printf("%.*s\n", n, reply);
+ }
close(sock);