diff -r e2c1f2373be0 -r d8c64f81b192 thermferm/server.c --- a/thermferm/server.c Tue May 20 22:42:26 2014 +0200 +++ b/thermferm/server.c Thu May 22 13:54:52 2014 +0200 @@ -30,7 +30,6 @@ extern int lcdHandle; extern unsigned char lcdbuf[MAX_LCDS][20][4]; extern sys_config Config; -extern int clients; int s; /* connected socket */ int ls; /* listen socket */ @@ -43,33 +42,47 @@ #define SS_BUFSIZE 1024 #define SS_TIMEOUT 300 +unsigned char cs_mode = 'o'; /* o = Off, f = fridge, b = beer, p = profile-run */ +float cs_beerSet = 20.0; +float cs_fridgeSet = 20.0; +float cs_heatEstimator = 0.2; +float cs_coolEstimator = 5; + +unsigned char cc_tempFormat = 'C'; +float cc_tempSetMin = 1.0; +float cc_tempSetMax = 30.0; +float cc_idleRangeH = 1.000; +float cc_idleRangeL = -1.000; + +float cv_beerDiff = 0.0; + void defaultControlsettings(void) { - beer->cs_mode = 'o'; /* o = Off, f = fridge, b = beer, p = profile-run */ - beer->cs_beerSet = 20.0; - beer->cs_fridgeSet = 20.0; - beer->cs_heatEstimator = 0.2; - beer->cs_coolEstimator = 5; + cs_mode = 'o'; /* o = Off, f = fridge, b = beer, p = profile-run */ + cs_beerSet = 20.0; + cs_fridgeSet = 20.0; + cs_heatEstimator = 0.2; + cs_coolEstimator = 5; } void defaultControlConstants(void) { - beer->cc_tempFormat = 'C'; - beer->cc_tempSetMin = 1.0; - beer->cc_tempSetMax = 30.0; - beer->cc_idleRangeH = 1.000; - beer->cc_idleRangeL = -1.000; + cc_tempFormat = 'C'; + cc_tempSetMin = 1.0; + cc_tempSetMax = 30.0; + cc_idleRangeH = 1.000; + cc_idleRangeL = -1.000; } void defaultControlVariables(void) { - beer->cv_beerDiff = 0.0; + cv_beerDiff = 0.0; } @@ -89,9 +102,10 @@ vsnprintf(out, SS_BUFSIZE-1, format, va_ptr); va_end(va_ptr); - syslog(LOG_NOTICE, "send: \"%s\"", out); - if (debug) + if (debug) { + syslog(LOG_NOTICE, "send: \"%s\"", out); fprintf(stdout, "send: \"%s\"\n", out); + } if (send(s, out, strlen(out), 0) != strlen(out)) { syslog(LOG_NOTICE, "srv_send failed"); @@ -120,25 +134,10 @@ void cmd_server(void) { char *inp, *hostname, buf[SS_BUFSIZE], obuf[SS_BUFSIZE]; - int i, rc, rlen, timer; + int i, rc, rlen; socklen_t fromlen; - struct pollfd pfd[1]; float newtemp; - /* - * Close listen socket - */ - close(ls); - /* - * Install private signal handler. - */ - for (i = 0; i < NSIG; i++) { - if ((i == SIGHUP) || (i == SIGPIPE) || (i == SIGBUS) || (i == SIGILL) || (i == SIGSEGV)) - signal(i, (void (*))cmd_die); - else - signal(i, SIG_IGN); - } - hp = gethostbyaddr ((char *) &peeraddr_in.sin_addr, sizeof(struct in_addr), peeraddr_in.sin_family); if (hp == NULL) { hostname = inet_ntoa(peeraddr_in.sin_addr); @@ -146,136 +145,96 @@ hostname = hp->h_name; } - clients++; - syslog(LOG_NOTICE, "Start new client connection (%d) from %s port %u", clients, hostname, ntohs(peeraddr_in.sin_port)); - if (debug) - fprintf(stdout, "Start new client connection (%d) from %s port %u\n", clients, hostname, ntohs(peeraddr_in.sin_port)); - timer = SS_TIMEOUT * 4; - - /* - * Receive loop - */ - for (;;) { - /* - * Poll socket until a define timeout of 0,25 second. - */ - pfd[0].fd = s; - pfd[0].events = POLLIN; - pfd[0].revents = 0; - rc = poll(pfd, 1, 250); - - if (rc == -1) { - /* - * Poll can be interrupted by a finished child so that's not a real error. - */ - if (errno != EINTR) { - syslog(LOG_NOTICE, "poll() rc=%d sock=%d events=%04x", rc, s, pfd[0].revents); - } - } else if (rc) { - if (pfd[0].revents & POLLIN) { - memset((char *)&buf, 0, SS_BUFSIZE); - fromlen = sizeof(peeraddr_in); - rlen = recvfrom(s, buf, sizeof(buf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); - if (rlen == -1) { - syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); - } else { - for (i = 0; i < strlen(buf); i++) { - if (buf[i] == '\n') - buf[i] = '\0'; - if (buf[i] == '\r') - buf[i] = '\0'; - } - timer = SS_TIMEOUT * 4; - if (strlen(buf)) { - syslog(LOG_NOTICE, "recv: \"%s\"", buf); - if (debug) - fprintf(stdout, "recv: \"%s\"\n", buf); + if (debug) { + syslog(LOG_NOTICE, "Start new client connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port)); + fprintf(stdout, "Start new client connection from %s port %u\n", hostname, ntohs(peeraddr_in.sin_port)); + } - /* - * Process commands from the client - */ - if (strncmp(buf, "ack", 3) == 0) { - srv_send((char *)"ack"); - } else if (strncmp(buf, "lcd", 3) == 0) { - sprintf(obuf, "[\" \", \" \", \" \", \" \"]"); - for (i = 0; i < 20; i++) { - obuf[i+2] = lcdbuf[lcdHandle][i][0]; - obuf[i+26] = lcdbuf[lcdHandle][i][1]; - obuf[i+50] = lcdbuf[lcdHandle][i][2]; - obuf[i+74] = lcdbuf[lcdHandle][i][3]; - } - srv_send(obuf); - } else if (strncmp(buf, "getMode", 7) == 0) { - srv_send("%c", beer->cs_mode); - } else if (strncmp(buf, "getFridge", 9) == 0) { - srv_send("%.1f", beer->cs_fridgeSet); - } else if (strncmp(buf, "getBeer", 7) == 0) { - srv_send("%.1f", beer->cs_beerSet); - } else if (strncmp(buf, "getControlConstants", 19) == 0) { - srv_send("{ \"tempFormat\":\"%c\", \"tempSetMin\":%.1f, \"tempSetMax\":%.1f, \"idleRangeH\":%.3f, \"idleRangeL\":%.3f }", - beer->cc_tempFormat, beer->cc_tempSetMin, beer->cc_tempSetMax, beer->cc_idleRangeH, beer->cc_idleRangeL ); - } else if (strncmp(buf, "getControlSettings", 18) == 0) { - srv_send("{ \"mode\":\"%c\", \"beerSet\":%.1f, \"fridgeSet\":%.1f, \"heatEstimator\":%.1f, \"coolEstimator\":%.1f }", - beer->cs_mode, beer->cs_beerSet, beer->cs_fridgeSet, beer->cs_heatEstimator, beer->cs_coolEstimator); - } else if (strncmp(buf, "getControlVariables", 19) == 0) { - srv_send("{ \"beerDiff\":%.2f }", beer->cv_beerDiff); - } else if (strncmp(buf, "setBeer=", 8) == 0) { - inp = xstrcpy(buf+8); - rc = sscanf(inp, "%f", &newtemp); - if (debug) - fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); - if (rc == 1) { - srv_send("ack"); - beer->cs_mode = 'b'; - beer->cs_beerSet = newtemp; - } else { - srv_send("err"); - } - } else if (strncmp(buf, "setFridge=", 10) == 0) { - inp = xstrcpy(buf+10); - rc = sscanf(inp, "%f", &newtemp); - if (debug) - fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); - if (rc == 1) { - srv_send("ack"); - beer->cs_mode = 'f'; - beer->cs_fridgeSet = newtemp; - } else { - srv_send("err"); - } - } else { - if (debug) - fprintf(stdout, "unknown command \"%s\"\n", buf); - srv_send((char *)"ERR"); - } - break; - } - } - } else { - syslog(LOG_NOTICE, "poll other event"); + memset((char *)&buf, 0, SS_BUFSIZE); + fromlen = sizeof(peeraddr_in); + rlen = recvfrom(s, buf, sizeof(buf) -1, 0, (struct sockaddr *)&peeraddr_in, &fromlen); + if (rlen == -1) { + syslog(LOG_NOTICE, "recvfrom(): %s", strerror(errno)); + } else { + for (i = 0; i < strlen(buf); i++) { + if (buf[i] == '\n') + buf[i] = '\0'; + if (buf[i] == '\r') + buf[i] = '\0'; + } + if (strlen(buf)) { + if (debug) { + syslog(LOG_NOTICE, "recv: \"%s\"", buf); + fprintf(stdout, "recv: \"%s\"\n", buf); } - } else { /* - * Poll timeout, do some housekeeping + * Process commands from the client */ - if (timer) { - timer--; + if (strncmp(buf, "ack", 3) == 0) { + srv_send((char *)"ack"); + } else if (strncmp(buf, "lcd", 3) == 0) { + sprintf(obuf, "[\" \", \" \", \" \", \" \"]"); + for (i = 0; i < 20; i++) { + obuf[i+2] = lcdbuf[lcdHandle][i][0]; + obuf[i+26] = lcdbuf[lcdHandle][i][1]; + obuf[i+50] = lcdbuf[lcdHandle][i][2]; + obuf[i+74] = lcdbuf[lcdHandle][i][3]; + } + srv_send(obuf); + } else if (strncmp(buf, "getMode", 7) == 0) { + srv_send("%c", cs_mode); + } else if (strncmp(buf, "getFridge", 9) == 0) { + srv_send("%.1f", cs_fridgeSet); + } else if (strncmp(buf, "getBeer", 7) == 0) { + srv_send("%.1f", cs_beerSet); + } else if (strncmp(buf, "getControlConstants", 19) == 0) { + srv_send("{ \"tempFormat\":\"%c\", \"tempSetMin\":%.1f, \"tempSetMax\":%.1f, \"idleRangeH\":%.3f, \"idleRangeL\":%.3f }", + cc_tempFormat, cc_tempSetMin, cc_tempSetMax, cc_idleRangeH, cc_idleRangeL ); + } else if (strncmp(buf, "getControlSettings", 18) == 0) { + srv_send("{ \"mode\":\"%c\", \"beerSet\":%.1f, \"fridgeSet\":%.1f, \"heatEstimator\":%.1f, \"coolEstimator\":%.1f }", + cs_mode, cs_beerSet, cs_fridgeSet, cs_heatEstimator, cs_coolEstimator); + } else if (strncmp(buf, "getControlVariables", 19) == 0) { + srv_send("{ \"beerDiff\":%.2f }", cv_beerDiff); + } else if (strncmp(buf, "setBeer=", 8) == 0) { + inp = xstrcpy(buf+8); + rc = sscanf(inp, "%f", &newtemp); + if (debug) + fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); + if (rc == 1) { + srv_send("ack"); + cs_mode = 'b'; + cs_beerSet = newtemp; + } else { + srv_send("err"); + } + free(inp); + } else if (strncmp(buf, "setFridge=", 10) == 0) { + inp = xstrcpy(buf+10); + rc = sscanf(inp, "%f", &newtemp); + if (debug) + fprintf(stdout, "new temp from %s, %.1f, rc=%d\n", inp, newtemp, rc); + if (rc == 1) { + srv_send("ack"); + cs_mode = 'f'; + cs_fridgeSet = newtemp; + } else { + srv_send("err"); + } + free(inp); } else { - /* Inactivity timeout */ - break; - } - if (my_shutdown) { - break; + if (debug) + fprintf(stdout, "unknown command \"%s\"\n", buf); + srv_send((char *)"ERR"); } } } - if (clients) - clients--; - syslog(LOG_NOTICE, "End connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port)); - if (debug) + if (debug) { + syslog(LOG_NOTICE, "End connection from %s port %u", hostname, ntohs(peeraddr_in.sin_port)); fprintf(stdout, "End connection from %s port %u\n", hostname, ntohs(peeraddr_in.sin_port)); + } + close(s); } @@ -290,10 +249,6 @@ if (debug) fprintf(stdout, "Thread my_server_loop started\n"); - defaultControlsettings(); - defaultControlConstants(); - defaultControlVariables(); - memset((char *)&myaddr_in, 0, sizeof(struct sockaddr_in)); memset((char *)&peeraddr_in, 0, sizeof(struct sockaddr_in)); myaddr_in.sin_family = AF_INET; @@ -356,23 +311,7 @@ return 0; } - switch (fork()) { - case -1: /* - * Can't fork, just continue. - */ - return 0; - case 0: /* - * Child process, the commandline server. - */ - cmd_server(); - return 0; - default: /* - * Daemon process comes here. The daemon - * needs to remember to close the new - * accept socket after forking the child. - */ - close(s); - } + cmd_server(); if (my_shutdown) { syslog(LOG_NOTICE, "Thread my_server_loop stopped");