File: mbus_control.c

package info (click to toggle)
rat 4.2.22-2.2
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 2,896 kB
  • ctags: 3,717
  • sloc: ansic: 36,542; tcl: 2,740; sh: 2,675; makefile: 295
file content (140 lines) | stat: -rw-r--r-- 3,427 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
/*
 * FILE:    mbus_control.c
 * PROGRAM: RAT - controller
 * AUTHOR:  Colin Perkins 
 *
 * Copyright (c) 1999-2001 University College London
 * All rights reserved.
 */
 
#ifndef HIDE_SOURCE_STRINGS
static const char cvsid[] = 
	"$Id: mbus_control.c,v 1.18 2001/01/08 20:30:02 ucaccsp Exp $";
#endif /* HIDE_SOURCE_STRINGS */

#include "config_unix.h"
#include "config_win32.h"
#include "debug.h"
#include "mbus.h"
#include "mbus_parser.h"
#include "mbus_control.h"

extern int 	 should_exit;
extern char	*u_addr, *e_addr;
extern pid_t	 pid_ui, pid_engine;

/* Mbus command reception function type */
typedef void (*mbus_rx_proc)(char *srce, char *args, void *data);

/* Tuple to associate string received with it's parsing fn */
typedef struct {
        const char   *rxname;
        mbus_rx_proc  rxproc;
} mbus_cmd_tuple;

static char *wait_token;
static char *wait_addr;

void mbus_control_wait_init(char *token)
{
	wait_token = token;
	wait_addr  = NULL;
}

char *mbus_control_wait_done(void)
{
	return wait_addr;
}

static void rx_mbus_quit(char *srce, char *args, void *data)
{
	UNUSED(srce);
	UNUSED(args);
	UNUSED(data);

        debug_msg("Got quit %s\n", srce);

	/* We mark ourselves as ready to exit. The main() will */
	/* cleanup and terminate all our subprocesses.         */
	should_exit = TRUE;
}

static void rx_mbus_bye(char *srce, char *args, void *data)
{
        pid_t pid_msgsrc, pid_cur;
        char *lc;
        int   i;

        /* Find last colon */
        for (i = 0, lc = NULL; srce[i] != 0; i++) {
                if (srce[i] == ':') {
                        lc = srce + i;
                }
        }
        assert(lc != NULL);
        /* Skip past colon, next char should okay for atoi */
        pid_msgsrc = atoi(lc + 1);
        pid_cur    = (pid_t)getpid();
        if (pid_msgsrc == pid_cur ||
            pid_msgsrc == pid_ui   ||
            pid_msgsrc == pid_engine) {
                /* We mark ourselves as ready to exit. The main() will */
                /* cleanup and terminate all our subprocesses.         */
                should_exit = TRUE;
        }
	UNUSED(args);
	UNUSED(data);
}

static void rx_mbus_waiting(char *srce, char *args, void *data)
{
	UNUSED(srce);
	UNUSED(args);
	UNUSED(data);
}

static void rx_mbus_go(char *srce, char *args, void *data)
{
	struct mbus_parser	*mp;
	char			*t;

	UNUSED(data);

	mp = mbus_parse_init(args);
	mbus_parse_str(mp, &t);
	if (strcmp(mbus_decode_str(t), wait_token) == 0) {
		wait_addr = xstrdup(srce);
	}
	mbus_parse_done(mp);
}

static void rx_mbus_hello(char *srce, char *args, void *data)
{
	UNUSED(srce);
	UNUSED(args);
	UNUSED(data);
}

static const mbus_cmd_tuple control_cmds[] = {
        { "mbus.quit",                             rx_mbus_quit },
        { "mbus.bye",                              rx_mbus_bye },
        { "mbus.waiting",                          rx_mbus_waiting },
        { "mbus.go",                               rx_mbus_go },
        { "mbus.hello",                            rx_mbus_hello },
};

#define NUM_CONTROL_CMDS sizeof(control_cmds)/sizeof(control_cmds[0])

void mbus_control_rx(char *srce, char *cmnd, char *args, void *data)
{
	uint32_t i;

	for (i=0; i < NUM_CONTROL_CMDS; i++) {
		if (strcmp(control_cmds[i].rxname, cmnd) == 0) {
                        control_cmds[i].rxproc(srce, args, data);
			return;
		} 
	}
	debug_msg("Unknown mbus command: %s (%s)\n", cmnd, args);
}