/* * Copyright (c) 2021 Clementine Computing LLC. * * This file is part of PopuFare. * * PopuFare is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PopuFare is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with PopuFare. If not, see . * */ /* * A simple client to inject websocket messages to piumsgd * */ #include #include #include #include #include #include #include #include "mongoose.h" #define PIUMSG "piumsg" #define PIUMSG_VERSION "0.1.0" #define PIUMSG_HOST "localhost" //#define PIUMSG_HOST "ws://192.168.0.26" #define PIUMSG_PORT 8001 #define _BUFLEN 1024 char *g_host = NULL; int g_port = PIUMSG_PORT; char *g_msg = NULL; //static const char *s_url = "ws://" PIUMSG_HOST ":" PIUMSG_PORT; // char *s_url=NULL; int g_verbose = 0; struct option g_longopt[] = { { "verbose", no_argument, 0, 'V'}, { "version", no_argument, 0, 'v'}, { "help", no_argument, 0, 'h'}, {0,0,0,0} }; // Print websocket response and signal that we're done // static void _ws(struct mg_connection *c, int ev, void *ev_data, void *_data) { size_t n; int *idat=NULL; idat = (int *)_data; if (ev == MG_EV_ERROR) { // On error, log error message // LOG(LL_ERROR, ("%p %s", c->fd, (char *) ev_data)); } else if (ev == MG_EV_WS_OPEN) { // When websocket handshake is successful, send message // n = strlen(g_msg); printf("# sending: "); fflush(stdout); write(1, g_msg, n); printf("\n"); fflush(stdout); mg_ws_send(c, g_msg, n, WEBSOCKET_OP_TEXT); } else if (ev == MG_EV_WS_MSG) { // When we get echo response, print it // struct mg_ws_message *wm = (struct mg_ws_message *) ev_data; printf("# got: %.*s\n", (int) wm->data.len, wm->data.ptr); } if ((ev == MG_EV_ERROR) || (ev == MG_EV_CLOSE) || (ev == MG_EV_WS_MSG)) { printf("# ev %i (err%i, close%i, msg%i)\n", ev, MG_EV_ERROR, MG_EV_CLOSE, MG_EV_WS_MSG); // Signal that we're done // //*(bool *) fn_data = true; *idat = 1; } } void show_version(FILE *fp) { fprintf(fp, "version %s\n", PIUMSG_VERSION); } void show_help(FILE *fp) { fprintf(fp, "%s - connect to PIU display manager\n", PIUMSG); fprintf(fp, "\n"); fprintf(fp, " usage: %s [-h] [-v] [-V] [msg]\n", PIUMSG); fprintf(fp, "\n"); fprintf(fp, " msg push message\n"); fprintf(fp, " [-H host] host (default %s)\n", PIUMSG_HOST); fprintf(fp, " [-p port] port (default %i)\n", PIUMSG_PORT); fprintf(fp, " [-V] verbose\n"); fprintf(fp, " [-h] help (this screen)\n"); fprintf(fp, " [-v] print version\n"); } int main(int argc, char **argv) { struct mg_mgr mgr; //bool done = false; int done = 0; struct mg_connection *c; int ch, option_index; s_url = (char *)malloc(sizeof(char)*_BUFLEN); while ((ch=getopt_long(argc, argv, "hvVm:H:p:", g_longopt, &option_index)) >= 0) { switch (ch) { case 0: break; case 'H': g_host = strdup(optarg); break; case 'p': g_port = atoi(optarg); break; case 'V': g_verbose++; break; case 'v': show_version(stdout); break; case 'h': show_help(stdout); exit(-1); default: break; } } if (optind < argc) { g_msg = strdup(argv[optind]); } if (!g_msg) { fprintf(stderr, "provide message\n"); show_help(stderr); exit(EX_NOINPUT); } if (!g_host) { g_host = strdup(PIUMSG_HOST); } snprintf(s_url, _BUFLEN-1, "ws://%s:%i", g_host, g_port); s_url[_BUFLEN-1]=0; mg_mgr_init(&mgr); c = mg_ws_connect(&mgr, s_url, _ws, &done, NULL); while (c && (done == 0)) { mg_mgr_poll(&mgr, 1000); } mg_mgr_free(&mgr); free(g_msg); free(g_host); return 0; }