/*
 * 4m v2.15 (dispatch.c)
 * (C) Copyright 1990 by Carrick Sean Casey
 * (C) Copyright 1993 by Scott Chasin and Michaeljon Miller
 *
 * 3-24-93 See file COPYING for copyright information.
 *
 * Command protocol dispatching
 */

#include "4m.h"
#include "externs.h"

#include <pwd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>


extern char *tag ();
extern char *get_tail();
extern char *skipword();
extern char *getword();
extern int atoi ();
extern void sendpong ();
extern void beep ();
extern void protomsg ();
extern void loginokmsg ();
extern void c_openmsg ();
extern void statusmsg ();
extern void errormsg ();
extern void importantmsg ();
extern void exitmsg ();
extern void output ();
extern void cmdoutmsg ();
extern void parse ();
extern void do_ctcp ();
extern void m_personal ();
extern void c_adminmsg ();
extern void wholisting ();
extern void groupheader ();
extern void whoheader ();
extern void page_output ();
extern void m_chgroup ();
extern void m_chnick ();
extern void m_join ();
extern void m_signon ();
extern void m_signoff ();
extern void m_part ();
extern void m_action ();
extern void m_away ();
extern void m_name ();
extern void m_invite ();
extern void m_kick ();
extern void m_topic ();
extern void m_chtopic ();
extern void m_members ();
extern void m_whois ();
extern void m_motd ();
extern void m_here ();
extern void m_awaymsg ();
extern void m_echobackp ();
extern void m_userisaway ();
extern void m_groupmode ();
extern void m_groupmods ();
extern void m_groupmisc ();
extern void m_groupinvites ();
extern void m_chmode ();
extern void m_claim ();
extern void m_refuse ();
extern void m_demoted ();
extern void m_promoted ();
extern void m_kicked ();
extern void m_notify ();

void dispatch(pkt)
     char *pkt;
{
    int numeric;
    char buf[85];

    tag(pkt);
    numeric = atoi(getword(pkt));

    switch (numeric) {

        case M_PING:
            sendpong();
            break;

        case M_BEEP:
            beep(get_tail(pkt));
            break;

#if defined (ESIX) || defined (SOLARIS)
        case _M_PROTO:
#else
        case M_PROTO:
#endif
            protomsg(get_tail(pkt));
            break;

        case M_LOGINOK:
            loginokmsg(get_tail(pkt));
            break;

        case M_OPEN:
            c_openmsg(get_tail(pkt));
            break;

        case M_STATUS:
            statusmsg(get_tail(pkt));
            break;

#if defined (ESIX) || defined (SOLARIS)
        case _M_ERROR:
#else
        case M_ERROR:
#endif
            errormsg(get_tail(pkt));
            break;

        case M_IMPORTANT:
            importantmsg(get_tail(pkt));
            break;

        case M_EXIT:
            exitmsg();
            break;

        case M_OUT:
            output(skipword(pkt));
            break;

        case M_CMDOUT:
            cmdoutmsg(skipword(pkt));
            break;

        case M_PERSONAL:
            parse(pkt);

            if (words[2][0] == '\002') {
                strcpy(buf, words[1]);
                do_ctcp(buf, args);
            } else
                m_personal(get_tail(pkt));
            break;

        case M_ADMIN:
            c_adminmsg(get_tail(pkt));
            break;

        case M_WHOLIST:
            wholisting(pkt);
            break;

        case M_GROUPHEADER:
            groupheader(get_tail(pkt));
            break;

        case M_WHOHEADER:
            whoheader(pkt);
            break;

        case M_OUTPUTPAGE:
            page_output(skipword(pkt));
            break;

        case M_CHGROUP:
            m_chgroup(get_tail(pkt));
            break;

        case M_CHNICK:
            m_chnick(get_tail(pkt));
            break;

        case M_JOIN:
            m_join(get_tail(pkt));
            break;

        case M_SIGNON:
            m_signon(get_tail(pkt));
            break;

        case M_SIGNOFF:
            m_signoff(get_tail(pkt));
            break;

        case M_PART:
            m_part(get_tail(pkt));
            break;

        case M_ACTION:
            m_action(get_tail(pkt));
            break;

        case M_AWAY:
            m_away(get_tail(pkt));
            break;

        case M_NAME:
            m_name(get_tail(pkt));
            break;

        case M_INVITE:
            m_invite(get_tail(pkt));
            break;

        case M_KICK:
            m_kick(get_tail(pkt));
            break;

        case M_TOPIC:
            m_topic(get_tail(pkt));
            break;

        case M_CHTOPIC:
            m_chtopic(get_tail(pkt));
            break;

        case M_MEMBERS:
            m_members(get_tail(pkt));
            break;

        case M_WHOIS:
            m_whois(get_tail(pkt));
            break;

        case M_MOTD:
            m_motd(skipword(pkt));
            break;

        case M_HERE:
            m_here(get_tail(pkt));
            break;

        case M_AWAYMSG:
            m_awaymsg(get_tail(pkt));
            break;

        case M_ECHOBACKP:
            m_echobackp(get_tail(pkt));
            break;

        case M_USERISAWAY:
            m_userisaway(get_tail(pkt));
            break;

        case M_GROUPMODE:
            m_groupmode(get_tail(pkt));
            break;

        case M_GROUPMODS:
            m_groupmods(get_tail(pkt));
            break;

        case M_GROUPMISC:
            m_groupmisc(get_tail(pkt));
            break;

        case M_GROUPINVITES:
            m_groupinvites(get_tail(pkt));
            break;

        case M_CHMODE:
            m_chmode(get_tail(pkt));
            break;

        case M_CLAIM:
            m_claim(get_tail(pkt));
            break;

        case M_REFUSE:
            m_refuse(get_tail(pkt));
            break;

        case M_DEMOTED:
            m_demoted(get_tail(pkt));
            break;

        case M_PROMOTED:
            m_promoted(get_tail(pkt));
            break;

        case M_KICKED:
            m_kicked(get_tail(pkt));
            break;

        case M_NOTIFY:
            m_notify(get_tail(pkt));
            break;

        case M_SENDINGTO:
            m_sendingto(get_tail(pkt));
            break;

        case M_SERVERS:
            m_servers(get_tail (pkt));
            break;

        case M_SERVHEADER:
            m_servheader(get_tail(pkt));
            break;

        default:
            sprintf(mbuf, "Invalid packet type \"%s\"", getword(pkt));
            errormsg(mbuf);
    }

    return;
}
