summaryrefslogtreecommitdiff
path: root/ecp/src/dir_srv.c
blob: 563326d359a0e9a1ea5e9d6d9efc479956a21fd2 (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
#include "core.h"
#include "cr.h"

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

#ifdef ECP_WITH_DIRSRV

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_handle_update(ECPConnection *conn, ecp_seq_t seq, unsigned char mtype, unsigned char *msg, ssize_t size, ECP2Buffer *b) {
    ECPContext *ctx = conn->sock->ctx;
    ECPDirList *dir_shadow = ctx->dir_shadow;

    if (mtype == ECP_MTYPE_DIR_REQ) {
        return ecp_dir_parse(dir_shadow, msg, size);
    } else {
        return ECP_ERR;
    }
}

ssize_t ecp_dir_handle_req(ECPSocket *sock, ECPNetAddr *addr, ECPConnection *parent, unsigned char *msg, size_t msg_size, ECPPktMeta *pkt_meta, ECP2Buffer *bufs, ECPConnection **_conn) {
    ECPContext *ctx = sock->ctx;
    ECPBuffer *packet = bufs->packet;
    ECPBuffer *payload = bufs->payload;
    ECPDirList *dir_online = ctx->dir_online;
    ssize_t rv;
    int _rv;

    if (msg_size < 0) return msg_size;

    ecp_pld_set_type(payload->buffer, payload->size, ECP_MTYPE_DIR_REP);
    msg = ecp_pld_get_buf(payload->buffer, payload->size);
    msg_size = payload->size - (msg - payload->buffer);

    _rv = ecp_dir_serialize(dir_online, msg, msg_size);
    if (_rv) return _rv;

    rv = ecp_pld_send_tr(sock, addr, parent, packet, pkt_meta, payload, ECP_SIZE_PLD(dir_online->count * ECP_SIZE_DIR_ITEM, ECP_MTYPE_DIR_REP), 0);
    if (rv < 0) return rv;

    return msg_size;
}

#endif  /* ECP_WITH_DIRSRV */