/* handle a packet destined for us, or a broadcast */ void imc_recv(const imc_packet *p) { imc_char_data d; int bcast; imc_reminfo *i; bcast=!strcmp(imc_mudof(p->i.to), "*") ? 1 : 0; getdata(p, &d); if(!imc_is_router) { i=imc_find_reminfo(imc_mudof(p->from),0); if(i) { if(i->path) imc_strfree(i->path); i->path=imc_strdup(p->i.path); i->ping=0; i->type=0; } } /* chat: message to a channel (broadcast) */ if (!strcasecmp(p->type, "chat") && !imc_isignored(p->from)) imc_recv_chat(&d, imc_getkeyi(&p->data, "channel", 0), imc_getkey(&p->data, "text", "")); /* emote: emote to a channel (broadcast) */ else if (!strcasecmp(p->type, "emote") && !imc_isignored(p->from)) imc_recv_emote(&d, imc_getkeyi(&p->data, "channel", 0), imc_getkey(&p->data, "text", "")); /* tell: tell a player here something */ else if (!strcasecmp(p->type, "tell")) { if (imc_isignored(p->from)) { imc_sendignore(p->from); } else { imc_recv_tell(&d, p->to, imc_getkey(&p->data, "text", ""), imc_getkeyi(&p->data, "isreply", 0)); } } /* who-reply: receive a who response */ else if (!strcasecmp(p->type, "who-reply")) imc_recv_whoreply(p->to, imc_getkey(&p->data, "text", ""), imc_getkeyi(&p->data, "sequence", -1)); /* who: receive a who request */ else if (!strcasecmp(p->type, "who")) { if (imc_isignored(p->from)) { imc_sendignore(p->from); } else { imc_recv_who(&d, imc_getkey(&p->data, "type", "who")); } } /* whois-reply: receive a whois response */ else if (!strcasecmp(p->type, "whois-reply")) imc_recv_whoisreply(p->to, imc_getkey(&p->data, "text", "")); /* whois: receive a whois request */ else if (!strcasecmp(p->type, "whois")) imc_recv_whois(&d, p->to); /* beep: beep a player */ else if (!strcasecmp(p->type, "beep")) { if (imc_isignored(p->from)) { imc_sendignore(p->from); } else { imc_recv_beep(&d, p->to); } } /* is-alive: receive a keepalive (broadcast) */ else if (!strcasecmp(p->type, "is-alive")) imc_recv_keepalive(imc_mudof(p->from), imc_getkey(&p->data, "versionid", "unknown"), imc_getkey(&p->data, "flags", "")); /* ping: receive a ping request */ else if (!strcasecmp(p->type, "ping")) imc_recv_ping(imc_mudof(p->from), imc_getkeyi(&p->data, "time-s", 0), imc_getkeyi(&p->data, "time-us", 0), p->i.path); /* ping-reply: receive a ping reply */ else if (!strcasecmp(p->type, "ping-reply")) imc_recv_pingreply(imc_mudof(p->from), imc_getkeyi(&p->data, "time-s", 0), imc_getkeyi(&p->data, "time-us", 0), imc_getkey(&p->data, "path", NULL), p->i.path); /* mail: mail something to a local player */ else if (!strcasecmp(p->type, "mail")) imc_recv_mail(imc_getkey(&p->data, "from", "error@hell"), imc_getkey(&p->data, "to", "error@hell"), imc_getkey(&p->data, "date", "(IMC error: bad date)"), imc_getkey(&p->data, "subject", "no subject"), imc_getkey(&p->data, "id", "bad_id"), imc_getkey(&p->data, "text", "")); /* mail-ok: remote confirmed that they got the mail ok */ else if (!strcasecmp(p->type, "mail-ok")) imc_recv_mailok(p->from, imc_getkey(&p->data, "id", "bad_id")); /* mail-reject: remote rejected our mail, bounce it */ else if (!strcasecmp(p->type, "mail-reject")) imc_recv_mailrej(p->from, imc_getkey(&p->data, "id", "bad_id"), imc_getkey(&p->data, "reason", "(IMC error: no reason supplied")); /* handle keepalive requests - shogar */ else if (!strcasecmp(p->type, "keepalive-request")) { if(imc_is_router) imc_logstring("Recieved keepalive request from %s", p->from); imc_send_keepalive(); } /* expire closed hubs - shogar */ else if (!strcasecmp(p->type, "close-notify")) { imc_reminfo *r; char fake[90]; struct timeval tv; if(imc_is_router) imc_logstring("%s reports %s closed.", p->from, imc_getkey(&p->data, "host","unknown")); if(imc_is_router) return; r = imc_find_reminfo(imc_getkey(&p->data,"host","unknown"),0); if(r) { r->type = IMC_REMINFO_EXPIRED; for(r=imc_reminfo_list;r;r=r->next) { char *sf; sprintf(fake,"!%s",imc_getkey(&p->data,"host","___unknown")); if(r->name && r->path && (sf=strstr(r->path,fake)) && sf && (*(sf+strlen(fake))=='!' || *(sf+strlen(fake)) == 0) ) { // imc_logstring("Expiring %s",r->path); r->type = IMC_REMINFO_EXPIRED; gettimeofday(&tv, NULL); imc_send_ping(r->name, tv.tv_sec, tv.tv_usec); } } } } /* These 4 added by me for the auto-hub-swap -- Scion 1/9/99 */ else if (!strcasecmp(p->type, "inforequest")) /* Request connection info from all 1.00a hubs -- Scion */ imc_recv_inforequest(p->from); /* Had to use inforequest because 0.10 responds to info-request :) */ else if (!strcasecmp(p->type, "info-reply")) /* receive the reply from the inforequest :) -- Scion */ imc_recv_info_reply(p->from, imc_getkey(&p->data, "hub", "no"), imc_getkeyi(&p->data, "direct", -1)); else if (!strcasecmp(p->type, "switch-reply")) /* hub confirmed that it added a connection to us. -- Scion */ imc_autoconnect_reply_accept( /* Add a connection back to the hub */ p->from, imc_getkey(&p->data, "host", "!!!"), imc_getkeyi(&p->data, "port", -1), imc_getkey(&p->data, "clientpw", "password"), imc_getkey(&p->data, "serverpw", "password"), imc_getkeyi(&p->data, "rcvstamp", 0), imc_getkeyi(&p->data, "noforward", 0), imc_getkey(&p->data, "flags", "none"), imc_getkey(&p->data, "localname", "!!!"), imc_getkey(&p->data, "confirm", "not accepted") ); else if (!strcasecmp(p->type, "imc-switch")) /* hub receives request to add a connection -- Scion */ imc_recv_autoconnect( p->from, imc_getkey(&p->data, "host", "!!!"), imc_getkeyi(&p->data, "port", -1), imc_getkey(&p->data, "clientpw", "password"), imc_getkey(&p->data, "serverpw", "password"), imc_getkeyi(&p->data, "rcvstamp", 0), imc_getkeyi(&p->data, "noforward", 0), imc_getkey(&p->data, "flags", "none"), imc_getkey(&p->data, "localname", "!!!") ); /* call catch-all fn if present */ else { imc_packet out; if (imc_recv_hook) if ((*imc_recv_hook)(p, bcast)) return; if (bcast || !strcasecmp(p->type, "reject")) return; /* reject packet */ if (!imc_is_router) { strcpy(out.type, "reject"); strcpy(out.to, p->from); strcpy(out.from, p->to); imc_clonedata(&p->data, &out.data); imc_addkey(&out.data, "old-type", p->type); imc_send(&out); imc_freedata(&out.data); } } }
int icec_recv(const imc_packet *p, int bcast) { /* redirected msg */ if(!strcasecmp(p->type, "ice-msg-r")) { icec_recv_msg_r(p->from, imc_getkey(&p->data, "realfrom", ""), imc_getkey(&p->data, "channel", ""), imc_getkey(&p->data, "text", ""), imc_getkeyi(&p->data, "emote", 0)); return 1; } else if(!strcasecmp(p->type, "ice-msg-b")) { icec_recv_msg_b(p->from, imc_getkey(&p->data, "channel", ""), imc_getkey(&p->data, "text", ""), imc_getkeyi(&p->data, "emote", 0)); return 1; } else if(!strcasecmp(p->type, "ice-update")) { icec_recv_update(p->from, imc_getkey(&p->data, "channel", ""), imc_getkey(&p->data, "owner", ""), imc_getkey(&p->data, "operators", ""), imc_getkey(&p->data, "policy", ""), imc_getkey(&p->data, "invited", ""), imc_getkey(&p->data, "excluded", "")); return 1; } else if(!strcasecmp(p->type, "ice-destroy")) { icec_recv_destroy(p->from, imc_getkey(&p->data, "channel", "")); return 1; } else { return 0; } }