X-Git-Url: https://rtime.felk.cvut.cz/gitweb/coffee/mt-apps.git/blobdiff_plain/ea09d8979808bb07a91bfd78d1498c9f87e4d863..HEAD:/mt_server.c?ds=sidebyside diff --git a/mt_server.c b/mt_server.c index f7315e1..3b617bd 100644 --- a/mt_server.c +++ b/mt_server.c @@ -1,15 +1,20 @@ +#define _GNU_SOURCE /* See feature_test_macros(7) */ +#include #include #include #include +#include #include "mt_server.h" #include "signal_exit.h" +#include "mt_blank.h" char *new_line() { char *line = (char *)malloc((LWS_PRE + INPUT_LINE_LENGTH)*sizeof(char)); if (!line) { perror("malloc"); + return NULL; } return line + LWS_PRE; } @@ -19,7 +24,7 @@ char *copy_line(char *line) { if (!copy) { return NULL; } - strcpy(copy, line); + strncpy(copy, line, INPUT_LINE_LENGTH); } void free_line(char *line) @@ -85,23 +90,23 @@ void list_deinit(list *in) } static const struct lws_http_mount mount = { - /* .mount_next */ NULL, /* linked-list "next" */ - /* .mountpoint */ HTTP_MOUNTPOINT, - /* .origin */ HTTP_ORIGIN, /* serve from dir */ - /* .def */ HTTP_DEFAULT, /* default filename */ - /* .protocol */ NULL, - /* .cgienv */ NULL, - /* .extra_mimetypes */ NULL, - /* .interpret */ NULL, - /* .cgi_timeout */ 0, - /* .cache_max_age */ 0, - /* .auth_mask */ 0, - /* .cache_reusable */ 0, - /* .cache_revalidate */ 0, - /* .cache_intermediaries */ 0, - /* .origin_protocol */ LWSMPRO_FILE, /* files in a dir */ - /* .mountpoint_len */ 1, /* char count */ - /* .basic_auth_login_file */ NULL, + .mount_next = NULL, /* linked-list "next" */ + .mountpoint = HTTP_MOUNTPOINT, + .origin = HTTP_ORIGIN, /* serve from dir */ + .def = HTTP_DEFAULT, /* default filename */ + .protocol = NULL, + .cgienv = NULL, + .extra_mimetypes = NULL, + .interpret = NULL, + .cgi_timeout = 0, + .cache_max_age = 0, + .auth_mask = 0, + .cache_reusable = 0, + .cache_revalidate = 0, + .cache_intermediaries = 0, + .origin_protocol = LWSMPRO_FILE, /* files in a dir */ + .mountpoint_len = 1, /* char count */ + .basic_auth_login_file = NULL, }; typedef struct per_vhost_data__merica_terminal { @@ -142,6 +147,7 @@ static int callback_merica_terminal(struct lws *wsi, enum lws_callback_reasons reason, void *user, void *in, size_t len) { + struct lws_context *context = lws_get_context(wsi); struct lws_vhost *vhost = lws_get_vhost(wsi); const struct lws_protocols *prot = lws_get_protocol(wsi); /* @@ -154,7 +160,7 @@ static int callback_merica_terminal(struct lws *wsi, int n, m; - list *lines = (list *)prot->user; + list *lines = (list *)lws_context_user(context); char *line; switch (reason) { @@ -163,7 +169,7 @@ static int callback_merica_terminal(struct lws *wsi, vhost, prot, sizeof(struct per_vhost_data__merica_terminal) ); - vhd->context = lws_get_context(wsi); + vhd->context = context; vhd->protocol = prot; vhd->vhost = vhost; break; @@ -178,32 +184,24 @@ static int callback_merica_terminal(struct lws *wsi, break; case LWS_CALLBACK_SERVER_WRITEABLE: - line = lines->first->line; - n = strlen(line); - m = lws_write(wsi, (unsigned char *)line, n, LWS_WRITE_TEXT); - if (lines->first->next != NULL) { + if (lines->first) { + line = lines->first->line; + n = strlen(line); + m = lws_write(wsi, (unsigned char *)line, n, LWS_WRITE_TEXT); list_remove(lines); - lws_callback_on_writable_all_protocol(lws_get_context(wsi), - &protocols[PROTOCOL_MERICA_TERMINAL]); - } - if (m < n) { - fprintf(stderr, "ERROR %d writing to di socket\n", n); - return -1; + if (lines->first) { + lws_callback_on_writable_all_protocol(context, + &protocols[PROTOCOL_MERICA_TERMINAL]); + } + if (m < n) { + fprintf(stderr, "ERROR %d writing to di socket\n", n); + return -1; + } } break; case LWS_CALLBACK_RECEIVE: - if (strcmp((const char *)in, "reset") == 0) { - line = copy_line(JSON_EMPTY); - if (line) { - if (list_add(lines, line) == 0) { - lws_callback_on_writable_all_protocol(lws_get_context(wsi), - &protocols[PROTOCOL_MERICA_TERMINAL]); - } else { - free_line(line); - } - } - } else if (strcmp((const char *)in, "close") == 0) { + if (strcmp((const char *)in, "close") == 0) { fprintf(stderr, "closing websocket\n"); lws_close_reason(wsi, LWS_CLOSE_STATUS_GOINGAWAY, (unsigned char *)"seeya", 5); @@ -227,7 +225,11 @@ static void fd_cb(EV_P_ ev_io *w_, int revents) read(w->w.fd, pos, 1); if (*pos == '\n' || (w->pos - w->text) == INPUT_LINE_LENGTH) { +#ifdef NO_MAIN + mt_blank_wake(); +#endif *pos = 0; + syslog(LOG_INFO, "%s", w->text); char *line = new_line(); if (line) { if (list_add(w->lines, w->text) == 0) { @@ -247,16 +249,25 @@ int mt_server_init(mt_server_t *self, struct ev_loop *loop, int fd) { struct lws_context_creation_info info; + list *l = list_init(); + if (!l) { + return -1; + } + + openlog(program_invocation_short_name, LOG_PID | LOG_PERROR, LOG_DAEMON); + memset(&info, 0, sizeof(info)); info.port = HTTP_PORT; info.mounts = &mount; info.protocols = protocols; info.max_http_header_pool = 1; info.options |= LWS_SERVER_OPTION_LIBEV; + info.user = l; struct lws_context *context = lws_create_context(&info); if (!context) { fprintf(stderr, "lws_create_context failed\n"); + list_deinit(l); return -1; } @@ -264,23 +275,11 @@ int mt_server_init(mt_server_t *self, struct ev_loop *loop, int fd) ev_io_ws *w = &(self->fd_watcher); w->context = context; - char *line = copy_line(JSON_EMPTY); - if (!line) { - return -1; - } - w->lines = list_init(); - if (!w->lines) { - free_line(line); - return -1; - } - if (list_add(w->lines, line) != 0) { - list_deinit(w->lines); - return -1; - } - protocols[PROTOCOL_MERICA_TERMINAL].user = (void *)w->lines; - line = new_line(); + w->lines = l; + + char *line = new_line(); if (!line) { - list_deinit(w->lines); + list_deinit(l); return -1; } w->text = line; @@ -296,6 +295,7 @@ void mt_server_deinit(mt_server_t *self) free_line(self->fd_watcher.text); list_deinit(self->fd_watcher.lines); lws_context_destroy(self->context); + closelog(); } #ifndef NO_MAIN