+#include <stdbool.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stdio.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <signal.h>
+#include <sys/socket.h>
+#include <sys/time.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "interface.h"
+struct timeval tv1;
+int sock_fd = -1;
+int fd = -1;
+int gargc;
+char **gargv;
+
+uint8_t bt;
+
+void killHandler(int i)
+{
+ printf("%i caught, Bye...\n", i);
+ exit(1);
+}
+
+void usage(FILE *o, char *arg0){
+ fprintf(o, "Usage: %s [opts]\n\nOptions\n"
+ "-p PORT Custom port number, default: 8123\n" , arg0);
+}
+
+long millis() {
+ if (gettimeofday(&tv1, NULL) == -1)
+ pdie("gettimeofday");
+ return tv1.tv_sec*1000 + tv1.tv_usec/1000;
+}
+
+bool input_available(){
+ struct timeval tv;
+ fd_set fds;
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ if (select(fd+1, &fds, NULL, NULL, &tv) == -1)
+ pdie("select");
+ if(!FD_ISSET(fd, &fds))
+ return false;
+ read(fd, &bt, 1);
+ return true;
+}
+
+uint8_t read_byte()
+{
+ read(fd, &bt, 1);
+ return bt;
+}
+
+void write_byte(uint8_t b)
+{
+ write(fd, &b, 1);
+}
+
+void write_dpin(uint8_t i, bool b)
+{
+ debug("dwrite %d: %d", i, b);
+ (void) i;
+ (void) b;
+}
+
+bool read_dpin(uint8_t i)
+{
+ debug("dread %d", i);
+ return false;
+ (void) i;
+}
+
+void write_apin(uint8_t i, uint8_t a)
+{
+ debug("awrite %d: %d", i, a);
+ (void) a;
+ (void) i;
+}
+
+uint8_t read_apin(uint8_t i)
+{
+ debug("aread %d", i);
+ return 0;
+ (void) i;
+}
+
+void delay(long ms)
+{
+ usleep(ms*1000);
+}
+
+void setup()
+{
+ int port = 8123, opti = 1;
+ //Register signal handler
+ if(signal(SIGINT, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...");
+ }
+ if(signal(SIGTERM, killHandler) == SIG_ERR){
+ die("Couldn't register signal handler...");
+ }
+ //Command line arguments
+ while(opti < gargc){
+ if(strcmp((*gargv)+opti, "-h") == 0){
+ usage(stdout, gargv[0]);
+ exit(EXIT_SUCCESS);
+ } else if(strcmp(gargv[opti], "-p") == 0 && opti+1<gargc){
+ port = atoi(gargv[++opti]);
+ if(port < 1)
+ die("Port numbers are > 1");
+ } else {
+ usage(stderr, gargv[0]);
+ exit(EXIT_FAILURE);
+ }
+ opti++;
+ }
+
+ //Open file descriptors
+ struct sockaddr_in sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sin_family = AF_INET;
+ sa.sin_addr.s_addr = INADDR_ANY;
+ sa.sin_port = htons(port);
+
+ if((sock_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
+ pdie("socket");
+ if(bind(sock_fd, (struct sockaddr*)&sa, sizeof(sa)) == -1)
+ pdie("bind");
+ if(listen(sock_fd, 10) == -1)
+ pdie("listen");
+
+ printf("Listening on %d\n", port);
+ fflush(stdout);
+ if((fd = accept(sock_fd, (struct sockaddr*)NULL, NULL)) == -1)
+ pdie("accept");
+}