mirror of
https://github.com/warmcat/libwebsockets.git
synced 2025-03-16 00:00:07 +01:00
263 lines
5.1 KiB
C
263 lines
5.1 KiB
C
![]() |
#include "private-libwebsockets.h"
|
||
|
|
||
|
/*
|
||
|
* included from libwebsockets.c for MBED3 builds
|
||
|
* MBED3 is an "OS" for very small embedded systems.
|
||
|
* He doesn't have Posix semantics or apis.
|
||
|
* But he has things like TCP sockets.
|
||
|
*/
|
||
|
|
||
|
unsigned long long time_in_microseconds(void)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int libwebsockets_get_random(struct libwebsocket_context *context,
|
||
|
void *buf, int len)
|
||
|
{
|
||
|
(void)context;
|
||
|
int n = len;
|
||
|
unsigned char *b = (unsigned char *)buf;
|
||
|
while (n--)
|
||
|
b[n]= rand();
|
||
|
return len;
|
||
|
}
|
||
|
|
||
|
/*
|
||
|
* MBED3 does not have a 'kernel' which takes copies of what userland wants
|
||
|
* to send. The user application must hold the tx buffer until it is informed
|
||
|
* that send of the user buffer was complete.
|
||
|
*
|
||
|
* So as soon as you send something the pipe is globally choked.
|
||
|
*
|
||
|
* There is no concept of additional sent things being maybe acceptable.
|
||
|
* You can send one thing up to 64KB at a time and may not try to send
|
||
|
* anything else until that is completed.
|
||
|
*
|
||
|
* You can send things on other sockets, but they cannot complete until they
|
||
|
* get their turn at the network device.
|
||
|
*/
|
||
|
|
||
|
LWS_VISIBLE int lws_send_pipe_choked(struct libwebsocket *wsi)
|
||
|
{
|
||
|
#if 0
|
||
|
struct libwebsocket_pollfd fds;
|
||
|
|
||
|
/* treat the fact we got a truncated send pending as if we're choked */
|
||
|
if (wsi->truncated_send_len)
|
||
|
return 1;
|
||
|
|
||
|
fds.fd = wsi->sock;
|
||
|
fds.events = POLLOUT;
|
||
|
fds.revents = 0;
|
||
|
|
||
|
if (poll(&fds, 1, 0) != 1)
|
||
|
return 1;
|
||
|
|
||
|
if ((fds.revents & POLLOUT) == 0)
|
||
|
return 1;
|
||
|
|
||
|
/* okay to send another packet without blocking */
|
||
|
#endif
|
||
|
(void)wsi;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_poll_listen_fd(struct libwebsocket_pollfd *fd)
|
||
|
{
|
||
|
(void)fd;
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* libwebsocket_cancel_service() - Cancel servicing of pending websocket activity
|
||
|
* @context: Websocket context
|
||
|
*
|
||
|
* This function let a call to libwebsocket_service() waiting for a timeout
|
||
|
* immediately return.
|
||
|
*
|
||
|
* There is no poll() in MBED3, he will fire callbacks when he feels like
|
||
|
* it.
|
||
|
*/
|
||
|
LWS_VISIBLE void
|
||
|
libwebsocket_cancel_service(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE void lwsl_emit_syslog(int level, const char *line)
|
||
|
{
|
||
|
printf("%d: %s", level, line);
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_service(struct libwebsocket_context *context, int timeout_ms)
|
||
|
{
|
||
|
(void)context;
|
||
|
(void)timeout_ms;
|
||
|
#if 0
|
||
|
int n;
|
||
|
int m;
|
||
|
char buf;
|
||
|
#ifdef LWS_OPENSSL_SUPPORT
|
||
|
struct libwebsocket *wsi, *wsi_next;
|
||
|
#endif
|
||
|
|
||
|
/* stay dead once we are dead */
|
||
|
|
||
|
if (!context)
|
||
|
return 1;
|
||
|
|
||
|
lws_libev_run(context);
|
||
|
|
||
|
context->service_tid = context->protocols[0].callback(context, NULL,
|
||
|
LWS_CALLBACK_GET_THREAD_ID, NULL, NULL, 0);
|
||
|
|
||
|
#ifdef LWS_OPENSSL_SUPPORT
|
||
|
/* if we know we have non-network pending data, do not wait in poll */
|
||
|
if (lws_ssl_anybody_has_buffered_read(context))
|
||
|
timeout_ms = 0;
|
||
|
#endif
|
||
|
n = poll(context->fds, context->fds_count, timeout_ms);
|
||
|
context->service_tid = 0;
|
||
|
|
||
|
#ifdef LWS_OPENSSL_SUPPORT
|
||
|
if (!lws_ssl_anybody_has_buffered_read(context) && n == 0) {
|
||
|
#else
|
||
|
if (n == 0) /* poll timeout */ {
|
||
|
#endif
|
||
|
libwebsocket_service_fd(context, NULL);
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
if (n < 0) {
|
||
|
if (LWS_ERRNO != LWS_EINTR)
|
||
|
return -1;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
/* any socket with events to service? */
|
||
|
|
||
|
for (n = 0; n < context->fds_count; n++) {
|
||
|
|
||
|
if (!context->fds[n].revents)
|
||
|
continue;
|
||
|
|
||
|
if (context->fds[n].fd == context->dummy_pipe_fds[0]) {
|
||
|
if (read(context->fds[n].fd, &buf, 1) != 1)
|
||
|
lwsl_err("Cannot read from dummy pipe.");
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
m = libwebsocket_service_fd(context, &context->fds[n]);
|
||
|
if (m < 0)
|
||
|
return -1;
|
||
|
/* if something closed, retry this slot */
|
||
|
if (m)
|
||
|
n--;
|
||
|
}
|
||
|
#endif
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_set_socket_options(struct libwebsocket_context *context, lws_sockfd_type fd)
|
||
|
{
|
||
|
(void)context;
|
||
|
(void)fd;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE void
|
||
|
lws_plat_drop_app_privileges(struct lws_context_creation_info *info)
|
||
|
{
|
||
|
(void)info;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_init_lookup(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_init_fd_tables(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_context_early_init(void)
|
||
|
{
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE void
|
||
|
lws_plat_context_early_destroy(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE void
|
||
|
lws_plat_context_late_destroy(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
}
|
||
|
|
||
|
|
||
|
LWS_VISIBLE void
|
||
|
lws_plat_service_periodic(struct libwebsocket_context *context)
|
||
|
{
|
||
|
(void)context;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_change_pollfd(struct libwebsocket_context *context,
|
||
|
struct libwebsocket *wsi, struct libwebsocket_pollfd *pfd)
|
||
|
{
|
||
|
(void)context;
|
||
|
(void)wsi;
|
||
|
(void)pfd;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
lws_plat_open_file(const char* filename, unsigned long* filelen)
|
||
|
{
|
||
|
(void)filename;
|
||
|
(void)filelen;
|
||
|
return LWS_INVALID_FILE;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE const char *
|
||
|
lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt)
|
||
|
{
|
||
|
(void)af;
|
||
|
(void)src;
|
||
|
(void)dst;
|
||
|
(void)cnt;
|
||
|
return "unsupported";
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
insert_wsi(struct libwebsocket_context *context, struct libwebsocket *wsi)
|
||
|
{
|
||
|
(void)context;
|
||
|
(void)wsi;
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
LWS_VISIBLE int
|
||
|
delete_from_fd(struct libwebsocket_context *context, lws_sockfd_type fd)
|
||
|
{
|
||
|
(void)context;
|
||
|
(void)fd;
|
||
|
|
||
|
return 1;
|
||
|
}
|