diff --git a/testing/Makefile.inc b/testing/Makefile.inc
index 236ab19b1..42d89e059 100644
--- a/testing/Makefile.inc
+++ b/testing/Makefile.inc
@@ -83,12 +83,28 @@ tox_sync_CFLAGS = $(LIBSODIUM_CFLAGS) \
$(NACL_CFLAGS)
tox_sync_LDADD = $(LIBSODIUM_LDFLAGS) \
+ $(NACL_LDFLAGS) \
+ libtoxcore.la \
+ $(LIBSODIUM_LIBS) \
+ $(NACL_OBJECTS) \
+ $(NACL_LIBS)
+
+
+noinst_PROGRAMS += tox_shell
+
+tox_shell_SOURCES = ../testing/tox_shell.c
+
+tox_shell_CFLAGS = $(LIBSODIUM_CFLAGS) \
+ $(NACL_CFLAGS)
+
+tox_shell_LDADD = $(LIBSODIUM_LDFLAGS) \
$(NACL_LDFLAGS) \
libtoxcore.la \
$(LIBSODIUM_LIBS) \
$(NACL_OBJECTS) \
$(NACL_LIBS) \
- $(WINSOCK2_LIBS)
+ -lutil
+
endif
EXTRA_DIST += $(top_srcdir)/testing/misc_tools.c
diff --git a/testing/tox_shell.c b/testing/tox_shell.c
new file mode 100644
index 000000000..c80c20b8a
--- /dev/null
+++ b/testing/tox_shell.c
@@ -0,0 +1,153 @@
+/* Tox Shell
+ *
+ * Proof of concept ssh like server software using tox.
+ *
+ * Command line arguments are the ip, port and public_key of a node (for bootstrapping).
+ *
+ * EX: ./test 127.0.0.1 33445 CDCFD319CE3460824B33BE58FD86B8941C9585181D8FBD7C79C5721D7C2E9F7C
+ *
+ *
+ * Copyright (C) 2014 Tox project All Rights Reserved.
+ *
+ * This file is part of Tox.
+ *
+ * Tox is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Tox is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Tox. If not, see .
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "../toxcore/tox.h"
+#include "misc_tools.c"
+
+#include
+#include
+#include
+
+#define c_sleep(x) usleep(1000*x)
+
+void print_online(Tox *tox, int friendnumber, uint8_t status, void *userdata)
+{
+ if (status == 1)
+ printf("\nOther went online.\n");
+ else
+ printf("\nOther went offline.\n");
+}
+
+void print_message(Tox *tox, int friendnumber, const uint8_t *string, uint16_t length, void *userdata)
+{
+ int master = *((int *)userdata);
+ write(master, string, length);
+ write(master, "\n", 1);
+}
+
+int main(int argc, char *argv[])
+{
+ uint8_t ipv6enabled = TOX_ENABLE_IPV6_DEFAULT; /* x */
+ int argvoffset = cmdline_parsefor_ipv46(argc, argv, &ipv6enabled);
+
+ if (argvoffset < 0)
+ exit(1);
+
+ /* with optional --ipvx, now it can be 1-4 arguments... */
+ if ((argc != argvoffset + 2) && (argc != argvoffset + 4)) {
+ printf("Usage: %s [--ipv4|--ipv6] ip port public_key (of the DHT bootstrap node)\n", argv[0]);
+ exit(0);
+ }
+
+ int *master = malloc(sizeof(int));
+ int ret = forkpty(master, NULL, NULL, NULL);
+
+ if (ret == -1) {
+ printf("fork failed\n");
+ return 1;
+ }
+
+ if (ret == 0) {
+ execl("/bin/sh", "sh", NULL);
+ return 0;
+ }
+
+ int flags = fcntl(*master, F_GETFL, 0);
+ int r = fcntl(*master, F_SETFL, flags | O_NONBLOCK);
+
+ if (r < 0) {
+ printf("error setting flags\n");
+ }
+
+ Tox *tox = tox_new(0);
+ tox_callback_connection_status(tox, print_online, NULL);
+ tox_callback_friend_message(tox, print_message, master);
+
+
+ uint16_t port = atoi(argv[argvoffset + 2]);
+ unsigned char *binary_string = hex_string_to_bin(argv[argvoffset + 3]);
+ int res = tox_bootstrap_from_address(tox, argv[argvoffset + 1], port, binary_string);
+ free(binary_string);
+
+ if (!res) {
+ printf("Failed to convert \"%s\" into an IP address. Exiting...\n", argv[argvoffset + 1]);
+ exit(1);
+ }
+
+ uint8_t address[TOX_FRIEND_ADDRESS_SIZE];
+ tox_get_address(tox, address);
+ uint32_t i;
+
+ for (i = 0; i < TOX_FRIEND_ADDRESS_SIZE; i++) {
+ printf("%02X", address[i]);
+ }
+
+ char temp_id[128];
+ printf("\nEnter the address of the other id you want to sync with (38 bytes HEX format):\n");
+
+ if (scanf("%s", temp_id) != 1) {
+ return 1;
+ }
+
+ uint8_t *bin_id = hex_string_to_bin(temp_id);
+ int num = tox_add_friend(tox, bin_id, (uint8_t *)"Install Gentoo", sizeof("Install Gentoo"));
+ free(bin_id);
+
+ if (num < 0) {
+ printf("\nSomething went wrong when adding friend.\n");
+ return 1;
+ }
+
+ uint8_t notconnected = 1;
+
+ while (1) {
+ if (tox_isconnected(tox) && notconnected) {
+ printf("\nDHT connected.\n");
+ notconnected = 0;
+ }
+
+ while (tox_get_friend_connection_status(tox, num) == 1) {
+ uint8_t buf[TOX_MAX_MESSAGE_LENGTH];
+ ret = read(*master, buf, sizeof(buf));
+
+ if (ret <= 0)
+ break;
+
+ tox_send_message(tox, num, buf, ret);
+ }
+
+ tox_do(tox);
+ c_sleep(1);
+ }
+
+ return 0;
+}