blob: 44f0f4d9399e78d9ed14981eae825488d4041b78 [file] [log] [blame] [raw]
#ifndef ECHO_PROTOCOL
#include "facil.h"
static void echo_on_data(intptr_t uuid, protocol_s *prt) {
char buffer[1024] = {'E', 'c', 'h', 'o', ':', ' '};
ssize_t len;
while ((len = sock_read(uuid, buffer + 6, 1018)) > 0) {
sock_write(uuid, buffer, (size_t)len + 6);
if ((buffer[6] | 32) == 'b' && (buffer[7] | 32) == 'y' &&
(buffer[8] | 32) == 'e') {
sock_write(uuid, "Goodbye.\n", 9);
sock_close(uuid);
return;
}
}
}
static void echo_ping(intptr_t uuid, protocol_s *prt) {
sock_write(uuid, "Server: Are you there?\n", 23);
}
static void echo_on_shutdown(intptr_t uuid, protocol_s *prt) {
sock_write(uuid, "Echo server shutting down\nGoodbye.\n", 35);
}
static inline protocol_s *echo_on_open(intptr_t uuid, void *ignr_) {
static protocol_s echo_proto = {.on_data = echo_on_data,
.on_shutdown = echo_on_shutdown,
.ping = echo_ping};
sock_write(uuid, "Echo Service: Welcome\n", 22);
facil_set_timeout(uuid, 10);
return &echo_proto;
(void)ignr_;
}
void listen2echo(const char *port) {
facil_listen(.port = port, .on_open = echo_on_open);
}
#endif