From 0397c6c1fa391f62fb6a47d9064399767c136014 Mon Sep 17 00:00:00 2001 From: Urban Wallasch Date: Sun, 21 Jul 2019 19:14:40 +0200 Subject: [PATCH] * Fixed whitespace, indentation, bracing style. * Removed clutter. --- shmget.c | 312 +++++++++++++++++++++++++------------------------------ 1 file changed, 139 insertions(+), 173 deletions(-) diff --git a/shmget.c b/shmget.c index 12b4c92..690e869 100644 --- a/shmget.c +++ b/shmget.c @@ -18,40 +18,32 @@ #include "log.h" -typedef uint64_t scs_timestamp_t; +#define SHM_KEY 0xecc11 -/* - * int shmget(key_t key, size_t size, int shmflg); - * void *shmat(int shmid, const void *shmaddr, int shmflg); - * int shmdt(const void *shmaddr); - * int shmctl(int shmid, int cmd, struct shmid_ds *buf); -*/ +typedef uint64_t scs_timestamp_t; struct telemetry_state_t { - - scs_timestamp_t timestamp; - scs_timestamp_t raw_rendering_timestamp; - scs_timestamp_t raw_simulation_timestamp; - scs_timestamp_t raw_paused_simulation_timestamp; - - - bool orientation_available; - float heading; - float pitch; - float roll; - - float speed; - float rpm; - int gear; - float cc; //cruise_control + scs_timestamp_t timestamp; + scs_timestamp_t raw_rendering_timestamp; + scs_timestamp_t raw_simulation_timestamp; + scs_timestamp_t raw_paused_simulation_timestamp; + + bool orientation_available; + float heading; + float pitch; + float roll; + + float speed; + float rpm; + int gear; + float cc; //cruise_control float fc_avg; //fuel consumption average - } *telemetry; static volatile int force_quit; -static void handle_signal(int sig){ +static void handle_signal(int sig) { fprintf (stderr, "SIGNAL: %d\n", sig); switch (sig){ case SIGTERM: @@ -61,212 +53,186 @@ static void handle_signal(int sig){ } } -#define KEY 0xecc11 - -static int shmputter(void){ - int shmid; - shmid = shmget (KEY, sizeof (struct telemetry_state_t), IPC_CREAT | IPC_EXCL | 0600); - if (shmid < 0) return -1; - telemetry = shmat (shmid, NULL, 0); - while (!force_quit){ - if (telemetry -> cc > 10) - telemetry -> cc -= 10; - else - telemetry -> cc += 20; - sleep (1); - } - shmdt (telemetry); - shmctl (shmid, IPC_RMID, NULL); - return 0; -} - enum respond_code { - r_index, - r_json, - r_none + r_index, + r_json, + r_none }; -static void respond(int fd, const char *req, int code){ +static void respond(int fd, const char *req, int code) { char buf[4096]; char origin[256] = "http://localhost"; char host[256] = "localhost"; const char *s; - switch (code){ - case r_json: - case r_index: - s = strstr(req, "Origin:"); - if (s){ - s += 8; //strlen("Origin: "); - const char *e = strstr(s, "\r\n"); - strncpy(origin, s, e-s); - } - s = strstr(req, "Host:"); - if (s){ - s += 6;//strlen("Host: "); - const char *e = strstr(s, "\r\n"); - strncpy(host, s, e-s); - } - - write(fd, buf, sprintf (buf, "HTTP/1.1 200 OK\r\n")); - write(fd, buf, sprintf (buf, "Host: %s\r\n", host)); - if (r_json == code){ - write(fd, buf, sprintf (buf, "Access-Control-Allow-Origin: %s\r\n", origin)); - write(fd, buf, sprintf (buf, "Content-type: text/json\r\n")); - write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); - write(fd, buf, sprintf (buf, "{ \"fc_avg\": %3.2f, \"speed\": %3.2f, \"cc\": %3.2f }", - 100.0 * telemetry->fc_avg , telemetry -> speed * 3.6, telemetry -> cc * 3.6)); + switch (code) { + case r_json: + case r_index: + s = strstr(req, "Origin:"); + if (s){ + s += 8; //strlen("Origin: "); + const char *e = strstr(s, "\r\n"); + strncpy(origin, s, e-s); + } + s = strstr(req, "Host:"); + if (s){ + s += 6;//strlen("Host: "); + const char *e = strstr(s, "\r\n"); + strncpy(host, s, e-s); + } + + write(fd, buf, sprintf (buf, "HTTP/1.1 200 OK\r\n")); + write(fd, buf, sprintf (buf, "Host: %s\r\n", host)); + if (r_json == code){ + write(fd, buf, sprintf (buf, "Access-Control-Allow-Origin: %s\r\n", origin)); + write(fd, buf, sprintf (buf, "Content-type: text/json\r\n")); + write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); + write(fd, buf, sprintf (buf, "{ \"fc_avg\": %3.2f, \"speed\": %3.2f, \"cc\": %3.2f }", + 100.0 * telemetry->fc_avg , telemetry -> speed * 3.6, telemetry -> cc * 3.6)); + } else { + struct file_info_t fi; + if (0 == fserv_open_server("index.html", &fi)){ + write(fd, buf, sprintf (buf, "Content-type: text/html\r\n")); + write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); + fserv_sendfile(fd, &fi); + fserv_close(&fi); } else { - struct file_info_t fi; - if (0 == fserv_open_server("index.html", &fi)){ - write(fd, buf, sprintf (buf, "Content-type: text/html\r\n")); - write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); - fserv_sendfile(fd, &fi); - fserv_close(&fi); - } else { - write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); - write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); - write(fd, buf, sprintf (buf, "Tough luck")); - } + write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); + write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); + write(fd, buf, sprintf (buf, "Tough luck")); } - break; - case r_none: - write(fd, buf, sprintf (buf, "HTTP/1.1 404 Not Found\r\n")); - write(fd, buf, sprintf (buf, "Host: localhost\r\n")); - write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); - write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); - write(fd, buf, sprintf (buf, "Fuck you 404!")); - break; - default: - write(fd, buf, sprintf (buf, "HTTP/1.1 500 Internal Server Error\r\n")); - write(fd, buf, sprintf (buf, "Host: localhost\r\n")); - write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); - write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); - write(fd, buf, sprintf (buf, "Fuck you 500!")); - break; - + } + break; + case r_none: + write(fd, buf, sprintf (buf, "HTTP/1.1 404 Not Found\r\n")); + write(fd, buf, sprintf (buf, "Host: localhost\r\n")); + write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); + write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); + write(fd, buf, sprintf (buf, "Fuck you 404!")); + break; + default: + write(fd, buf, sprintf (buf, "HTTP/1.1 500 Internal Server Error\r\n")); + write(fd, buf, sprintf (buf, "Host: localhost\r\n")); + write(fd, buf, sprintf (buf, "Content-type: text/plain\r\n")); + write(fd, buf, sprintf (buf, "Connection: close\r\n\r\n")); + write(fd, buf, sprintf (buf, "Fuck you 500!")); + break; } } -static int receive(int fd, int timeout){ -struct pollfd pe; -int res; -pe.fd = fd; -char buf[2048]; -int bread, total; +static int receive(int fd, int timeout) { + struct pollfd pe; + int res; + pe.fd = fd; + char buf[2048]; + int bread, total; -total = 0; -*buf = 0; -do { - pe.events = POLLIN; - pe.revents = 0; - if( (0 < (res = poll (&pe, 1, timeout))) && pe.revents == POLLIN){ - errno = 0; - bread = read(fd, buf + total, sizeof buf - total); - if (bread < 0) - switch (errno){ + total = 0; + *buf = 0; + do { + pe.events = POLLIN; + pe.revents = 0; + res = poll(&pe, 1, timeout); + if ( 0 < res && pe.revents == POLLIN ) { + errno = 0; + bread = read(fd, buf + total, sizeof buf - total); + if ( 0 > bread ) { + switch (errno) { case EAGAIN: //case EWOULDBLOCK: case EINTR: break; - default: res = -1; break; - } else - if (0 == bread && 0 == errno) { res = -1; } - else { - total += bread; - buf[total] = 0; - if (strstr(buf, "\r\n\r\n")){ - fprintf (stderr, "%s", buf); - if (0 == strncmp(buf, "GET /json HTTP", 10)) - respond(fd, buf, r_json); - else - if (0 == strncmp(buf, "GET / HTTP", 10)) - respond(fd, buf, r_index); - else - respond(fd, NULL, r_none); - *buf = 0; - res = 0; + } + } + else if ( 0 == bread && 0 == errno ) { + res = -1; + } + else { + total += bread; + buf[total] = 0; + if ( strstr(buf, "\r\n\r\n" ) ) { + fprintf (stderr, "%s", buf); + if (0 == strncmp(buf, "GET /json HTTP", 10)) + respond(fd, buf, r_json); + else if (0 == strncmp(buf, "GET / HTTP", 10)) + respond(fd, buf, r_index); + else + respond(fd, NULL, r_none); + *buf = 0; + res = 0; + } } } - } - timeout = 200; -} while ((1 == res) && (pe.revents == POLLIN) && !force_quit); -return res; + timeout = 200; + } while ( 1 == res && pe.revents == POLLIN && !force_quit ); + return res; } -static void *handle_conn( void *p ){ +static void *handle_conn( void *p ) { int sock = *(int*)p; int err; - DPRINT ("sock: %d\n", sock); + DPRINT( "sock: %d\n", sock ); do { - err = receive (sock, 1000); - } while (err > 0 && !force_quit); - + err = receive(sock, 1000); + } while ( 0 < err && !force_quit ); net_close( sock ); return p; } -static int shmgetter(void){ +static int shmgetter(void) { int ret; int shmid; int as, ss; - pthread_t tid; pthread_attr_t attr; - shmid = shmget (KEY, sizeof (struct telemetry_state_t), 0); - if (shmid < 0) { - EPRINT( "shmget failed\n" ); + shmid = shmget(SHM_KEY, sizeof *telemetry, 0); + if ( 0 > shmid ) { + EPRINT( "shmget failed\n" ); ret = -1; goto err_shmget; } - telemetry = shmat (shmid, NULL, SHM_RDONLY); - if ((void *) -1 == telemetry){ - EPRINT( "shmget failed\n" ); - ret = -2; - goto err_shmat; - } + telemetry = shmat(shmid, NULL, SHM_RDONLY); + if ((void *)-1 == telemetry) { + EPRINT( "shmget failed\n" ); + ret = -2; + goto err_shmat; + } ss = net_open_server( 8837, "*" ); - if ( ss < 0 ) - { - EPRINT( "net_open_server failed!\n" ); + if ( ss < 0 ) { + EPRINT( "net_open_server failed!\n" ); ret = -3; - goto err_open_server; - } + goto err_open_server; + } - while (!force_quit){ - if ((as = net_accept( ss )) > 0){ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&tid, &attr, handle_conn, &as); - usleep (100); + while ( !force_quit ) { + if ( (as = net_accept( ss )) > 0 ) { + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + pthread_create(&tid, &attr, handle_conn, &as); + usleep (100); } } err_open_server: err_shmat: - shmdt (telemetry); + shmdt(telemetry); err_shmget: return ret; } - -int main(int argc, char *argv[]){ +int main(int argc, char *argv[]) { int res; - //install signal handlers + + //install signal handlers signal(SIGTERM, handle_signal); signal(SIGINT, handle_signal); - - if (strstr(argv[0], "shmput")){ - res = shmputter(); - } else { - res = shmgetter(); - } + res = shmgetter(); puts(""); return res; } -- 2.30.2