1*1c60b9acSAndroid Build Coastguard Worker /*
2*1c60b9acSAndroid Build Coastguard Worker * ws protocol handler plugin for "dumb increment"
3*1c60b9acSAndroid Build Coastguard Worker *
4*1c60b9acSAndroid Build Coastguard Worker * Written in 2010-2019 by Andy Green <[email protected]>
5*1c60b9acSAndroid Build Coastguard Worker *
6*1c60b9acSAndroid Build Coastguard Worker * This file is made available under the Creative Commons CC0 1.0
7*1c60b9acSAndroid Build Coastguard Worker * Universal Public Domain Dedication.
8*1c60b9acSAndroid Build Coastguard Worker *
9*1c60b9acSAndroid Build Coastguard Worker * The person who associated a work with this deed has dedicated
10*1c60b9acSAndroid Build Coastguard Worker * the work to the public domain by waiving all of his or her rights
11*1c60b9acSAndroid Build Coastguard Worker * to the work worldwide under copyright law, including all related
12*1c60b9acSAndroid Build Coastguard Worker * and neighboring rights, to the extent allowed by law. You can copy,
13*1c60b9acSAndroid Build Coastguard Worker * modify, distribute and perform the work, even for commercial purposes,
14*1c60b9acSAndroid Build Coastguard Worker * all without asking permission.
15*1c60b9acSAndroid Build Coastguard Worker *
16*1c60b9acSAndroid Build Coastguard Worker * These test plugins are intended to be adapted for use in your code, which
17*1c60b9acSAndroid Build Coastguard Worker * may be proprietary. So unlike the library itself, they are licensed
18*1c60b9acSAndroid Build Coastguard Worker * Public Domain.
19*1c60b9acSAndroid Build Coastguard Worker */
20*1c60b9acSAndroid Build Coastguard Worker
21*1c60b9acSAndroid Build Coastguard Worker #if !defined (LWS_PLUGIN_STATIC)
22*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_DLL)
23*1c60b9acSAndroid Build Coastguard Worker #define LWS_DLL
24*1c60b9acSAndroid Build Coastguard Worker #endif
25*1c60b9acSAndroid Build Coastguard Worker #if !defined(LWS_INTERNAL)
26*1c60b9acSAndroid Build Coastguard Worker #define LWS_INTERNAL
27*1c60b9acSAndroid Build Coastguard Worker #endif
28*1c60b9acSAndroid Build Coastguard Worker #include <libwebsockets.h>
29*1c60b9acSAndroid Build Coastguard Worker #endif
30*1c60b9acSAndroid Build Coastguard Worker
31*1c60b9acSAndroid Build Coastguard Worker #include <string.h>
32*1c60b9acSAndroid Build Coastguard Worker
33*1c60b9acSAndroid Build Coastguard Worker #define DUMB_PERIOD_US 50000
34*1c60b9acSAndroid Build Coastguard Worker
35*1c60b9acSAndroid Build Coastguard Worker struct pss__dumb_increment {
36*1c60b9acSAndroid Build Coastguard Worker int number;
37*1c60b9acSAndroid Build Coastguard Worker };
38*1c60b9acSAndroid Build Coastguard Worker
39*1c60b9acSAndroid Build Coastguard Worker struct vhd__dumb_increment {
40*1c60b9acSAndroid Build Coastguard Worker const unsigned int *options;
41*1c60b9acSAndroid Build Coastguard Worker };
42*1c60b9acSAndroid Build Coastguard Worker
43*1c60b9acSAndroid Build Coastguard Worker static int
callback_dumb_increment(struct lws * wsi,enum lws_callback_reasons reason,void * user,void * in,size_t len)44*1c60b9acSAndroid Build Coastguard Worker callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
45*1c60b9acSAndroid Build Coastguard Worker void *user, void *in, size_t len)
46*1c60b9acSAndroid Build Coastguard Worker {
47*1c60b9acSAndroid Build Coastguard Worker struct pss__dumb_increment *pss = (struct pss__dumb_increment *)user;
48*1c60b9acSAndroid Build Coastguard Worker struct vhd__dumb_increment *vhd =
49*1c60b9acSAndroid Build Coastguard Worker (struct vhd__dumb_increment *)
50*1c60b9acSAndroid Build Coastguard Worker lws_protocol_vh_priv_get(lws_get_vhost(wsi),
51*1c60b9acSAndroid Build Coastguard Worker lws_get_protocol(wsi));
52*1c60b9acSAndroid Build Coastguard Worker uint8_t buf[LWS_PRE + 20], *p = &buf[LWS_PRE];
53*1c60b9acSAndroid Build Coastguard Worker const struct lws_protocol_vhost_options *opt;
54*1c60b9acSAndroid Build Coastguard Worker int n, m;
55*1c60b9acSAndroid Build Coastguard Worker
56*1c60b9acSAndroid Build Coastguard Worker switch (reason) {
57*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_PROTOCOL_INIT:
58*1c60b9acSAndroid Build Coastguard Worker vhd = lws_protocol_vh_priv_zalloc(lws_get_vhost(wsi),
59*1c60b9acSAndroid Build Coastguard Worker lws_get_protocol(wsi),
60*1c60b9acSAndroid Build Coastguard Worker sizeof(struct vhd__dumb_increment));
61*1c60b9acSAndroid Build Coastguard Worker if (!vhd)
62*1c60b9acSAndroid Build Coastguard Worker return 0;
63*1c60b9acSAndroid Build Coastguard Worker if ((opt = lws_pvo_search(
64*1c60b9acSAndroid Build Coastguard Worker (const struct lws_protocol_vhost_options *)in,
65*1c60b9acSAndroid Build Coastguard Worker "options")))
66*1c60b9acSAndroid Build Coastguard Worker vhd->options = (unsigned int *)opt->value;
67*1c60b9acSAndroid Build Coastguard Worker break;
68*1c60b9acSAndroid Build Coastguard Worker
69*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_ESTABLISHED:
70*1c60b9acSAndroid Build Coastguard Worker pss->number = 0;
71*1c60b9acSAndroid Build Coastguard Worker if (!vhd->options || !((*vhd->options) & 1))
72*1c60b9acSAndroid Build Coastguard Worker lws_set_timer_usecs(wsi, DUMB_PERIOD_US);
73*1c60b9acSAndroid Build Coastguard Worker break;
74*1c60b9acSAndroid Build Coastguard Worker
75*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_SERVER_WRITEABLE:
76*1c60b9acSAndroid Build Coastguard Worker n = lws_snprintf((char *)p, sizeof(buf) - LWS_PRE, "%d",
77*1c60b9acSAndroid Build Coastguard Worker pss->number++);
78*1c60b9acSAndroid Build Coastguard Worker m = lws_write(wsi, p, (unsigned int)n, LWS_WRITE_TEXT);
79*1c60b9acSAndroid Build Coastguard Worker if (m < n) {
80*1c60b9acSAndroid Build Coastguard Worker lwsl_err("ERROR %d writing to di socket\n", n);
81*1c60b9acSAndroid Build Coastguard Worker return -1;
82*1c60b9acSAndroid Build Coastguard Worker }
83*1c60b9acSAndroid Build Coastguard Worker break;
84*1c60b9acSAndroid Build Coastguard Worker
85*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_RECEIVE:
86*1c60b9acSAndroid Build Coastguard Worker if (len < 6)
87*1c60b9acSAndroid Build Coastguard Worker break;
88*1c60b9acSAndroid Build Coastguard Worker if (strncmp((const char *)in, "reset\n", 6) == 0)
89*1c60b9acSAndroid Build Coastguard Worker pss->number = 0;
90*1c60b9acSAndroid Build Coastguard Worker if (strncmp((const char *)in, "closeme\n", 8) == 0) {
91*1c60b9acSAndroid Build Coastguard Worker lwsl_notice("dumb_inc: closing as requested\n");
92*1c60b9acSAndroid Build Coastguard Worker lws_close_reason(wsi, LWS_CLOSE_STATUS_GOINGAWAY,
93*1c60b9acSAndroid Build Coastguard Worker (unsigned char *)"seeya", 5);
94*1c60b9acSAndroid Build Coastguard Worker return -1;
95*1c60b9acSAndroid Build Coastguard Worker }
96*1c60b9acSAndroid Build Coastguard Worker break;
97*1c60b9acSAndroid Build Coastguard Worker
98*1c60b9acSAndroid Build Coastguard Worker case LWS_CALLBACK_TIMER:
99*1c60b9acSAndroid Build Coastguard Worker if (!vhd->options || !((*vhd->options) & 1)) {
100*1c60b9acSAndroid Build Coastguard Worker lws_callback_on_writable_all_protocol_vhost(
101*1c60b9acSAndroid Build Coastguard Worker lws_get_vhost(wsi), lws_get_protocol(wsi));
102*1c60b9acSAndroid Build Coastguard Worker lws_set_timer_usecs(wsi, DUMB_PERIOD_US);
103*1c60b9acSAndroid Build Coastguard Worker }
104*1c60b9acSAndroid Build Coastguard Worker break;
105*1c60b9acSAndroid Build Coastguard Worker
106*1c60b9acSAndroid Build Coastguard Worker default:
107*1c60b9acSAndroid Build Coastguard Worker break;
108*1c60b9acSAndroid Build Coastguard Worker }
109*1c60b9acSAndroid Build Coastguard Worker
110*1c60b9acSAndroid Build Coastguard Worker return 0;
111*1c60b9acSAndroid Build Coastguard Worker }
112*1c60b9acSAndroid Build Coastguard Worker
113*1c60b9acSAndroid Build Coastguard Worker #define LWS_PLUGIN_PROTOCOL_DUMB_INCREMENT \
114*1c60b9acSAndroid Build Coastguard Worker { \
115*1c60b9acSAndroid Build Coastguard Worker "dumb-increment-protocol", \
116*1c60b9acSAndroid Build Coastguard Worker callback_dumb_increment, \
117*1c60b9acSAndroid Build Coastguard Worker sizeof(struct pss__dumb_increment), \
118*1c60b9acSAndroid Build Coastguard Worker 10, /* rx buf size must be >= permessage-deflate rx size */ \
119*1c60b9acSAndroid Build Coastguard Worker 0, NULL, 0 \
120*1c60b9acSAndroid Build Coastguard Worker }
121*1c60b9acSAndroid Build Coastguard Worker
122*1c60b9acSAndroid Build Coastguard Worker #if !defined (LWS_PLUGIN_STATIC)
123*1c60b9acSAndroid Build Coastguard Worker
124*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE const struct lws_protocols dumb_increment_protocols[] = {
125*1c60b9acSAndroid Build Coastguard Worker LWS_PLUGIN_PROTOCOL_DUMB_INCREMENT
126*1c60b9acSAndroid Build Coastguard Worker };
127*1c60b9acSAndroid Build Coastguard Worker
128*1c60b9acSAndroid Build Coastguard Worker LWS_VISIBLE const lws_plugin_protocol_t dumb_increment = {
129*1c60b9acSAndroid Build Coastguard Worker .hdr = {
130*1c60b9acSAndroid Build Coastguard Worker "dumb increment",
131*1c60b9acSAndroid Build Coastguard Worker "lws_protocol_plugin",
132*1c60b9acSAndroid Build Coastguard Worker LWS_BUILD_HASH,
133*1c60b9acSAndroid Build Coastguard Worker LWS_PLUGIN_API_MAGIC
134*1c60b9acSAndroid Build Coastguard Worker },
135*1c60b9acSAndroid Build Coastguard Worker
136*1c60b9acSAndroid Build Coastguard Worker .protocols = dumb_increment_protocols,
137*1c60b9acSAndroid Build Coastguard Worker .count_protocols = LWS_ARRAY_SIZE(dumb_increment_protocols),
138*1c60b9acSAndroid Build Coastguard Worker .extensions = NULL,
139*1c60b9acSAndroid Build Coastguard Worker .count_extensions = 0,
140*1c60b9acSAndroid Build Coastguard Worker };
141*1c60b9acSAndroid Build Coastguard Worker
142*1c60b9acSAndroid Build Coastguard Worker #endif
143