summaryrefslogtreecommitdiff
path: root/ecp/src/ecp/dir_srv.c
blob: 952d393c0dcb9c21ae9f04db4382114bae671e61 (plain)
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
#include <stdlib.h>

#include "core.h"
#include "cr.h"

#include "dir.h"
#include "dir_srv.h"

int ecp_dir_init(ECPContext *ctx, ECPDirList *dir_online, ECPDirList *dir_shadow) {
    ctx->dir_online = dir_online;
    ctx->dir_shadow = dir_shadow;

    return ECP_OK;
}

ssize_t ecp_dir_send_list(ECPConnection *conn, unsigned char mtype, ECPDirList *list) {
    ECPBuffer packet;
    ECPBuffer payload;
    unsigned char pkt_buf[ECP_MAX_PKT];
    unsigned char pld_buf[ECP_MAX_PLD];
    unsigned char *msg;
    size_t hdr_size;
    size_t msg_size;
    ssize_t rv;

    packet.buffer = pkt_buf;
    packet.size = ECP_MAX_PKT;
    payload.buffer = pld_buf;
    payload.size = ECP_MAX_PLD;

    ecp_pld_set_type(payload.buffer, payload.size, mtype);
    msg = ecp_pld_get_msg(payload.buffer, payload.size);
    hdr_size = msg - payload.buffer;
    msg_size = payload.size - hdr_size;

    rv = ecp_dir_serialize(list, msg, msg_size);
    if (rv < 0) return rv;

    rv = ecp_pld_send(conn, &packet, &payload, ECP_SIZE_PLD(rv, mtype), 0);
    return rv;
}

ssize_t ecp_dir_send_upd(ECPConnection *conn) {
    ECPContext *ctx = conn->sock->ctx;
    ssize_t rv;

    rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_UPD, ctx->dir_shadow);
    return rv;
}

ssize_t ecp_dir_handle_upd(ECPConnection *conn, unsigned char *msg, size_t msg_size) {
    ECPContext *ctx = conn->sock->ctx;
    ssize_t rsize;
    ssize_t rv;

    rsize = ecp_dir_parse(ctx->dir_shadow, msg, msg_size);
    if (rsize < 0) return rsize;

    rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, ctx->dir_shadow);
    if (rv < 0) return rv;

    return rsize;
}

ssize_t ecp_dir_handle_req(ECPConnection *conn, unsigned char *msg, size_t msg_size) {
    ssize_t rv;

    rv = ecp_dir_send_rep(conn);
    if (rv < 0) return rv;

    return 0;
}

ssize_t ecp_dir_send_rep(ECPConnection *conn) {
    ECPContext *ctx = conn->sock->ctx;
    ssize_t rv;

    rv = ecp_dir_send_list(conn, ECP_MTYPE_DIR_REP, ctx->dir_online);
    return rv;
}

ssize_t ecp_dir_handle_rep(ECPConnection *conn, unsigned char *msg, size_t msg_size) {
    ECPContext *ctx = conn->sock->ctx;
    ssize_t rv;

    rv = ecp_dir_parse(ctx->dir_shadow, msg, msg_size);
    return rv;
}