diff options
Diffstat (limited to 'send/send.c')
-rw-r--r-- | send/send.c | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/send/send.c b/send/send.c new file mode 100644 index 0000000..aae33c2 --- /dev/null +++ b/send/send.c @@ -0,0 +1,127 @@ +#include <sys/socket.h> +#include <arpa/inet.h> +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <unistd.h> +#include <string.h> +#include <time.h> + +#include "util.h" +#include "arg.h" +#include "users.h" + +FILE *fout; +char *argv0; + +static int +init_client(char *host, int port) { + int s = socket(AF_INET, SOCK_STREAM, 0); + + struct sockaddr_in addr = {AF_INET, htons(port)}; + if (!inet_pton(AF_INET, host, &addr.sin_addr)) + error("couldn't resolve host"); + + if (connect(s, (struct sockaddr *)&addr, sizeof(addr))) + error("Failed to connect"); + + return s; +} + +static void +stop_client(int s) { + close(s); +} + +static void +connect_client(int s, char *nick) { + char *msg; + int len = asprintf(&msg, "connect %s", nick); + send(s, msg, len, 0); + free(msg); +} + +static void +send_msg(int s, char *contents) { + char *msg; + time_t t = time(NULL); + + int len = asprintf(&msg, "msg %.5d %s", strlen(contents), contents); + + send(s, msg, len, 0); + send(s, &t, sizeof(time_t), 0); + free(msg); +} + +static void +resend_msg(int s, char *contents) { + char *msg; + time_t t = time(NULL); + + int len = asprintf(&msg, "remsg %.5d %s", strlen(contents), contents); + + send(s, msg, len, 0); + send(s, &t, sizeof(time_t), 0); + free(msg); +} + +static void +usage() { + fprintf(stderr, "send [-h host] [-p port] [-P password] [-n nick] -m msg\n"); + exit(1); +} + +static int +recv_response(int s) { + int i; + recv(s, &i, sizeof(int), 0); + return i; +} + +int +main(int argc, char **argv) { + char *host = "127.0.0.1"; + int port = 1543; + char *nick = getenv("SENDUSER"); + char *pass = getenv("SENDPASS"); + char *msg = NULL; + + ARGBEGIN { + case 'h': + host = EARGF(usage()); + break; + case 'p': + port = atoi(EARGF(usage())); + break; + case 'P': + pass = EARGF(usage()); + break; + case 'n': + nick = EARGF(usage()); + break; + case 'm': + msg = EARGF(usage()); + break; + } ARGEND; + + if (!msg) + usage(); + if (!nick) + error("failed to get nickname, use -n!"); + if (!pass) + error("failed to get password, use -p!"); + + int s = init_client(host, port); + connect_client(s, nick); + + int msg_hash = make_mhash(msg); + + send_msg(s, msg); + + while (recv_response(s) != msg_hash) + resend_msg(s, msg); + + printf("valid msg sent\n"); + + stop_client(s); +} |