xref: /aosp_15_r20/external/libwebsockets/plugins/protocol_dumb_increment.c (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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