#include #include #include #include #include #include #include #include #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); }