Annotation of embedaddon/mpd/src/msg.c, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * msg.c
        !             4:  *
        !             5:  * Written by Archie Cobbs <archie@freebsd.org>
        !             6:  * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
        !             7:  * See ``COPYRIGHT.whistle''
        !             8:  */
        !             9: 
        !            10: #include "ppp.h"
        !            11: #include "msg.h"
        !            12: 
        !            13: /*
        !            14:  * DEFINITIONS
        !            15:  */
        !            16: 
        !            17: /* Which pipe file descriptor is which */
        !            18: 
        !            19:   #define PIPE_READ            0
        !            20:   #define PIPE_WRITE           1
        !            21: 
        !            22:   struct mpmsg
        !            23:   {
        !            24:     int                type;
        !            25:     void       (*func)(int type, void *arg);
        !            26:     void       *arg;
        !            27:     const char *dbg;
        !            28:   };
        !            29:   typedef struct mpmsg *Msg;
        !            30: 
        !            31:   #define      MSG_QUEUE_LEN   8192
        !            32:   #define      MSG_QUEUE_MASK  0x1FFF
        !            33: 
        !            34:   struct mpmsg msgqueue[MSG_QUEUE_LEN];
        !            35:   int          msgqueueh = 0;
        !            36:   int          msgqueuet = 0;
        !            37:   #define      QUEUELEN()      ((msgqueueh >= msgqueuet)?      \
        !            38:        (msgqueueh - msgqueuet):(msgqueueh + MSG_QUEUE_LEN - msgqueuet))
        !            39: 
        !            40:   int           msgpipe[2];
        !            41:   int          msgpipesent = 0;
        !            42:   EventRef     msgevent;
        !            43: 
        !            44: /*
        !            45:  * INTERNAL FUNCTIONS
        !            46:  */
        !            47: 
        !            48:   static void  MsgEvent(int type, void *cookie);
        !            49: 
        !            50: /*
        !            51:  * MsgRegister()
        !            52:  */
        !            53: 
        !            54: void
        !            55: MsgRegister2(MsgHandler *m, void (*func)(int type, void *arg), const char *dbg)
        !            56: {
        !            57:     if ((msgpipe[0]==0) || (msgpipe[1]==0)) {
        !            58:        if (pipe(msgpipe) < 0) {
        !            59:            Perror("%s: Can't create message pipe", 
        !            60:                __FUNCTION__);
        !            61:            DoExit(EX_ERRDEAD);
        !            62:        }
        !            63:        fcntl(msgpipe[PIPE_READ], F_SETFD, 1);
        !            64:        fcntl(msgpipe[PIPE_WRITE], F_SETFD, 1);
        !            65: 
        !            66:        if (fcntl(msgpipe[PIPE_READ], F_SETFL, O_NONBLOCK) < 0)
        !            67:            Perror("%s: fcntl", __FUNCTION__);
        !            68:        if (fcntl(msgpipe[PIPE_WRITE], F_SETFL, O_NONBLOCK) < 0)
        !            69:            Perror("%s: fcntl", __FUNCTION__);
        !            70: 
        !            71:        if (EventRegister(&msgevent, EVENT_READ,
        !            72:                msgpipe[PIPE_READ], EVENT_RECURRING, MsgEvent, NULL) < 0) {
        !            73:            Perror("%s: Can't register event", __FUNCTION__);
        !            74:            DoExit(EX_ERRDEAD);
        !            75:         }
        !            76:     }
        !            77: 
        !            78:     m->func = func;
        !            79:     m->dbg = dbg;
        !            80: }
        !            81: 
        !            82: /*
        !            83:  * MsgUnRegister()
        !            84:  */
        !            85: 
        !            86: void
        !            87: MsgUnRegister(MsgHandler *m)
        !            88: {
        !            89:     m->func = NULL;
        !            90:     m->dbg = NULL;
        !            91: }
        !            92: 
        !            93: /*
        !            94:  * MsgEvent()
        !            95:  */
        !            96: 
        !            97: static void
        !            98: MsgEvent(int type, void *cookie)
        !            99: {
        !           100:     char       buf[16];
        !           101:     /* flush signaling pipe */
        !           102:     msgpipesent = 0;
        !           103:     while (read(msgpipe[PIPE_READ], buf, sizeof(buf)) == sizeof(buf));
        !           104: 
        !           105:     while (msgqueuet != msgqueueh) {
        !           106:        Log(LG_EVENTS, ("EVENT: Message %d to %s received",
        !           107:            msgqueue[msgqueuet].type, msgqueue[msgqueuet].dbg));
        !           108:        (*(msgqueue[msgqueuet].func))(msgqueue[msgqueuet].type, msgqueue[msgqueuet].arg);
        !           109:        Log(LG_EVENTS, ("EVENT: Message %d to %s processed",
        !           110:            msgqueue[msgqueuet].type, msgqueue[msgqueuet].dbg));
        !           111: 
        !           112:        msgqueuet = (msgqueuet + 1) & MSG_QUEUE_MASK;
        !           113:        SETOVERLOAD(QUEUELEN());
        !           114:     }
        !           115: }
        !           116: 
        !           117: /*
        !           118:  * MsgSend()
        !           119:  */
        !           120: 
        !           121: void
        !           122: MsgSend(MsgHandler *m, int type, void *arg)
        !           123: {
        !           124:     assert(m);
        !           125:     assert(m->func);
        !           126: 
        !           127:     msgqueue[msgqueueh].type = type;
        !           128:     msgqueue[msgqueueh].func = m->func;
        !           129:     msgqueue[msgqueueh].arg = arg;
        !           130:     msgqueue[msgqueueh].dbg = m->dbg;
        !           131: 
        !           132:     msgqueueh = (msgqueueh + 1) & MSG_QUEUE_MASK;
        !           133:     if (msgqueuet == msgqueueh) {
        !           134:         Log(LG_ERR, ("%s: Fatal message queue overflow!", __FUNCTION__));
        !           135:         DoExit(EX_ERRDEAD);
        !           136:     }
        !           137: 
        !           138:     SETOVERLOAD(QUEUELEN());
        !           139: 
        !           140:     if (!msgpipesent) {
        !           141:        char    buf[1] = { 0x2a };
        !           142:        if (write(msgpipe[PIPE_WRITE], buf, 1) > 0)
        !           143:            msgpipesent = 1;
        !           144:     }
        !           145:     Log(LG_EVENTS, ("EVENT: Message %d to %s sent", type, m->dbg));
        !           146: }
        !           147: 
        !           148: /*
        !           149:  * MsgName()
        !           150:  */
        !           151: 
        !           152: const char *
        !           153: MsgName(int msg)
        !           154: {
        !           155:   switch (msg)
        !           156:   {
        !           157:     case MSG_OPEN:
        !           158:       return("OPEN");
        !           159:     case MSG_CLOSE:
        !           160:       return("CLOSE");
        !           161:     case MSG_UP:
        !           162:       return("UP");
        !           163:     case MSG_DOWN:
        !           164:       return("DOWN");
        !           165:     case MSG_SHUTDOWN:
        !           166:       return("SHUTDOWN");
        !           167:     default:
        !           168:       return("???");
        !           169:   }
        !           170: }
        !           171: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>