/* ** $Id: email.c,v 1.1 2008/02/01 20:14:43 krishnap Exp $ ** Krishna Puttaswamy ** description: */ #include #include #include #include #include "chimera.h" #include "bluemoon.h" #include "log.h" #include "route.h" #include "key.h" #include "dtime.h" #include "dht.h" #include "emailtest.h" #define USAGE "email [ -j bootstrap:port ] port key" #define OPTSTR "j:" #define DEBUG 0 extern char *optarg; extern int optind; ChimeraHost *driver = NULL; ChimeraState *state; int seq = -1; char myemail[200]; void handle_my_message(ChimeraState *state, unsigned char* message, int msglen) { fprintf(stderr, "myemail: %s gotmessage: %s\n", myemail, message); } void send_handler (Key * key, Message * msg) { if (msg->type == SET_EMAIL_ID){ fprintf(stderr, "GOT SET_email message\n"); strcpy(myemail, msg->payload); fprintf(stderr, "my email is %s\n", myemail); Key hintkey; key_make_hash(&hintkey, (char*) myemail, strlen(myemail)); fprintf(stderr, "established reverse path to my email-hintpoint %s\n", hintkey.keystr); establish_reverse_path(state, hintkey, 1); sleep(50); keepalive_reverse_path(state, hintkey); sleep(50); // assuming that the node that sets up the email id is different from the sender for this test; keepalive_reverse_path(state, hintkey); } else if (msg->type == SEND_EMAIL){ fprintf(stderr, "GOT send_EMAIL messsage to %s\n", msg->payload); Key tempKey; key_make_hash(&tempKey, (char*) msg->payload, strlen(msg->payload)); establish_forward_path(state, tempKey, 2); fprintf(stderr, "established forward path to %s\n", tempKey.keystr); char temp[10000]; strcpy(temp, "hello"); strcat(temp, "-to-"); strcat(temp, msg->payload); int i = 0; for(i = 0; i < 500; i++){ strcat(temp, "X"); } bluemoon_send (state, tempKey, strlen(temp)+1, temp); sleep(80); keepalive_forward_path(state, tempKey); sleep(50); bluemoon_send (state, tempKey, strlen(temp)+1, temp); fflush(stderr); } } int main (int argc, char **argv) { int opt; char *hn = NULL; int port = 0, joinport = 0; ChimeraHost *join = NULL; char tmp[256]; int i, j; Message *hello; char *configfile = "./hosts"; while ((opt = getopt (argc, argv, OPTSTR)) != EOF) { switch ((char) opt) { case 'j': for (i = 0; optarg[i] != ':' && i < strlen (optarg); i++); optarg[i] = 0; hn = optarg; sscanf (optarg + (i + 1), "%d", &joinport); break; default: fprintf (stderr, "invalid option %c\n", (char) opt); fprintf (stderr, "usage: %s\n", USAGE); exit (1); } } if ((argc - optind) != 2) { fprintf (stderr, "usage: %s\n", USAGE); exit (1); } Key key; port = atoi (argv[optind]); str_to_key (argv[optind + 1], &key); state = chimera_init (port); chimera_setkey (state, key); srand (time (NULL)); if (hn != NULL) { join = host_get (state, hn, joinport); } chimera_register (state, HELLO_MESSAGE, 1); chimera_register (state, SET_EMAIL_ID, 1); chimera_register (state, SEND_EMAIL, 1); char networkdebug[256], routingdebug[256]; char bluemoondebug[256]; sprintf (bluemoondebug, "logs/LOG_BLUEMOON%s", key.keystr); bluemoon_init (state); bluemoon_receive(state, handle_my_message); chimera_deliver (state, send_handler); driver = host_get (state, "marrow", 11110); if (join != NULL) { chimera_join (state, join); sprintf (tmp, "%d %s joining with %s:%d", port, key.keystr, hn, joinport); } else { sprintf (tmp, "%d %s starting system", port, key.keystr, hn, joinport); } hello = message_create (driver->key, HELLO_MESSAGE, strlen (tmp) + 1, tmp); while(!message_send (state, driver, hello, TRUE)); free(hello->payload); free (hello); calc_cycles_persec(state); while (1) { sleep (3000); } }