root/rat/trunk/mbus_control.c @ 3115

Revision 3115, 3.2 KB (checked in by ucacoxh, 14 years ago)

- Fix controller to only quit upon hearing byes from one of it's children.

Was quiting when other tools using mbus said bye.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/*
2 * FILE:    mbus_control.c
3 * PROGRAM: RAT - controller
4 * AUTHOR:  Colin Perkins
5 *
6 * Copyright (c) 1999-2000 University College London
7 * All rights reserved.
8 */
9 
10#ifndef HIDE_SOURCE_STRINGS
11static const char cvsid[] =
12        "$Id$";
13#endif /* HIDE_SOURCE_STRINGS */
14
15#include "config_unix.h"
16#include "config_win32.h"
17#include "debug.h"
18#include "mbus.h"
19#include "mbus_parser.h"
20#include "mbus_control.h"
21
22extern int       should_exit;
23extern char     *u_addr, *e_addr;
24extern pid_t     pid_ui, pid_engine;
25
26/* Mbus command reception function type */
27typedef void (*mbus_rx_proc)(char *srce, char *args, void *data);
28
29/* Tuple to associate string received with it's parsing fn */
30typedef struct {
31        const char   *rxname;
32        mbus_rx_proc  rxproc;
33} mbus_cmd_tuple;
34
35static char *wait_token;
36static char *wait_addr;
37
38void mbus_control_wait_init(char *token)
39{
40        wait_token = token;
41        wait_addr  = NULL;
42}
43
44char *mbus_control_wait_done(void)
45{
46        return wait_addr;
47}
48
49static void rx_mbus_quit(char *srce, char *args, void *data)
50{
51        UNUSED(srce);
52        UNUSED(args);
53        UNUSED(data);
54
55        debug_msg("Got quit %s\n", srce);
56
57        /* We mark ourselves as ready to exit. The main() will */
58        /* cleanup and terminate all our subprocesses.         */
59        should_exit = TRUE;
60}
61
62static void rx_mbus_bye(char *srce, char *args, void *data)
63{
64        pid_t pid_msgsrc;
65        char *lc;
66        int   i;
67
68        /* Find last colon */
69        for (i = 0, lc = NULL; srce[i] != 0; i++) {
70                if (srce[i] == ':') {
71                        lc = srce;
72                }
73        }
74
75        assert(lc != NULL);
76        /* Skip past colon, next char should okay for atoi */
77        pid_msgsrc = atoi(lc + 1);
78        if (pid_msgsrc == getpid() ||
79            pid_msgsrc == pid_ui   ||
80            pid_msgsrc == pid_engine) {
81                /* We mark ourselves as ready to exit. The main() will */
82                /* cleanup and terminate all our subprocesses.         */
83                should_exit = TRUE;
84        }
85        UNUSED(args);
86        UNUSED(data);
87}
88
89static void rx_mbus_waiting(char *srce, char *args, void *data)
90{
91        UNUSED(srce);
92        UNUSED(args);
93        UNUSED(data);
94}
95
96static void rx_mbus_go(char *srce, char *args, void *data)
97{
98        struct mbus_parser      *mp;
99        char                    *t;
100
101        UNUSED(data);
102
103        mp = mbus_parse_init(args);
104        mbus_parse_str(mp, &t);
105        if (strcmp(mbus_decode_str(t), wait_token) == 0) {
106                wait_addr = xstrdup(srce);
107        }
108        mbus_parse_done(mp);
109}
110
111static void rx_mbus_hello(char *srce, char *args, void *data)
112{
113        UNUSED(srce);
114        UNUSED(args);
115        UNUSED(data);
116}
117
118static const mbus_cmd_tuple control_cmds[] = {
119        { "mbus.quit",                             rx_mbus_quit },
120        { "mbus.bye",                              rx_mbus_bye },
121        { "mbus.waiting",                          rx_mbus_waiting },
122        { "mbus.go",                               rx_mbus_go },
123        { "mbus.hello",                            rx_mbus_hello },
124};
125
126#define NUM_CONTROL_CMDS sizeof(control_cmds)/sizeof(control_cmds[0])
127
128void mbus_control_rx(char *srce, char *cmnd, char *args, void *data)
129{
130        uint32_t i;
131
132        for (i=0; i < NUM_CONTROL_CMDS; i++) {
133                if (strcmp(control_cmds[i].rxname, cmnd) == 0) {
134                        control_cmds[i].rxproc(srce, args, data);
135                        return;
136                }
137        }
138        debug_msg("Unknown mbus command: %s (%s)\n", cmnd, args);
139}
Note: See TracBrowser for help on using the browser.