diff -r 442357970a34 -r dafbbd5e9922 coolers/coolers.c --- a/coolers/coolers.c Sat May 17 10:50:16 2014 +0200 +++ b/coolers/coolers.c Sat May 17 23:06:39 2014 +0200 @@ -33,7 +33,7 @@ int coolerA = 0; int coolerB = 0; -bool shutdown = false; +bool my_shutdown = false; static pid_t pgrp, mypid; extern bool debug; @@ -41,6 +41,13 @@ extern int lcdHandle; int lcdupdate; +int sock = -1; /* Datagram socket */ +struct sockaddr_un servaddr; /* Server address */ +struct sockaddr_un from; /* From address */ +static char spath[PATH_MAX]; /* Socket path */ +socklen_t fromlen; + + int server(void); void help(void); void die(int); @@ -68,14 +75,14 @@ default: syslog(LOG_NOTICE, "die() on signal %d", onsig); } - shutdown = true; + my_shutdown = true; } void stopLCD(void) { - lcdClear(lcdHandle); + mb_lcdClear(lcdHandle); setBacklight(0); } @@ -158,10 +165,11 @@ } lcdPosition(lcdHandle, 0, 0); - lcdPuts(lcdHandle, "Coolers"); + sprintf(buf, "Coolers"); + mb_lcdPuts(lcdHandle, buf); lcdPosition(lcdHandle, 0, 1); sprintf(buf, "Version %s", VERSION); - lcdPuts(lcdHandle, buf); + mb_lcdPuts(lcdHandle, buf); if (Config.tx433 != -1) { if (debug) @@ -239,7 +247,9 @@ char buf[1024]; w1_therm *tmp1, *old1; rc_switch *tmp2, *old2; - int rc, run = 0, temp; + int rc, run = 0, temp, rlen; + struct pollfd pfd[1]; + if (lockprog((char *)"coolers")) { syslog(LOG_NOTICE, "Can't lock"); @@ -254,10 +264,72 @@ syslog(LOG_NOTICE, "my_sensors_loop thread didn't start rc=%d", rc); } + /* + * Setup socket so that clients can communicate with this server. + */ + if ((sock = socket(AF_UNIX, SOCK_DGRAM, 0)) < 0) { + fprintf(stderr, "Can't create socket\n"); + return 1; + } + + snprintf(spath, PATH_MAX, "/var/run/coolers.sock"); + memset(&servaddr, 0, sizeof(servaddr)); + servaddr.sun_family = AF_UNIX; + strcpy(servaddr.sun_path, spath); + + if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) { + close(sock); + sock = -1; + fprintf(stderr, "Can't bind socket %s\n", spath); + return 1; + } + if (chmod(spath, 0666)) { + fprintf(stderr, "Can't chmod 0666 %s\n", spath); + close(sock); + sock = -1; + unlink(spath); + return 1; + } + if (debug) + fprintf(stdout, "Unix socket created\n"); + snprintf(buf, 1023, "tempA,coolerA,tempB,coolerB"); logger((char *)"coolers.log", (char *)"coolers", buf); do { + /* + * Poll UNIX Datagram socket the defined timeout of one second. + * This means we listen if a client program has something to tell us. + * Timeout is one second, after the timeout the rest of the mainloop is executed. + */ + pfd[0].fd = sock; + pfd[0].events = POLLIN; + pfd[0].revents = 0; + rc = poll(pfd, 1, 1000); + + 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, sock, pfd[0].revents); + } + } else if (rc) { + if (pfd[0].revents & POLLIN) { + /* + * Process the clients request for mbtask commands. + */ + memset(&buf, 0, sizeof(buf)); + fromlen = sizeof(from); + rlen = recvfrom(sock, buf, sizeof(buf) -1, 0, (struct sockaddr *)&from, &fromlen); + if (rlen == -1) { + syslog(LOG_NOTICE, "recvfrom() for socket receiver"); + } else { +// do_cmd(buf); + } + } + } + lcdupdate = FALSE; run = my_mosquitto_loop(); @@ -297,13 +369,13 @@ lcdPosition(lcdHandle, 0, 0); tmp1 = Config.w1therms; snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerA ? '+' : ' ', tmp1->alias); - lcdPuts(lcdHandle, buf); + mb_lcdPuts(lcdHandle, buf); temp = tmp1->lastval; old1 = tmp1->next; tmp1 = old1; lcdPosition(lcdHandle, 0, 1); snprintf(buf, 16, "%4.1f %cC %c %s ", tmp1->lastval / 1000.0, 0xdf, coolerB ? '+' : ' ', tmp1->alias); - lcdPuts(lcdHandle, buf); + mb_lcdPuts(lcdHandle, buf); snprintf(buf, 1023, "%.1f,%s,%.1f,%s", temp / 1000.0, coolerA ? (char *)"on" : (char *)"off", tmp1->lastval / 1000.0, coolerB ? (char *)"on" : (char *)"off"); logger((char *)"coolers.log", (char *)"coolers", buf); @@ -329,6 +401,7 @@ disableTransmit(); ulockprog((char *)"coolers"); + unlink(spath); if (debug) fprintf(stdout, "Goodbye\n");