forked from sysrepo/sysrepo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathevent_notif_sub_example.c
131 lines (113 loc) · 3.82 KB
/
event_notif_sub_example.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
/**
* @file event_notif_sub_example.c
* @author Rastislav Szabo <[email protected]>, Lukas Macko <[email protected]>,
* Milan Lenco <[email protected]>
* @brief Example usage of sr_event_notif_subscribe function.
* Use this example in combination with rpc_example or rpc_tree_example,
* both of which send the notification as part of the RPC handling procedure.
*
* @copyright
* Copyright 2016 Cisco Systems, Inc.
*
* 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.
*/
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#include <time.h>
#include "sysrepo.h"
#include "sysrepo/values.h"
volatile int exit_application = 0;
static void
event_notif_cb(const sr_ev_notif_type_t notif_type, const char *xpath, const sr_val_t *values, const size_t value_cnt,
time_t timestamp, void *private_ctx)
{
/* print notification */
printf("\n\n ========== RECEIVED EVENT NOTIFICATION ======%s\n\n", ctime(×tamp));
printf(">>> Notification content:\n\n");
for (size_t i = 0; i < value_cnt; ++i) {
sr_print_val(values+i);
}
printf("\n");
/**
* Here you would normally handle the notification.
*/
/**
* Do not deallocate the notification content!
* Values will get freed automatically by sysrepo.
*/
}
static void
sigint_handler(int signum)
{
exit_application = 1;
}
static int
event_notif_subscriber(sr_session_ctx_t *session)
{
sr_subscription_ctx_t *subscription = NULL;
int rc = SR_ERR_OK;
/* subscribe for the notification */
rc = sr_event_notif_subscribe(session, "/turing-machine:paused", event_notif_cb, NULL,
SR_SUBSCR_DEFAULT, &subscription);
if (SR_ERR_OK != rc) {
fprintf(stderr, "Error by sr_event_notif_subscribe: %s\n", sr_strerror(rc));
goto cleanup;
}
printf("\n\n ========== SUBSCRIBED FOR EVENT NOTIFICATION ==========\n\n");
/* loop until ctrl-c is pressed / SIGINT is received */
signal(SIGINT, sigint_handler);
signal(SIGPIPE, SIG_IGN);
while (!exit_application) {
sleep(1000); /* or do some more useful work... */
}
printf("Application exit requested, exiting.\n");
cleanup:
if (NULL != subscription) {
sr_unsubscribe(session, subscription);
}
return rc;
}
int
main(int argc, char **argv)
{
sr_conn_ctx_t *connection = NULL;
sr_session_ctx_t *session = NULL;
int rc = SR_ERR_OK;
/* connect to sysrepo */
rc = sr_connect("example_application", SR_CONN_DEFAULT, &connection);
if (SR_ERR_OK != rc) {
fprintf(stderr, "Error by sr_connect: %s\n", sr_strerror(rc));
goto cleanup;
}
/* start session */
rc = sr_session_start(connection, SR_DS_RUNNING, SR_SESS_DEFAULT, &session);
if (SR_ERR_OK != rc) {
fprintf(stderr, "Error by sr_session_start: %s\n", sr_strerror(rc));
goto cleanup;
}
/* run as an event notification subscriber */
printf("This application will be a subscriber for the 'paused' event notification of 'turing-machine'.\n");
printf("This notification is sent by the RPC handler in rpc_example and rpc_tree_example.\n");
rc = event_notif_subscriber(session);
cleanup:
if (NULL != session) {
sr_session_stop(session);
}
if (NULL != connection) {
sr_disconnect(connection);
}
return rc;
}