# HG changeset patch # User Mychaela Falconia # Date 1493000224 0 # Node ID 47d56330609da8946c102ad1b3a3bbae27e37203 # Parent db9ee7745cddc4ae91d29f15f6147f8ba18ee62f fc-cmu200d: skeleton complete, ready to start adding meat diff -r db9ee7745cdd -r 47d56330609d rfcal/cmu200/Makefile --- a/rfcal/cmu200/Makefile Mon Apr 24 01:43:02 2017 +0000 +++ b/rfcal/cmu200/Makefile Mon Apr 24 02:17:04 2017 +0000 @@ -3,7 +3,7 @@ PROGS= fc-cmu200d fc-serscpi INSTBIN=/opt/freecalypso/bin -CMU200D_OBJS= init.o main.o openport.o sercmd.o session.o socket.o +CMU200D_OBJS= dispatch.o init.o main.o openport.o sercmd.o session.o socket.o SERSCPI_OBJS= openport.o sertool.o all: ${PROGS} diff -r db9ee7745cdd -r 47d56330609d rfcal/cmu200/dispatch.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rfcal/cmu200/dispatch.c Mon Apr 24 02:17:04 2017 +0000 @@ -0,0 +1,38 @@ +/* + * This module contains the code that dispatches client commands. + */ + +#include +#include +#include +#include + +extern char *client_cmd_fields[]; +extern int client_cmd_nfields; + +cmd_ping() +{ + send_socket_response("+Pong\n"); + return(0); +} + +static struct cmdtab { + char *cmd_kw; + int (*handler)(); +} cmdtab[] = { + {"ping", cmd_ping}, + {0, 0} +}; + +dispatch_client_command() +{ + struct cmdtab *tp; + + for (tp = cmdtab; tp->cmd_kw; tp++) + if (!strcmp(client_cmd_fields[0], tp->cmd_kw)) + break; + if (tp->handler) + return tp->handler(); + send_socket_response("-Unknown or unimplemented command\n"); + return(0); +} diff -r db9ee7745cdd -r 47d56330609d rfcal/cmu200/session.c --- a/rfcal/cmu200/session.c Mon Apr 24 01:43:02 2017 +0000 +++ b/rfcal/cmu200/session.c Mon Apr 24 02:17:04 2017 +0000 @@ -11,10 +11,39 @@ extern int activesock; +#define MAX_FIELDS 10 + +char client_cmd[256], *client_cmd_fields[MAX_FIELDS+1]; +int client_cmd_nfields; + +parse_cmd_into_fields() +{ + char *cp; + + client_cmd_nfields = 0; + for (cp = client_cmd; ; ) { + while (isspace(*cp)) + cp++; + if (*cp == '\0') + break; + if (client_cmd_nfields >= MAX_FIELDS) { + send_socket_response("-Command has too many fields\n"); + return(1); + } + client_cmd_fields[client_cmd_nfields++] = cp; + while (*cp && !isspace(*cp)) + cp++; + if (*cp) + *cp++ = '\0'; + } + client_cmd_fields[client_cmd_nfields] = 0; + return(0); +} + handle_command() { - char readbuf[256], linebuf[256]; - int cc, pos; + char readbuf[256]; + int cc, pos, rc; for (pos = 0; ; ) { cc = read(activesock, readbuf, sizeof readbuf); @@ -22,19 +51,25 @@ printf("Client program closed connection\n"); return(1); } - if (pos + cc > sizeof linebuf) { + if (pos + cc > sizeof client_cmd) { send_socket_response("-Command too long\n"); return(1); } - bcopy(readbuf, linebuf + pos, cc); + bcopy(readbuf, client_cmd + pos, cc); pos += cc; - if (linebuf[pos-1] == '\n') + if (client_cmd[pos-1] == '\n') break; } - linebuf[pos-1] = '\0'; - printf("Client command: %s\n", linebuf); - /* actual command handling will go here */ - return(0); + client_cmd[pos-1] = '\0'; + printf("Client command: %s\n", client_cmd); + rc = parse_cmd_into_fields(); + if (rc) + return(0); + if (!client_cmd_nfields) { + send_socket_response("+Empty command OK\n"); + return(0); + } + return dispatch_client_command(); } handle_session() diff -r db9ee7745cdd -r 47d56330609d rfcal/cmu200/socket.c --- a/rfcal/cmu200/socket.c Mon Apr 24 01:43:02 2017 +0000 +++ b/rfcal/cmu200/socket.c Mon Apr 24 02:17:04 2017 +0000 @@ -76,5 +76,6 @@ send_socket_response(str) char *str; { + printf("Msg to client: %s", str); write(activesock, str, strlen(str)); }