libipc-old/examples/wsserver.c

117 lines
2.7 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include "../src/ipc.h"
#include "../src/utils.h"
#define WEBSOCKETD_BULLSHIT
void chomp (char *str, ssize_t len)
{
if (str[len - 1] == '\n') {
str[len - 1] = '\0';
}
if (str[len - 2] == '\n') {
str[len - 2] = '\0';
}
}
struct ipc_ctx *ctx;
void interactive ()
{
int timer = 10000; // 10 seconds
SECURE_DECLARATION (struct ipc_event, event);
SECURE_BUFFER_DECLARATION (char, service_name, 100);
char *sn = getenv ("PATH_TRANSLATED");
if (sn != NULL) {
memcpy (service_name, sn, strlen (sn));
} else {
fprintf (stderr, "cannot see PATH_TRANSLATED variable\n");
exit (EXIT_FAILURE);
}
// init service
TEST_IPC_Q (ipc_connection (ctx, service_name, NULL), EXIT_FAILURE);
ipc_add_fd (ctx, 0); // add STDIN
while (1) {
TEST_IPC_WAIT_EVENT_Q (ipc_wait_event (ctx, &event, &timer), EXIT_FAILURE);
switch (event.type) {
case IPC_EVENT_TYPE_TIMER:{
fprintf (stderr, "time up!\n");
timer = 10000;
};
break;
case IPC_EVENT_TYPE_EXTRA_SOCKET:
{
// structure not read, should read the message here
SECURE_BUFFER_DECLARATION (char, buf, 4096);
ssize_t len;
len = read (event.origin, buf, 4096);
// in case we want to quit the program
if (len == 0 || strncmp (buf, "quit", 4) == 0 || strncmp (buf, "exit", 4) == 0) {
TEST_IPC_Q (ipc_close_all (ctx), EXIT_FAILURE);
ipc_ctx_free (ctx);
exit (EXIT_SUCCESS);
}
// send the message read on STDIN
ssize_t len_sent = write (ctx->pollfd[0].fd, buf, len);
if (len_sent != len) {
fprintf (stderr, "cannot send the message %lu-byte message, sent %lu bytes",
len, len_sent);
exit (EXIT_FAILURE);
}
}
break;
case IPC_EVENT_TYPE_MESSAGE:
{
struct ipc_message *m = event.m;
SECURE_BUFFER_DECLARATION (char, buf, 4096);
uint32_t size;
size = ipc_message_raw_serialize (buf, m->type, m->user_type, m->payload, m->length);
write (1, buf, size);
#ifdef WEBSOCKETD_BULLSHIT
printf ("\n");
#endif
fflush (stdout);
};
break;
case IPC_EVENT_TYPE_TX: {
printf ("Message sent\n");
}
break;
ERROR_CASE (IPC_EVENT_TYPE_DISCONNECTION, "main loop", "disconnection: should not happen");
ERROR_CASE (IPC_EVENT_TYPE_NOT_SET , "main loop", "not set: should not happen");
ERROR_CASE (IPC_EVENT_TYPE_CONNECTION , "main loop", "connection: should not happen");
// ERROR_CASE (IPC_EVENT_TYPE_ERROR , "main loop", "error");
default:
fprintf (stderr, "event type error: should not happen, event type %d\n", event.type);
}
}
}
int main (void)
{
ctx = malloc (sizeof (struct ipc_ctx));
memset (ctx, 0, sizeof (struct ipc_ctx));
interactive ();
return EXIT_SUCCESS;
}