#include "mud.c" #include "aegis256/aegis256.c" #include #include int main(int argc, char **argv) { if (argc > 2) return -1; int client = argc == 2; struct sockaddr_in local = { .sin_family = AF_INET, .sin_port = htons(client + 20000), .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK), }, }; struct mud *mud = mud_create((struct sockaddr *)&local); if (!mud) { perror("mud_create"); return -1; } unsigned char key[] = "0123456789ABCDEF0123456789ABCDEF"; if (mud_set_key(mud, key, sizeof(key))) { perror("mud_set_key"); return -1; } // client is little harder to setup if (client) { struct sockaddr_in remote = { .sin_family = AF_INET, .sin_port = htons(20000), .sin_addr = { .s_addr = htonl(INADDR_LOOPBACK), }, }; // we are going to connect to remote... if (mud_peer(mud, (struct sockaddr *)&remote)) { perror("mud_peer"); return -1; } // ...from loopback at 1MBps (not 1Mbps) if (mud_set_state(mud, (struct sockaddr *)&local, MUD_UP, 1000 * 1000, 1000 * 1000, 0, 0)) { perror("mud_set_state"); return -1; } } unsigned char buf[1500]; for (;;) { // mandatory, mud have lot of work to do. if (mud_update(mud)) usleep(100000); // don't use all the cpu if (client) { // when there is data, mud_recv() is mandatory struct pollfd pollfd = { .fd = mud_get_fd(mud), .events = POLLIN, }; switch (poll(&pollfd, 1, 0)) { case -1: perror("poll"); return -1; case 1: if (mud_recv(mud, buf, sizeof(buf)) == -1) { perror("mud_recv"); return -1; } } // we can safely call mud_send() // even if the link is not ready int r = mud_send(mud, argv[1], strlen(argv[1])); if (r == -1) { if (errno == EAGAIN) continue; perror("mud_send"); return -1; } // we sent everything, bye :) if (r) break; } else { int r = mud_recv(mud, buf, sizeof(buf)); if (r == -1) { if (errno == EAGAIN) continue; perror("mud_recv"); return -1; } if (r) { buf[r] = 0; printf("%s\n", buf); } } } mud_delete(mud); return 0; }