thermferm/server.c

changeset 48
d8c64f81b192
parent 46
000399c64d3f
child 49
92a9ca143677
--- 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");

mercurial