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
|
/*
* Copyright (c) 2021 Cisco and/or its affiliates.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/**
* \file dummy.c
* \brief Implementation of Dummy interface
*/
#include <stdlib.h>
#include <unistd.h> // close
#include <hicn/facemgr.h>
#include "../../common.h"
#include "../../interface.h"
#include "dummy.h"
#define DEFAULT_PORT 9695
#define UNUSED(x) ((void)x)
/*
* Internal data
*/
typedef struct {
/* The configuration data will likely be allocated on the stack (or should
* be freed) by the caller, we recommend to make a copy of this data.
* This copy can further be altered with default values.
*/
dummy_cfg_t cfg;
/* ... */
int fd; /* Sample internal data: file descriptor */
} dummy_data_t;
int dummy_initialize(interface_t *interface, void *cfg) {
dummy_data_t *data = malloc(sizeof(dummy_data_t));
if (!data) goto ERR_MALLOC;
interface->data = data;
/* Use default values for unspecified configuration parameters */
if (cfg) {
data->cfg = *(dummy_cfg_t *)cfg;
} else {
memset(&data->cfg, 0, sizeof(data->cfg));
}
/* ... */
data->fd = 0;
#if 0
if (interface_register_fd(interface, data->fd, NULL) < 0) {
ERROR("[dummy_initialize] Error registering fd");
goto ERR_FD;
}
#endif
/* ... */
/*
* We should return a negative value in case of error, and a positive value
* otherwise:
* - a file descriptor (>0) will be added to the event loop; or
* - 0 if we don't use any file descriptor
*/
return 0;
ERR_FD:
ERR_MALLOC:
return -1;
}
int dummy_finalize(interface_t *interface) {
dummy_data_t *data = (dummy_data_t *)interface->data;
if (data->fd > 0) close(data->fd);
return 0;
}
int dummy_callback(interface_t *interface) {
dummy_data_t *data = (dummy_data_t *)interface->data;
UNUSED(data);
/* ... */
return 0;
}
int dummy_on_event(interface_t *interface, facelet_t *facelet) {
dummy_data_t *data = (dummy_data_t *)interface->data;
UNUSED(data);
/* ... */
return 0;
}
interface_ops_t dummy_ops = {
.type = "dummy",
.initialize = dummy_initialize,
.finalize = dummy_finalize,
.callback = dummy_callback,
.on_event = dummy_on_event,
};
|