-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcid_info.c
113 lines (98 loc) · 2.57 KB
/
cid_info.c
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
/*
* Part of `snmp-query-engine`.
*
* Copyright 2012-2013, Anton Berezin <tobez@tobez.org>
* Modified BSD license.
* (See LICENSE file in the distribution.)
*
*/
#include "sqe.h"
struct cid_info *
get_cid_info(struct client_requests_info *cri, unsigned cid)
{
struct cid_info **ci_slot, *ci;
JLI(ci_slot, cri->cid_info, cid);
if (ci_slot == PJERR)
croak(2, "get_cid_info: JLI(cid) failed");
if (!*ci_slot) {
ci = malloc(sizeof(*ci));
if (!ci)
croak(2, "get_cid_info: malloc(cid_info)");
PS.active_cid_infos++;
PS.total_cid_infos++;
cri->si->PS.active_cid_infos++;
cri->si->PS.total_cid_infos++;
bzero(ci, sizeof(*ci));
ci->cri = cri;
ci->fd = cri->fd;
ci->cid = cid;
TAILQ_INIT(&ci->oids_done);
*ci_slot = ci;
}
return *ci_slot;
}
int
free_cid_info(struct cid_info *ci)
{
Word_t rc;
PS.active_cid_infos--;
ci->cri->si->PS.active_cid_infos--;
JLD(rc, ci->cri->cid_info, ci->cid);
free_oid_info_list(&ci->oids_done);
free(ci);
return 1;
}
void
cid_reply(struct cid_info *ci, int type)
{
msgpack_sbuffer* buffer = msgpack_sbuffer_new();
msgpack_packer* pk = msgpack_packer_new(buffer, msgpack_sbuffer_write);
struct oid_info *oi;
msgpack_pack_array(pk, 3);
msgpack_pack_int(pk, type|RT_REPLY);
msgpack_pack_int(pk, ci->cid);
msgpack_pack_array(pk, ci->n_oids_done);
TAILQ_FOREACH(oi, &ci->oids_done, oid_list) {
msgpack_pack_array(pk, 2);
msgpack_pack_oid(pk, oi->oid);
msgpack_pack_ber(pk, oi->value);
PS.oids_returned_to_client++;
ci->cri->si->PS.oids_returned_to_client++;
}
tcp_send(ci->cri->si, buffer->data, buffer->size);
msgpack_sbuffer_free(buffer);
msgpack_packer_free(pk);
free_cid_info(ci);
}
void
dump_cid_info(msgpack_packer *pk, struct cid_info *ci)
{
char buf[512];
Word_t n_oids_done;
struct oid_info *oi;
#define PACK msgpack_pack_string(pk, buf)
#define DUMPi(field) msgpack_pack_named_int(pk, #field, ci->field)
#define DUMPs(field) msgpack_pack_named_string(pk, #field, ci->field)
snprintf(buf, 512, "CID(%d)", ci->cid); PACK;
msgpack_pack_map(pk, 8);
msgpack_pack_string(pk, "cri");
snprintf(buf, 512, "CRI(%s:%d->%d)", inet_ntoa(ci->cri->dest->ip), ci->cri->dest->port, ci->cri->fd); PACK;
DUMPi(cid);
DUMPi(fd);
DUMPi(n_oids);
DUMPi(n_oids_being_queried);
DUMPi(n_oids_done);
n_oids_done = 0;
TAILQ_FOREACH(oi, &ci->oids_done, oid_list) {
n_oids_done++;
}
msgpack_pack_named_int(pk, "#OIDS_DONE", n_oids_done);
msgpack_pack_string(pk, "@OIDS_DONE");
msgpack_pack_array(pk, n_oids_done);
TAILQ_FOREACH(oi, &ci->oids_done, oid_list) {
dump_oid_info(pk, oi);
}
#undef DUMPi
#undef DUMPs
#undef PACK
}