1d4afb5ceSopenharmony_ci/*
2d4afb5ceSopenharmony_ci * libwebsockets - small server side websockets and web server implementation
3d4afb5ceSopenharmony_ci *
4d4afb5ceSopenharmony_ci * Copyright (C) 2010 - 2021 Andy Green <andy@warmcat.com>
5d4afb5ceSopenharmony_ci *
6d4afb5ceSopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a copy
7d4afb5ceSopenharmony_ci * of this software and associated documentation files (the "Software"), to
8d4afb5ceSopenharmony_ci * deal in the Software without restriction, including without limitation the
9d4afb5ceSopenharmony_ci * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10d4afb5ceSopenharmony_ci * sell copies of the Software, and to permit persons to whom the Software is
11d4afb5ceSopenharmony_ci * furnished to do so, subject to the following conditions:
12d4afb5ceSopenharmony_ci *
13d4afb5ceSopenharmony_ci * The above copyright notice and this permission notice shall be included in
14d4afb5ceSopenharmony_ci * all copies or substantial portions of the Software.
15d4afb5ceSopenharmony_ci *
16d4afb5ceSopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17d4afb5ceSopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18d4afb5ceSopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19d4afb5ceSopenharmony_ci * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20d4afb5ceSopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21d4afb5ceSopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22d4afb5ceSopenharmony_ci * IN THE SOFTWARE.
23d4afb5ceSopenharmony_ci */
24d4afb5ceSopenharmony_ci
25d4afb5ceSopenharmony_ci/** \defgroup log Logging
26d4afb5ceSopenharmony_ci *
27d4afb5ceSopenharmony_ci * ##Logging
28d4afb5ceSopenharmony_ci *
29d4afb5ceSopenharmony_ci * Lws provides flexible and filterable logging facilities, which can be
30d4afb5ceSopenharmony_ci * used inside lws and in user code.
31d4afb5ceSopenharmony_ci *
32d4afb5ceSopenharmony_ci * Log categories may be individually filtered bitwise, and directed to built-in
33d4afb5ceSopenharmony_ci * sinks for syslog-compatible logging, or a user-defined function.
34d4afb5ceSopenharmony_ci *
35d4afb5ceSopenharmony_ci * Traditional logs use a single, processwide logging context.  New style log
36d4afb5ceSopenharmony_ci * apis (lws_xxx_cx()) can pass the logging context to use in.
37d4afb5ceSopenharmony_ci */
38d4afb5ceSopenharmony_ci///@{
39d4afb5ceSopenharmony_ci
40d4afb5ceSopenharmony_ci#define LLL_ERR			(1 << 0)
41d4afb5ceSopenharmony_ci#define	LLL_WARN		(1 << 1)
42d4afb5ceSopenharmony_ci#define	LLL_NOTICE		(1 << 2)
43d4afb5ceSopenharmony_ci#define	LLL_INFO		(1 << 3)
44d4afb5ceSopenharmony_ci#define	LLL_DEBUG		(1 << 4)
45d4afb5ceSopenharmony_ci#define	LLL_PARSER		(1 << 5)
46d4afb5ceSopenharmony_ci#define	LLL_HEADER		(1 << 6)
47d4afb5ceSopenharmony_ci#define	LLL_EXT			(1 << 7)
48d4afb5ceSopenharmony_ci#define	LLL_CLIENT		(1 << 8)
49d4afb5ceSopenharmony_ci#define	LLL_LATENCY		(1 << 9)
50d4afb5ceSopenharmony_ci#define	LLL_USER		(1 << 10)
51d4afb5ceSopenharmony_ci#define	LLL_THREAD		(1 << 11)
52d4afb5ceSopenharmony_ci
53d4afb5ceSopenharmony_ci#define	LLL_COUNT		(12) /* set to count of valid flags */
54d4afb5ceSopenharmony_ci
55d4afb5ceSopenharmony_ci#define	LLLF_SECRECY_PII	(1 << 16)
56d4afb5ceSopenharmony_ci	/**< contains Personally Identifiable Information */
57d4afb5ceSopenharmony_ci#define LLLF_SECRECY_BEARER	(1 << 17)
58d4afb5ceSopenharmony_ci	/**< possession of this data allows impersonation */
59d4afb5ceSopenharmony_ci
60d4afb5ceSopenharmony_ci#define	LLLF_LOG_TIMESTAMP	(1 << 18)
61d4afb5ceSopenharmony_ci	/**< set to prepend logs with timestamp */
62d4afb5ceSopenharmony_ci
63d4afb5ceSopenharmony_ci#define	LLLF_LOG_CONTEXT_AWARE	(1 << 30)
64d4afb5ceSopenharmony_ci/**< set if the context uses an emit function that takes the logctx, auto-
65d4afb5ceSopenharmony_ci * applied when setting emit using lws_set_log_level_cx() api */
66d4afb5ceSopenharmony_ci
67d4afb5ceSopenharmony_cistruct lws_log_cx;
68d4afb5ceSopenharmony_ci
69d4afb5ceSopenharmony_citypedef void (*lws_log_emit_t)(int level, const char *line);
70d4afb5ceSopenharmony_citypedef void (*lws_log_emit_cx_t)(struct lws_log_cx *cx, int level,
71d4afb5ceSopenharmony_ci				  const char *line, size_t len);
72d4afb5ceSopenharmony_citypedef void (*lws_log_prepend_cx_t)(struct lws_log_cx *cx, void *obj,
73d4afb5ceSopenharmony_ci				     char **p, char *e);
74d4afb5ceSopenharmony_citypedef void (*lws_log_use_cx_t)(struct lws_log_cx *cx, int _new);
75d4afb5ceSopenharmony_ci
76d4afb5ceSopenharmony_ci/*
77d4afb5ceSopenharmony_ci * This is the logging context
78d4afb5ceSopenharmony_ci */
79d4afb5ceSopenharmony_ci
80d4afb5ceSopenharmony_citypedef struct lws_log_cx {
81d4afb5ceSopenharmony_ci	union {
82d4afb5ceSopenharmony_ci		lws_log_emit_t		emit; /* legacy emit function */
83d4afb5ceSopenharmony_ci		lws_log_emit_cx_t	emit_cx; /* LLLF_LOG_CONTEXT_AWARE */
84d4afb5ceSopenharmony_ci	} u;
85d4afb5ceSopenharmony_ci
86d4afb5ceSopenharmony_ci#if LWS_MAX_SMP > 1
87d4afb5ceSopenharmony_ci	pthread_mutex_t			refcount_lock;
88d4afb5ceSopenharmony_ci#endif
89d4afb5ceSopenharmony_ci
90d4afb5ceSopenharmony_ci	lws_log_use_cx_t		refcount_cb;
91d4afb5ceSopenharmony_ci	/**< NULL, or a function called after each change to .refcount below,
92d4afb5ceSopenharmony_ci	 * this enables implementing side-effects like opening and closing
93d4afb5ceSopenharmony_ci	 * log files when the first and last object binds / unbinds */
94d4afb5ceSopenharmony_ci	lws_log_prepend_cx_t		prepend;
95d4afb5ceSopenharmony_ci	/**< NULL, or a cb to optionally prepend a string to logs we are a
96d4afb5ceSopenharmony_ci	 * parent of */
97d4afb5ceSopenharmony_ci	struct lws_log_cx		*parent;
98d4afb5ceSopenharmony_ci	/**< NULL, or points to log ctx we are a child of */
99d4afb5ceSopenharmony_ci	void				*opaque;
100d4afb5ceSopenharmony_ci	/**< ignored by lws, used to pass config to emit_cx, eg, filepath */
101d4afb5ceSopenharmony_ci	void				*stg;
102d4afb5ceSopenharmony_ci	/**< ignored by lws, may be used a storage by refcount_cb / emit_cx */
103d4afb5ceSopenharmony_ci	uint32_t			lll_flags;
104d4afb5ceSopenharmony_ci	/**< mask of log levels we want to emit in this context */
105d4afb5ceSopenharmony_ci	int32_t				refcount;
106d4afb5ceSopenharmony_ci	/**< refcount of objects bound to this log context */
107d4afb5ceSopenharmony_ci#if LWS_MAX_SMP > 1
108d4afb5ceSopenharmony_ci	char				inited;
109d4afb5ceSopenharmony_ci#endif
110d4afb5ceSopenharmony_ci} lws_log_cx_t;
111d4afb5ceSopenharmony_ci
112d4afb5ceSopenharmony_ci/**
113d4afb5ceSopenharmony_ci * lwsl_timestamp: generate logging timestamp string
114d4afb5ceSopenharmony_ci *
115d4afb5ceSopenharmony_ci * \param level:	logging level
116d4afb5ceSopenharmony_ci * \param p:		char * buffer to take timestamp
117d4afb5ceSopenharmony_ci * \param len:	length of p
118d4afb5ceSopenharmony_ci *
119d4afb5ceSopenharmony_ci * returns length written in p
120d4afb5ceSopenharmony_ci */
121d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN int
122d4afb5ceSopenharmony_cilwsl_timestamp(int level, char *p, size_t len);
123d4afb5ceSopenharmony_ci
124d4afb5ceSopenharmony_ci#if defined(LWS_PLAT_OPTEE) && !defined(LWS_WITH_NETWORK)
125d4afb5ceSopenharmony_ci#define _lws_log(aaa, ...) SMSG(__VA_ARGS__)
126d4afb5ceSopenharmony_ci#else
127d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
128d4afb5ceSopenharmony_ci_lws_log(int filter, const char *format, ...) LWS_FORMAT(2);
129d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
130d4afb5ceSopenharmony_ci_lws_logv(int filter, const char *format, va_list vl);
131d4afb5ceSopenharmony_ci#endif
132d4afb5ceSopenharmony_ci
133d4afb5ceSopenharmony_cistruct lws_vhost;
134d4afb5ceSopenharmony_cistruct lws;
135d4afb5ceSopenharmony_ci
136d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN struct lws_log_cx *
137d4afb5ceSopenharmony_cilwsl_context_get_cx(struct lws_context *cx);
138d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN struct lws_log_cx *
139d4afb5ceSopenharmony_cilwsl_vhost_get_cx(struct lws_vhost *vh);
140d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN struct lws_log_cx *
141d4afb5ceSopenharmony_cilwsl_wsi_get_cx(struct lws *wsi);
142d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS)
143d4afb5ceSopenharmony_cistruct lws_ss_handle;
144d4afb5ceSopenharmony_cistruct lws_sspc_handle;
145d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN struct lws_log_cx *
146d4afb5ceSopenharmony_cilwsl_ss_get_cx(struct lws_ss_handle *ss);
147d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN struct lws_log_cx *
148d4afb5ceSopenharmony_cilwsl_sspc_get_cx(struct lws_sspc_handle *ss);
149d4afb5ceSopenharmony_ci#endif
150d4afb5ceSopenharmony_ci
151d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
152d4afb5ceSopenharmony_cilws_log_emit_cx_file(struct lws_log_cx *cx, int level, const char *line,
153d4afb5ceSopenharmony_ci			size_t len);
154d4afb5ceSopenharmony_ci
155d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
156d4afb5ceSopenharmony_cilws_log_use_cx_file(struct lws_log_cx *cx, int _new);
157d4afb5ceSopenharmony_ci
158d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
159d4afb5ceSopenharmony_cilws_log_prepend_context(struct lws_log_cx *cx, void *obj, char **p, char *e);
160d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
161d4afb5ceSopenharmony_cilws_log_prepend_vhost(struct lws_log_cx *cx, void *obj, char **p, char *e);
162d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
163d4afb5ceSopenharmony_cilws_log_prepend_wsi(struct lws_log_cx *cx, void *obj, char **p, char *e);
164d4afb5ceSopenharmony_ci#if defined(LWS_WITH_SECURE_STREAMS)
165d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
166d4afb5ceSopenharmony_cilws_log_prepend_ss(struct lws_log_cx *cx, void *obj, char **p, char *e);
167d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
168d4afb5ceSopenharmony_cilws_log_prepend_sspc(struct lws_log_cx *cx, void *obj, char **p, char *e);
169d4afb5ceSopenharmony_ci#endif
170d4afb5ceSopenharmony_ci
171d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
172d4afb5ceSopenharmony_ci_lws_log_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj,
173d4afb5ceSopenharmony_ci	    int filter, const char *_fun, const char *format, ...) LWS_FORMAT(6);
174d4afb5ceSopenharmony_ci
175d4afb5ceSopenharmony_ci#define lwsl_cx(_c, _fil, ...) \
176d4afb5ceSopenharmony_ci		 _lws_log_cx(lwsl_context_get_cx(_c), lws_log_prepend_context, \
177d4afb5ceSopenharmony_ci					_c, _fil, __func__, __VA_ARGS__)
178d4afb5ceSopenharmony_ci#define lwsl_vhost(_v, _fil, ...) \
179d4afb5ceSopenharmony_ci		 _lws_log_cx(lwsl_vhost_get_cx(_v), lws_log_prepend_vhost, _v, \
180d4afb5ceSopenharmony_ci					_fil, __func__, __VA_ARGS__)
181d4afb5ceSopenharmony_ci#define lwsl_wsi(_w, _fil, ...) \
182d4afb5ceSopenharmony_ci		 _lws_log_cx(lwsl_wsi_get_cx(_w), lws_log_prepend_wsi, _w, \
183d4afb5ceSopenharmony_ci					_fil, __func__, __VA_ARGS__)
184d4afb5ceSopenharmony_ci#define lwsl_ss(_h, _fil, ...) \
185d4afb5ceSopenharmony_ci		 _lws_log_cx(lwsl_ss_get_cx(_h), lws_log_prepend_ss, _h, \
186d4afb5ceSopenharmony_ci					_fil, __func__, __VA_ARGS__)
187d4afb5ceSopenharmony_ci
188d4afb5ceSopenharmony_ci#define lwsl_hexdump_context(_c, _fil, _buf, _len) \
189d4afb5ceSopenharmony_ci		lwsl_hexdump_level_cx(lwsl_context_get_cx(_c), \
190d4afb5ceSopenharmony_ci				      lws_log_prepend_context, \
191d4afb5ceSopenharmony_ci				      _c, _fil, _buf, _len)
192d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost(_v, _fil, _buf, _len) \
193d4afb5ceSopenharmony_ci		lwsl_hexdump_level_cx(lwsl_vhost_get_cx(_v), \
194d4afb5ceSopenharmony_ci				      lws_log_prepend_vhost, \
195d4afb5ceSopenharmony_ci				      _v, _fil, _buf, _len)
196d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi(_w, _fil, _buf, _len) \
197d4afb5ceSopenharmony_ci		lwsl_hexdump_level_cx(lwsl_wsi_get_cx(_w), \
198d4afb5ceSopenharmony_ci				      lws_log_prepend_wsi, \
199d4afb5ceSopenharmony_ci				      _w, _fil, _buf, _len)
200d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss(_h, _fil, _buf, _len) \
201d4afb5ceSopenharmony_ci		lwsl_hexdump_level_cx(lwsl_ss_get_cx(_h), \
202d4afb5ceSopenharmony_ci				      lws_log_prepend_ss, \
203d4afb5ceSopenharmony_ci				      _h, _fil, _buf, _len)
204d4afb5ceSopenharmony_ci
205d4afb5ceSopenharmony_ci/*
206d4afb5ceSopenharmony_ci * Figure out which logs to build in or not
207d4afb5ceSopenharmony_ci */
208d4afb5ceSopenharmony_ci
209d4afb5ceSopenharmony_ci#if defined(_DEBUG)
210d4afb5ceSopenharmony_ci /*
211d4afb5ceSopenharmony_ci  * In DEBUG build, select all logs unless NO_LOGS
212d4afb5ceSopenharmony_ci  */
213d4afb5ceSopenharmony_ci #if defined(LWS_WITH_NO_LOGS)
214d4afb5ceSopenharmony_ci  #define _LWS_LINIT (LLL_ERR | LLL_USER)
215d4afb5ceSopenharmony_ci #else
216d4afb5ceSopenharmony_ci   #define _LWS_LINIT ((1 << LLL_COUNT) - 1)
217d4afb5ceSopenharmony_ci #endif
218d4afb5ceSopenharmony_ci#else /* not _DEBUG */
219d4afb5ceSopenharmony_ci#if defined(LWS_WITH_NO_LOGS)
220d4afb5ceSopenharmony_ci#define _LWS_LINIT (LLL_ERR | LLL_USER)
221d4afb5ceSopenharmony_ci#else
222d4afb5ceSopenharmony_ci #define _LWS_LINIT (LLL_ERR | LLL_USER | LLL_WARN | LLL_NOTICE)
223d4afb5ceSopenharmony_ci#endif
224d4afb5ceSopenharmony_ci#endif /* _DEBUG */
225d4afb5ceSopenharmony_ci
226d4afb5ceSopenharmony_ci/*
227d4afb5ceSopenharmony_ci * Create either empty overrides or the ones forced at build-time.
228d4afb5ceSopenharmony_ci * These overrides have the final say... any bits set in
229d4afb5ceSopenharmony_ci * LWS_LOGGING_BITFIELD_SET force the build of those logs, any bits
230d4afb5ceSopenharmony_ci * set in LWS_LOGGING_BITFIELD_CLEAR disable the build of those logs.
231d4afb5ceSopenharmony_ci *
232d4afb5ceSopenharmony_ci * If not defined lws decides based on CMAKE_BUILD_TYPE=DEBUG or not
233d4afb5ceSopenharmony_ci */
234d4afb5ceSopenharmony_ci
235d4afb5ceSopenharmony_ci#if defined(LWS_LOGGING_BITFIELD_SET)
236d4afb5ceSopenharmony_ci #define _LWS_LBS (LWS_LOGGING_BITFIELD_SET)
237d4afb5ceSopenharmony_ci#else
238d4afb5ceSopenharmony_ci #define _LWS_LBS 0
239d4afb5ceSopenharmony_ci#endif
240d4afb5ceSopenharmony_ci
241d4afb5ceSopenharmony_ci#if defined(LWS_LOGGING_BITFIELD_CLEAR)
242d4afb5ceSopenharmony_ci #define _LWS_LBC (LWS_LOGGING_BITFIELD_CLEAR)
243d4afb5ceSopenharmony_ci#else
244d4afb5ceSopenharmony_ci #define _LWS_LBC 0
245d4afb5ceSopenharmony_ci#endif
246d4afb5ceSopenharmony_ci
247d4afb5ceSopenharmony_ci/*
248d4afb5ceSopenharmony_ci * Compute the final active logging bitfield for build
249d4afb5ceSopenharmony_ci */
250d4afb5ceSopenharmony_ci#define _LWS_ENABLED_LOGS (((_LWS_LINIT) | (_LWS_LBS)) & ~(_LWS_LBC))
251d4afb5ceSopenharmony_ci
252d4afb5ceSopenharmony_ci/*
253d4afb5ceSopenharmony_ci * Individually enable or disable log levels for build
254d4afb5ceSopenharmony_ci * depending on what was computed
255d4afb5ceSopenharmony_ci */
256d4afb5ceSopenharmony_ci
257d4afb5ceSopenharmony_ci/*
258d4afb5ceSopenharmony_ci * Process scope logs
259d4afb5ceSopenharmony_ci */
260d4afb5ceSopenharmony_ci
261d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_ERR)
262d4afb5ceSopenharmony_ci#define lwsl_err(...) _lws_log(LLL_ERR, __VA_ARGS__)
263d4afb5ceSopenharmony_ci#else
264d4afb5ceSopenharmony_ci#define lwsl_err(...) do {} while(0)
265d4afb5ceSopenharmony_ci#endif
266d4afb5ceSopenharmony_ci
267d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_WARN)
268d4afb5ceSopenharmony_ci#define lwsl_warn(...) _lws_log(LLL_WARN, __VA_ARGS__)
269d4afb5ceSopenharmony_ci#else
270d4afb5ceSopenharmony_ci#define lwsl_warn(...) do {} while(0)
271d4afb5ceSopenharmony_ci#endif
272d4afb5ceSopenharmony_ci
273d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
274d4afb5ceSopenharmony_ci#define lwsl_notice(...) _lws_log(LLL_NOTICE, __VA_ARGS__)
275d4afb5ceSopenharmony_ci#else
276d4afb5ceSopenharmony_ci#define lwsl_notice(...) do {} while(0)
277d4afb5ceSopenharmony_ci#endif
278d4afb5ceSopenharmony_ci
279d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_INFO)
280d4afb5ceSopenharmony_ci#define lwsl_info(...) _lws_log(LLL_INFO, __VA_ARGS__)
281d4afb5ceSopenharmony_ci#else
282d4afb5ceSopenharmony_ci#define lwsl_info(...) do {} while(0)
283d4afb5ceSopenharmony_ci#endif
284d4afb5ceSopenharmony_ci
285d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
286d4afb5ceSopenharmony_ci#define lwsl_debug(...) _lws_log(LLL_DEBUG, __VA_ARGS__)
287d4afb5ceSopenharmony_ci#else
288d4afb5ceSopenharmony_ci#define lwsl_debug(...) do {} while(0)
289d4afb5ceSopenharmony_ci#endif
290d4afb5ceSopenharmony_ci
291d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_PARSER)
292d4afb5ceSopenharmony_ci#define lwsl_parser(...) _lws_log(LLL_PARSER, __VA_ARGS__)
293d4afb5ceSopenharmony_ci#else
294d4afb5ceSopenharmony_ci#define lwsl_parser(...) do {} while(0)
295d4afb5ceSopenharmony_ci#endif
296d4afb5ceSopenharmony_ci
297d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_HEADER)
298d4afb5ceSopenharmony_ci#define lwsl_header(...) _lws_log(LLL_HEADER, __VA_ARGS__)
299d4afb5ceSopenharmony_ci#else
300d4afb5ceSopenharmony_ci#define lwsl_header(...) do {} while(0)
301d4afb5ceSopenharmony_ci#endif
302d4afb5ceSopenharmony_ci
303d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_EXT)
304d4afb5ceSopenharmony_ci#define lwsl_ext(...) _lws_log(LLL_EXT, __VA_ARGS__)
305d4afb5ceSopenharmony_ci#else
306d4afb5ceSopenharmony_ci#define lwsl_ext(...) do {} while(0)
307d4afb5ceSopenharmony_ci#endif
308d4afb5ceSopenharmony_ci
309d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
310d4afb5ceSopenharmony_ci#define lwsl_client(...) _lws_log(LLL_CLIENT, __VA_ARGS__)
311d4afb5ceSopenharmony_ci#else
312d4afb5ceSopenharmony_ci#define lwsl_client(...) do {} while(0)
313d4afb5ceSopenharmony_ci#endif
314d4afb5ceSopenharmony_ci
315d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
316d4afb5ceSopenharmony_ci#define lwsl_latency(...) _lws_log(LLL_LATENCY, __VA_ARGS__)
317d4afb5ceSopenharmony_ci#else
318d4afb5ceSopenharmony_ci#define lwsl_latency(...) do {} while(0)
319d4afb5ceSopenharmony_ci#endif
320d4afb5ceSopenharmony_ci
321d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_THREAD)
322d4afb5ceSopenharmony_ci#define lwsl_thread(...) _lws_log(LLL_THREAD, __VA_ARGS__)
323d4afb5ceSopenharmony_ci#else
324d4afb5ceSopenharmony_ci#define lwsl_thread(...) do {} while(0)
325d4afb5ceSopenharmony_ci#endif
326d4afb5ceSopenharmony_ci
327d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_USER)
328d4afb5ceSopenharmony_ci#define lwsl_user(...) _lws_log(LLL_USER, __VA_ARGS__)
329d4afb5ceSopenharmony_ci#else
330d4afb5ceSopenharmony_ci#define lwsl_user(...) do {} while(0)
331d4afb5ceSopenharmony_ci#endif
332d4afb5ceSopenharmony_ci
333d4afb5ceSopenharmony_ci#define lwsl_hexdump_err(...) lwsl_hexdump_level(LLL_ERR, __VA_ARGS__)
334d4afb5ceSopenharmony_ci#define lwsl_hexdump_warn(...) lwsl_hexdump_level(LLL_WARN, __VA_ARGS__)
335d4afb5ceSopenharmony_ci#define lwsl_hexdump_notice(...) lwsl_hexdump_level(LLL_NOTICE, __VA_ARGS__)
336d4afb5ceSopenharmony_ci#define lwsl_hexdump_info(...) lwsl_hexdump_level(LLL_INFO, __VA_ARGS__)
337d4afb5ceSopenharmony_ci#define lwsl_hexdump_debug(...) lwsl_hexdump_level(LLL_DEBUG, __VA_ARGS__)
338d4afb5ceSopenharmony_ci
339d4afb5ceSopenharmony_ci/*
340d4afb5ceSopenharmony_ci * lws_context scope logs
341d4afb5ceSopenharmony_ci */
342d4afb5ceSopenharmony_ci
343d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_ERR)
344d4afb5ceSopenharmony_ci#define lwsl_cx_err(_c, ...) lwsl_cx(_c, LLL_ERR, __VA_ARGS__)
345d4afb5ceSopenharmony_ci#else
346d4afb5ceSopenharmony_ci#define lwsl_cx_err(_c, ...) do {} while(0)
347d4afb5ceSopenharmony_ci#endif
348d4afb5ceSopenharmony_ci
349d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_WARN)
350d4afb5ceSopenharmony_ci#define lwsl_cx_warn(_c, ...) lwsl_cx(_c, LLL_WARN, __VA_ARGS__)
351d4afb5ceSopenharmony_ci#else
352d4afb5ceSopenharmony_ci#define lwsl_cx_warn(_c, ...) do {} while(0)
353d4afb5ceSopenharmony_ci#endif
354d4afb5ceSopenharmony_ci
355d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
356d4afb5ceSopenharmony_ci#define lwsl_cx_notice(_c, ...) lwsl_cx(_c, LLL_NOTICE, __VA_ARGS__)
357d4afb5ceSopenharmony_ci#else
358d4afb5ceSopenharmony_ci#define lwsl_cx_notice(_c, ...) do {} while(0)
359d4afb5ceSopenharmony_ci#endif
360d4afb5ceSopenharmony_ci
361d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_INFO)
362d4afb5ceSopenharmony_ci#define lwsl_cx_info(_c, ...) lwsl_cx(_c, LLL_INFO, __VA_ARGS__)
363d4afb5ceSopenharmony_ci#else
364d4afb5ceSopenharmony_ci#define lwsl_cx_info(_c, ...) do {} while(0)
365d4afb5ceSopenharmony_ci#endif
366d4afb5ceSopenharmony_ci
367d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
368d4afb5ceSopenharmony_ci#define lwsl_cx_debug(_c, ...) lwsl_cx(_c, LLL_DEBUG, __VA_ARGS__)
369d4afb5ceSopenharmony_ci#else
370d4afb5ceSopenharmony_ci#define lwsl_cx_debug(_c, ...) do {} while(0)
371d4afb5ceSopenharmony_ci#endif
372d4afb5ceSopenharmony_ci
373d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_PARSER)
374d4afb5ceSopenharmony_ci#define lwsl_cx_parser(_c, ...) lwsl_cx(_c, LLL_PARSER, __VA_ARGS__)
375d4afb5ceSopenharmony_ci#else
376d4afb5ceSopenharmony_ci#define lwsl_cx_parser(_c, ...) do {} while(0)
377d4afb5ceSopenharmony_ci#endif
378d4afb5ceSopenharmony_ci
379d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_HEADER)
380d4afb5ceSopenharmony_ci#define lwsl_cx_header(_c, ...) lwsl_cx(_c, LLL_HEADER, __VA_ARGS__)
381d4afb5ceSopenharmony_ci#else
382d4afb5ceSopenharmony_ci#define lwsl_cx_header(_c, ...) do {} while(0)
383d4afb5ceSopenharmony_ci#endif
384d4afb5ceSopenharmony_ci
385d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_EXT)
386d4afb5ceSopenharmony_ci#define lwsl_cx_ext(_c, ...) lwsl_cx(_c, LLL_EXT, __VA_ARGS__)
387d4afb5ceSopenharmony_ci#else
388d4afb5ceSopenharmony_ci#define lwsl_cx_ext(_c, ...) do {} while(0)
389d4afb5ceSopenharmony_ci#endif
390d4afb5ceSopenharmony_ci
391d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
392d4afb5ceSopenharmony_ci#define lwsl_cx_client(_c, ...) lwsl_cx(_c, LLL_CLIENT, __VA_ARGS__)
393d4afb5ceSopenharmony_ci#else
394d4afb5ceSopenharmony_ci#define lwsl_cx_client(_c, ...) do {} while(0)
395d4afb5ceSopenharmony_ci#endif
396d4afb5ceSopenharmony_ci
397d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
398d4afb5ceSopenharmony_ci#define lwsl_cx_latency(_c, ...) lwsl_cx(_c, LLL_LATENCY, __VA_ARGS__)
399d4afb5ceSopenharmony_ci#else
400d4afb5ceSopenharmony_ci#define lwsl_cx_latency(_c, ...) do {} while(0)
401d4afb5ceSopenharmony_ci#endif
402d4afb5ceSopenharmony_ci
403d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_THREAD)
404d4afb5ceSopenharmony_ci#define lwsl_cx_thread(_c, ...) lwsl_cx(_c, LLL_THREAD, __VA_ARGS__)
405d4afb5ceSopenharmony_ci#else
406d4afb5ceSopenharmony_ci#define lwsl_cx_thread(_c, ...) do {} while(0)
407d4afb5ceSopenharmony_ci#endif
408d4afb5ceSopenharmony_ci
409d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_USER)
410d4afb5ceSopenharmony_ci#define lwsl_cx_user(_c, ...) lwsl_cx(_c, LLL_USER, __VA_ARGS__)
411d4afb5ceSopenharmony_ci#else
412d4afb5ceSopenharmony_ci#define lwsl_cx_user(_c, ...) do {} while(0)
413d4afb5ceSopenharmony_ci#endif
414d4afb5ceSopenharmony_ci
415d4afb5ceSopenharmony_ci#define lwsl_hexdump_cx_err(_c, ...)    lwsl_hexdump_context(_c, LLL_ERR, __VA_ARGS__)
416d4afb5ceSopenharmony_ci#define lwsl_hexdump_cx_warn(_c, ...)   lwsl_hexdump_context(_c, LLL_WARN, __VA_ARGS__)
417d4afb5ceSopenharmony_ci#define lwsl_hexdump_cx_notice(_c, ...) lwsl_hexdump_context(_c, LLL_NOTICE, __VA_ARGS__)
418d4afb5ceSopenharmony_ci#define lwsl_hexdump_cx_info(_c, ...)   lwsl_hexdump_context(_c, LLL_INFO, __VA_ARGS__)
419d4afb5ceSopenharmony_ci#define lwsl_hexdump_cx_debug(_c, ...)  lwsl_hexdump_context(_c, LLL_DEBUG, __VA_ARGS__)
420d4afb5ceSopenharmony_ci
421d4afb5ceSopenharmony_ci/*
422d4afb5ceSopenharmony_ci * lws_vhost
423d4afb5ceSopenharmony_ci */
424d4afb5ceSopenharmony_ci
425d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_ERR)
426d4afb5ceSopenharmony_ci#define lwsl_vhost_err(_v, ...) lwsl_vhost(_v, LLL_ERR, __VA_ARGS__)
427d4afb5ceSopenharmony_ci#else
428d4afb5ceSopenharmony_ci#define lwsl_vhost_err(_v, ...) do {} while(0)
429d4afb5ceSopenharmony_ci#endif
430d4afb5ceSopenharmony_ci
431d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_WARN)
432d4afb5ceSopenharmony_ci#define lwsl_vhost_warn(_v, ...) lwsl_vhost(_v, LLL_WARN, __VA_ARGS__)
433d4afb5ceSopenharmony_ci#else
434d4afb5ceSopenharmony_ci#define lwsl_vhost_warn(_v, ...) do {} while(0)
435d4afb5ceSopenharmony_ci#endif
436d4afb5ceSopenharmony_ci
437d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
438d4afb5ceSopenharmony_ci#define lwsl_vhost_notice(_v, ...) lwsl_vhost(_v, LLL_NOTICE, __VA_ARGS__)
439d4afb5ceSopenharmony_ci#else
440d4afb5ceSopenharmony_ci#define lwsl_vhost_notice(_v, ...) do {} while(0)
441d4afb5ceSopenharmony_ci#endif
442d4afb5ceSopenharmony_ci
443d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_INFO)
444d4afb5ceSopenharmony_ci#define lwsl_vhost_info(_v, ...) lwsl_vhost(_v, LLL_INFO, __VA_ARGS__)
445d4afb5ceSopenharmony_ci#else
446d4afb5ceSopenharmony_ci#define lwsl_vhost_info(_v, ...) do {} while(0)
447d4afb5ceSopenharmony_ci#endif
448d4afb5ceSopenharmony_ci
449d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
450d4afb5ceSopenharmony_ci#define lwsl_vhost_debug(_v, ...) lwsl_vhost(_v, LLL_DEBUG, __VA_ARGS__)
451d4afb5ceSopenharmony_ci#else
452d4afb5ceSopenharmony_ci#define lwsl_vhost_debug(_v, ...) do {} while(0)
453d4afb5ceSopenharmony_ci#endif
454d4afb5ceSopenharmony_ci
455d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_PARSER)
456d4afb5ceSopenharmony_ci#define lwsl_vhost_parser(_v, ...) lwsl_vhost(_v, LLL_PARSER, __VA_ARGS__)
457d4afb5ceSopenharmony_ci#else
458d4afb5ceSopenharmony_ci#define lwsl_vhost_parser(_v, ...) do {} while(0)
459d4afb5ceSopenharmony_ci#endif
460d4afb5ceSopenharmony_ci
461d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_HEADER)
462d4afb5ceSopenharmony_ci#define lwsl_vhost_header(_v, ...) lwsl_vhost(_v, LLL_HEADER, __VA_ARGS__)
463d4afb5ceSopenharmony_ci#else
464d4afb5ceSopenharmony_ci#define lwsl_vhost_header(_v, ...) do {} while(0)
465d4afb5ceSopenharmony_ci#endif
466d4afb5ceSopenharmony_ci
467d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_EXT)
468d4afb5ceSopenharmony_ci#define lwsl_vhost_ext(_v, ...) lwsl_vhost(_v, LLL_EXT, __VA_ARGS__)
469d4afb5ceSopenharmony_ci#else
470d4afb5ceSopenharmony_ci#define lwsl_vhost_ext(_v, ...) do {} while(0)
471d4afb5ceSopenharmony_ci#endif
472d4afb5ceSopenharmony_ci
473d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
474d4afb5ceSopenharmony_ci#define lwsl_vhost_client(_v, ...) lwsl_vhost(_v, LLL_CLIENT, __VA_ARGS__)
475d4afb5ceSopenharmony_ci#else
476d4afb5ceSopenharmony_ci#define lwsl_vhost_client(_v, ...) do {} while(0)
477d4afb5ceSopenharmony_ci#endif
478d4afb5ceSopenharmony_ci
479d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
480d4afb5ceSopenharmony_ci#define lwsl_vhost_latency(_v, ...) lwsl_vhost(_v, LLL_LATENCY, __VA_ARGS__)
481d4afb5ceSopenharmony_ci#else
482d4afb5ceSopenharmony_ci#define lwsl_vhost_latency(_v, ...) do {} while(0)
483d4afb5ceSopenharmony_ci#endif
484d4afb5ceSopenharmony_ci
485d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_THREAD)
486d4afb5ceSopenharmony_ci#define lwsl_vhost_thread(_v, ...) lwsl_vhost(_v, LLL_THREAD, __VA_ARGS__)
487d4afb5ceSopenharmony_ci#else
488d4afb5ceSopenharmony_ci#define lwsl_vhost_thread(_v, ...) do {} while(0)
489d4afb5ceSopenharmony_ci#endif
490d4afb5ceSopenharmony_ci
491d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_USER)
492d4afb5ceSopenharmony_ci#define lwsl_vhost_user(_v, ...) lwsl_vhost(_v, LLL_USER, __VA_ARGS__)
493d4afb5ceSopenharmony_ci#else
494d4afb5ceSopenharmony_ci#define lwsl_vhost_user(_v, ...) do {} while(0)
495d4afb5ceSopenharmony_ci#endif
496d4afb5ceSopenharmony_ci
497d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost_err(_v, ...)    lwsl_hexdump_vhost(_v, LLL_ERR, __VA_ARGS__)
498d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost_warn(_v, ...)   lwsl_hexdump_vhost(_v, LLL_WARN, __VA_ARGS__)
499d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost_notice(_v, ...) lwsl_hexdump_vhost(_v, LLL_NOTICE, __VA_ARGS__)
500d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost_info(_v, ...)   lwsl_hexdump_vhost(_v, LLL_INFO, __VA_ARGS__)
501d4afb5ceSopenharmony_ci#define lwsl_hexdump_vhost_debug(_v, ...)  lwsl_hexdump_vhost(_v, LLL_DEBUG, __VA_ARGS__)
502d4afb5ceSopenharmony_ci
503d4afb5ceSopenharmony_ci
504d4afb5ceSopenharmony_ci/*
505d4afb5ceSopenharmony_ci * lws_wsi
506d4afb5ceSopenharmony_ci */
507d4afb5ceSopenharmony_ci
508d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_ERR)
509d4afb5ceSopenharmony_ci#define lwsl_wsi_err(_w, ...) lwsl_wsi(_w, LLL_ERR, __VA_ARGS__)
510d4afb5ceSopenharmony_ci#else
511d4afb5ceSopenharmony_ci#define lwsl_wsi_err(_w, ...) do {} while(0)
512d4afb5ceSopenharmony_ci#endif
513d4afb5ceSopenharmony_ci
514d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_WARN)
515d4afb5ceSopenharmony_ci#define lwsl_wsi_warn(_w, ...) lwsl_wsi(_w, LLL_WARN, __VA_ARGS__)
516d4afb5ceSopenharmony_ci#else
517d4afb5ceSopenharmony_ci#define lwsl_wsi_warn(_w, ...) do {} while(0)
518d4afb5ceSopenharmony_ci#endif
519d4afb5ceSopenharmony_ci
520d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
521d4afb5ceSopenharmony_ci#define lwsl_wsi_notice(_w, ...) lwsl_wsi(_w, LLL_NOTICE, __VA_ARGS__)
522d4afb5ceSopenharmony_ci#else
523d4afb5ceSopenharmony_ci#define lwsl_wsi_notice(_w, ...) do {} while(0)
524d4afb5ceSopenharmony_ci#endif
525d4afb5ceSopenharmony_ci
526d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_INFO)
527d4afb5ceSopenharmony_ci#define lwsl_wsi_info(_w, ...) lwsl_wsi(_w, LLL_INFO, __VA_ARGS__)
528d4afb5ceSopenharmony_ci#else
529d4afb5ceSopenharmony_ci#define lwsl_wsi_info(_w, ...) do {} while(0)
530d4afb5ceSopenharmony_ci#endif
531d4afb5ceSopenharmony_ci
532d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
533d4afb5ceSopenharmony_ci#define lwsl_wsi_debug(_w, ...) lwsl_wsi(_w, LLL_DEBUG, __VA_ARGS__)
534d4afb5ceSopenharmony_ci#else
535d4afb5ceSopenharmony_ci#define lwsl_wsi_debug(_w, ...) do {} while(0)
536d4afb5ceSopenharmony_ci#endif
537d4afb5ceSopenharmony_ci
538d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_PARSER)
539d4afb5ceSopenharmony_ci#define lwsl_wsi_parser(_w, ...) lwsl_wsi(_w, LLL_PARSER, __VA_ARGS__)
540d4afb5ceSopenharmony_ci#else
541d4afb5ceSopenharmony_ci#define lwsl_wsi_parser(_w, ...) do {} while(0)
542d4afb5ceSopenharmony_ci#endif
543d4afb5ceSopenharmony_ci
544d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_HEADER)
545d4afb5ceSopenharmony_ci#define lwsl_wsi_header(_w, ...) lwsl_wsi(_w, LLL_HEADER, __VA_ARGS__)
546d4afb5ceSopenharmony_ci#else
547d4afb5ceSopenharmony_ci#define lwsl_wsi_header(_w, ...) do {} while(0)
548d4afb5ceSopenharmony_ci#endif
549d4afb5ceSopenharmony_ci
550d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_EXT)
551d4afb5ceSopenharmony_ci#define lwsl_wsi_ext(_w, ...) lwsl_wsi(_w, LLL_EXT, __VA_ARGS__)
552d4afb5ceSopenharmony_ci#else
553d4afb5ceSopenharmony_ci#define lwsl_wsi_ext(_w, ...) do {} while(0)
554d4afb5ceSopenharmony_ci#endif
555d4afb5ceSopenharmony_ci
556d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
557d4afb5ceSopenharmony_ci#define lwsl_wsi_client(_w, ...) lwsl_wsi(_w, LLL_CLIENT, __VA_ARGS__)
558d4afb5ceSopenharmony_ci#else
559d4afb5ceSopenharmony_ci#define lwsl_wsi_client(_w, ...) do {} while(0)
560d4afb5ceSopenharmony_ci#endif
561d4afb5ceSopenharmony_ci
562d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
563d4afb5ceSopenharmony_ci#define lwsl_wsi_latency(_w, ...) lwsl_wsi(_w, LLL_LATENCY, __VA_ARGS__)
564d4afb5ceSopenharmony_ci#else
565d4afb5ceSopenharmony_ci#define lwsl_wsi_latency(_w, ...) do {} while(0)
566d4afb5ceSopenharmony_ci#endif
567d4afb5ceSopenharmony_ci
568d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_THREAD)
569d4afb5ceSopenharmony_ci#define lwsl_wsi_thread(_w, ...) lwsl_wsi(_w, LLL_THREAD, __VA_ARGS__)
570d4afb5ceSopenharmony_ci#else
571d4afb5ceSopenharmony_ci#define lwsl_wsi_thread(_w, ...) do {} while(0)
572d4afb5ceSopenharmony_ci#endif
573d4afb5ceSopenharmony_ci
574d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_USER)
575d4afb5ceSopenharmony_ci#define lwsl_wsi_user(_w, ...) lwsl_wsi(_w, LLL_USER, __VA_ARGS__)
576d4afb5ceSopenharmony_ci#else
577d4afb5ceSopenharmony_ci#define lwsl_wsi_user(_w, ...) do {} while(0)
578d4afb5ceSopenharmony_ci#endif
579d4afb5ceSopenharmony_ci
580d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi_err(_v, ...)    lwsl_hexdump_wsi(_v, LLL_ERR, __VA_ARGS__)
581d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi_warn(_v, ...)   lwsl_hexdump_wsi(_v, LLL_WARN, __VA_ARGS__)
582d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi_notice(_v, ...) lwsl_hexdump_wsi(_v, LLL_NOTICE, __VA_ARGS__)
583d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi_info(_v, ...)   lwsl_hexdump_wsi(_v, LLL_INFO, __VA_ARGS__)
584d4afb5ceSopenharmony_ci#define lwsl_hexdump_wsi_debug(_v, ...)  lwsl_hexdump_wsi(_v, LLL_DEBUG, __VA_ARGS__)
585d4afb5ceSopenharmony_ci
586d4afb5ceSopenharmony_ci
587d4afb5ceSopenharmony_ci/*
588d4afb5ceSopenharmony_ci * lwsl_ss
589d4afb5ceSopenharmony_ci */
590d4afb5ceSopenharmony_ci
591d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_ERR)
592d4afb5ceSopenharmony_ci#define lwsl_ss_err(_w, ...) lwsl_ss(_w, LLL_ERR, __VA_ARGS__)
593d4afb5ceSopenharmony_ci#else
594d4afb5ceSopenharmony_ci#define lwsl_ss_err(_w, ...) do {} while(0)
595d4afb5ceSopenharmony_ci#endif
596d4afb5ceSopenharmony_ci
597d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_WARN)
598d4afb5ceSopenharmony_ci#define lwsl_ss_warn(_w, ...) lwsl_ss(_w, LLL_WARN, __VA_ARGS__)
599d4afb5ceSopenharmony_ci#else
600d4afb5ceSopenharmony_ci#define lwsl_ss_warn(_w, ...) do {} while(0)
601d4afb5ceSopenharmony_ci#endif
602d4afb5ceSopenharmony_ci
603d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_NOTICE)
604d4afb5ceSopenharmony_ci#define lwsl_ss_notice(_w, ...) lwsl_ss(_w, LLL_NOTICE, __VA_ARGS__)
605d4afb5ceSopenharmony_ci#else
606d4afb5ceSopenharmony_ci#define lwsl_ss_notice(_w, ...) do {} while(0)
607d4afb5ceSopenharmony_ci#endif
608d4afb5ceSopenharmony_ci
609d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_INFO)
610d4afb5ceSopenharmony_ci#define lwsl_ss_info(_w, ...) lwsl_ss(_w, LLL_INFO, __VA_ARGS__)
611d4afb5ceSopenharmony_ci#else
612d4afb5ceSopenharmony_ci#define lwsl_ss_info(_w, ...) do {} while(0)
613d4afb5ceSopenharmony_ci#endif
614d4afb5ceSopenharmony_ci
615d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_DEBUG)
616d4afb5ceSopenharmony_ci#define lwsl_ss_debug(_w, ...) lwsl_ss(_w, LLL_DEBUG, __VA_ARGS__)
617d4afb5ceSopenharmony_ci#else
618d4afb5ceSopenharmony_ci#define lwsl_ss_debug(_w, ...) do {} while(0)
619d4afb5ceSopenharmony_ci#endif
620d4afb5ceSopenharmony_ci
621d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_PARSER)
622d4afb5ceSopenharmony_ci#define lwsl_ss_parser(_w, ...) lwsl_ss(_w, LLL_PARSER, __VA_ARGS__)
623d4afb5ceSopenharmony_ci#else
624d4afb5ceSopenharmony_ci#define lwsl_ss_parser(_w, ...) do {} while(0)
625d4afb5ceSopenharmony_ci#endif
626d4afb5ceSopenharmony_ci
627d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_HEADER)
628d4afb5ceSopenharmony_ci#define lwsl_ss_header(_w, ...) lwsl_ss(_w, LLL_HEADER, __VA_ARGS__)
629d4afb5ceSopenharmony_ci#else
630d4afb5ceSopenharmony_ci#define lwsl_ss_header(_w, ...) do {} while(0)
631d4afb5ceSopenharmony_ci#endif
632d4afb5ceSopenharmony_ci
633d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_EXT)
634d4afb5ceSopenharmony_ci#define lwsl_ss_ext(_w, ...) lwsl_ss(_w, LLL_EXT, __VA_ARGS__)
635d4afb5ceSopenharmony_ci#else
636d4afb5ceSopenharmony_ci#define lwsl_ss_ext(_w, ...) do {} while(0)
637d4afb5ceSopenharmony_ci#endif
638d4afb5ceSopenharmony_ci
639d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_CLIENT)
640d4afb5ceSopenharmony_ci#define lwsl_ss_client(_w, ...) lwsl_ss(_w, LLL_CLIENT, __VA_ARGS__)
641d4afb5ceSopenharmony_ci#else
642d4afb5ceSopenharmony_ci#define lwsl_ss_client(_w, ...) do {} while(0)
643d4afb5ceSopenharmony_ci#endif
644d4afb5ceSopenharmony_ci
645d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_LATENCY)
646d4afb5ceSopenharmony_ci#define lwsl_ss_latency(_w, ...) lwsl_ss(_w, LLL_LATENCY, __VA_ARGS__)
647d4afb5ceSopenharmony_ci#else
648d4afb5ceSopenharmony_ci#define lwsl_ss_latency(_w, ...) do {} while(0)
649d4afb5ceSopenharmony_ci#endif
650d4afb5ceSopenharmony_ci
651d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_THREAD)
652d4afb5ceSopenharmony_ci#define lwsl_ss_thread(_w, ...) lwsl_ss(_w, LLL_THREAD, __VA_ARGS__)
653d4afb5ceSopenharmony_ci#else
654d4afb5ceSopenharmony_ci#define lwsl_ss_thread(_w, ...) do {} while(0)
655d4afb5ceSopenharmony_ci#endif
656d4afb5ceSopenharmony_ci
657d4afb5ceSopenharmony_ci#if (_LWS_ENABLED_LOGS & LLL_USER)
658d4afb5ceSopenharmony_ci#define lwsl_ss_user(_w, ...) lwsl_ss(_w, LLL_USER, __VA_ARGS__)
659d4afb5ceSopenharmony_ci#else
660d4afb5ceSopenharmony_ci#define lwsl_ss_user(_w, ...) do {} while(0)
661d4afb5ceSopenharmony_ci#endif
662d4afb5ceSopenharmony_ci
663d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss_err(_v, ...)    lwsl_hexdump_ss(_v, LLL_ERR, __VA_ARGS__)
664d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss_warn(_v, ...)   lwsl_hexdump_ss(_v, LLL_WARN, __VA_ARGS__)
665d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss_notice(_v, ...) lwsl_hexdump_ss(_v, LLL_NOTICE, __VA_ARGS__)
666d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss_info(_v, ...)   lwsl_hexdump_ss(_v, LLL_INFO, __VA_ARGS__)
667d4afb5ceSopenharmony_ci#define lwsl_hexdump_ss_debug(_v, ...)  lwsl_hexdump_ss(_v, LLL_DEBUG, __VA_ARGS__)
668d4afb5ceSopenharmony_ci
669d4afb5ceSopenharmony_ci
670d4afb5ceSopenharmony_ci
671d4afb5ceSopenharmony_ci/**
672d4afb5ceSopenharmony_ci * lwsl_hexdump_level() - helper to hexdump a buffer at a selected debug level
673d4afb5ceSopenharmony_ci *
674d4afb5ceSopenharmony_ci * \param level: one of LLL_ constants
675d4afb5ceSopenharmony_ci * \param vbuf: buffer start to dump
676d4afb5ceSopenharmony_ci * \param len: length of buffer to dump
677d4afb5ceSopenharmony_ci *
678d4afb5ceSopenharmony_ci * If \p level is visible, does a nice hexdump -C style dump of \p vbuf for
679d4afb5ceSopenharmony_ci * \p len bytes.  This can be extremely convenient while debugging.
680d4afb5ceSopenharmony_ci */
681d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
682d4afb5ceSopenharmony_cilwsl_hexdump_level(int level, const void *vbuf, size_t len);
683d4afb5ceSopenharmony_ci
684d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
685d4afb5ceSopenharmony_cilwsl_hexdump_level_cx(lws_log_cx_t *cx, lws_log_prepend_cx_t prep, void *obj,
686d4afb5ceSopenharmony_ci		      int hexdump_level, const void *vbuf, size_t len);
687d4afb5ceSopenharmony_ci
688d4afb5ceSopenharmony_ci/**
689d4afb5ceSopenharmony_ci * lwsl_hexdump() - helper to hexdump a buffer (DEBUG builds only)
690d4afb5ceSopenharmony_ci *
691d4afb5ceSopenharmony_ci * \param buf: buffer start to dump
692d4afb5ceSopenharmony_ci * \param len: length of buffer to dump
693d4afb5ceSopenharmony_ci *
694d4afb5ceSopenharmony_ci * Calls through to lwsl_hexdump_level(LLL_DEBUG, ... for compatability.
695d4afb5ceSopenharmony_ci * It's better to use lwsl_hexdump_level(level, ... directly so you can control
696d4afb5ceSopenharmony_ci * the visibility.
697d4afb5ceSopenharmony_ci */
698d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
699d4afb5ceSopenharmony_cilwsl_hexdump(const void *buf, size_t len);
700d4afb5ceSopenharmony_ci
701d4afb5ceSopenharmony_ci/**
702d4afb5ceSopenharmony_ci * lws_is_be() - returns nonzero if the platform is Big Endian
703d4afb5ceSopenharmony_ci */
704d4afb5ceSopenharmony_cistatic LWS_INLINE int lws_is_be(void) {
705d4afb5ceSopenharmony_ci	const int probe = ~0xff;
706d4afb5ceSopenharmony_ci
707d4afb5ceSopenharmony_ci	return *(const char *)&probe;
708d4afb5ceSopenharmony_ci}
709d4afb5ceSopenharmony_ci
710d4afb5ceSopenharmony_ci/**
711d4afb5ceSopenharmony_ci * lws_set_log_level() - Set the logging bitfield
712d4afb5ceSopenharmony_ci * \param level:	OR together the LLL_ debug contexts you want output from
713d4afb5ceSopenharmony_ci * \param log_emit_function:	NULL to leave it as it is, or a user-supplied
714d4afb5ceSopenharmony_ci *			function to perform log string emission instead of
715d4afb5ceSopenharmony_ci *			the default stderr one.
716d4afb5ceSopenharmony_ci *
717d4afb5ceSopenharmony_ci * log level defaults to "err", "warn" and "notice" contexts enabled and
718d4afb5ceSopenharmony_ci * emission on stderr.  If stderr is a tty (according to isatty()) then
719d4afb5ceSopenharmony_ci * the output is coloured according to the log level using ANSI escapes.
720d4afb5ceSopenharmony_ci *
721d4afb5ceSopenharmony_ci * You can set the default security level for logging using the
722d4afb5ceSopenharmony_ci * secrecy_and_log_level() macro to set the \p level parameter, eg
723d4afb5ceSopenharmony_ci *
724d4afb5ceSopenharmony_ci * lws_set_log_level(secrecy_and_log_level(LWS_SECRECY_PII, LLL_ERR | LLL_WARN),
725d4afb5ceSopenharmony_ci *		     my_emit_function);
726d4afb5ceSopenharmony_ci *
727d4afb5ceSopenharmony_ci * Normally you can just leave it at the default.
728d4afb5ceSopenharmony_ci */
729d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
730d4afb5ceSopenharmony_cilws_set_log_level(int level, lws_log_emit_t log_emit_function);
731d4afb5ceSopenharmony_ci
732d4afb5ceSopenharmony_ci/**
733d4afb5ceSopenharmony_ci * lwsl_emit_syslog() - helper log emit function writes to system log
734d4afb5ceSopenharmony_ci *
735d4afb5ceSopenharmony_ci * \param level: one of LLL_ log level indexes
736d4afb5ceSopenharmony_ci * \param line: log string
737d4afb5ceSopenharmony_ci *
738d4afb5ceSopenharmony_ci * You use this by passing the function pointer to lws_set_log_level(), to set
739d4afb5ceSopenharmony_ci * it as the log emit function, it is not called directly.
740d4afb5ceSopenharmony_ci */
741d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
742d4afb5ceSopenharmony_cilwsl_emit_syslog(int level, const char *line);
743d4afb5ceSopenharmony_ci
744d4afb5ceSopenharmony_ci/**
745d4afb5ceSopenharmony_ci * lwsl_emit_stderr() - helper log emit function writes to stderr
746d4afb5ceSopenharmony_ci *
747d4afb5ceSopenharmony_ci * \param level: one of LLL_ log level indexes
748d4afb5ceSopenharmony_ci * \param line: log string
749d4afb5ceSopenharmony_ci *
750d4afb5ceSopenharmony_ci * You use this by passing the function pointer to lws_set_log_level(), to set
751d4afb5ceSopenharmony_ci * it as the log emit function, it is not called directly.
752d4afb5ceSopenharmony_ci *
753d4afb5ceSopenharmony_ci * It prepends a system timestamp like [2018/11/13 07:41:57:3989]
754d4afb5ceSopenharmony_ci *
755d4afb5ceSopenharmony_ci * If stderr is a tty, then ansi colour codes are added.
756d4afb5ceSopenharmony_ci */
757d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
758d4afb5ceSopenharmony_cilwsl_emit_stderr(int level, const char *line);
759d4afb5ceSopenharmony_ci
760d4afb5ceSopenharmony_ci/**
761d4afb5ceSopenharmony_ci * lwsl_emit_stderr_notimestamp() - helper log emit function writes to stderr
762d4afb5ceSopenharmony_ci *
763d4afb5ceSopenharmony_ci * \param level: one of LLL_ log level indexes
764d4afb5ceSopenharmony_ci * \param line: log string
765d4afb5ceSopenharmony_ci *
766d4afb5ceSopenharmony_ci * You use this by passing the function pointer to lws_set_log_level(), to set
767d4afb5ceSopenharmony_ci * it as the log emit function, it is not called directly.
768d4afb5ceSopenharmony_ci *
769d4afb5ceSopenharmony_ci * If stderr is a tty, then ansi colour codes are added.
770d4afb5ceSopenharmony_ci */
771d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
772d4afb5ceSopenharmony_cilwsl_emit_stderr_notimestamp(int level, const char *line);
773d4afb5ceSopenharmony_ci
774d4afb5ceSopenharmony_ci/**
775d4afb5ceSopenharmony_ci * lwsl_visible() - returns true if the log level should be printed
776d4afb5ceSopenharmony_ci *
777d4afb5ceSopenharmony_ci * \param level: one of LLL_ log level indexes
778d4afb5ceSopenharmony_ci *
779d4afb5ceSopenharmony_ci * This is useful if you have to do work to generate the log content, you
780d4afb5ceSopenharmony_ci * can skip the work if the log level used to print it is not actually
781d4afb5ceSopenharmony_ci * enabled at runtime.
782d4afb5ceSopenharmony_ci */
783d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN int
784d4afb5ceSopenharmony_cilwsl_visible(int level);
785d4afb5ceSopenharmony_ci
786d4afb5ceSopenharmony_cistruct lws;
787d4afb5ceSopenharmony_ci
788d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN const char *
789d4afb5ceSopenharmony_cilws_wsi_tag(struct lws *wsi);
790d4afb5ceSopenharmony_ci
791d4afb5ceSopenharmony_ciLWS_VISIBLE LWS_EXTERN void
792d4afb5ceSopenharmony_cilwsl_refcount_cx(lws_log_cx_t *cx, int _new);
793d4afb5ceSopenharmony_ci
794d4afb5ceSopenharmony_ci///@}
795