diff --git a/src/sinkSender.c b/src/sinkSender.c index 63cfae6..4106c08 100644 --- a/src/sinkSender.c +++ b/src/sinkSender.c @@ -56,6 +56,64 @@ void sinkSenderInit(config_t *pCfg) { secondOfMinute = 0; } + +static void sinkSenderSendMinute() { + led(E_BLUE, true); + led(E_RED, false); + + struct sysinfo info; + sysinfo(&info); + + minuteBuffer.s.totalRunningHours = info.uptime / 3600; + minuteBuffer.s.totalPowercycles = 0; + minuteBuffer.s.totalWatchdogResets = 0; + minuteBuffer.s.version = strtol(VERSION, NULL, 16); + + memset(minuteBuffer.s.deviceId, 0, sizeof(minuteBuffer.s.deviceId)); + strcpy(minuteBuffer.s.deviceId, deviceId); + + memcpy(minuteBuffer.s.hash, sharedSecret, SHA256_BLOCK_SIZE); + SHA256_CTX ctx; + sha256_init(&ctx); + sha256_update(&ctx, minuteBuffer.b, sizeof(minuteBuffer.b)); + sha256_final(&ctx, minuteBuffer.s.hash); + + struct hostent *hptr = gethostbyname(sinkServer); + if (hptr) { + if (hptr->h_addrtype == AF_INET) { + char *sinkAddr = hptr->h_addr_list[0]; + logmsg(LOG_DEBUG, "sink addr: %d.%d.%d.%d", + sinkAddr[0], sinkAddr[1], sinkAddr[2], sinkAddr[3]); + + int sockfd = socket(AF_INET, SOCK_DGRAM, 0); + if (sockfd != -1) { + struct sockaddr_in servaddr; + memset(&servaddr, 0, sizeof(servaddr)); + servaddr.sin_family = AF_INET; + servaddr.sin_port = htons(sinkPort); + memcpy(&servaddr.sin_addr.s_addr, sinkAddr, 4); + + ssize_t res = sendto(sockfd, minuteBuffer.b, sizeof(minuteBuffer.b), + 0, (struct sockaddr*)&servaddr, + sizeof(servaddr)); + logmsg(LOG_DEBUG, "%d octets sent", res); + } else { + led(E_RED, true); + logmsg(LOG_ERR, "unable to get socket: %s", strerror(errno)); + } + } else { + led(E_RED, true); + logmsg(LOG_ERR, "unknown address type: %d", hptr->h_addrtype); + } + } else { + led(E_RED, true); + logmsg(LOG_ERR, "sinkserver %s couldn't be resolved: %s", sinkServer, hstrerror(h_errno)); + } + + led(E_BLUE, false); +} + + void sinkSenderPut(uint32_t seconds, uint32_t frequency) { led(E_GREEN, false); logmsg(LOG_DEBUG, "s: %lu, f: %lu", seconds, frequency); @@ -69,55 +127,9 @@ void sinkSenderPut(uint32_t seconds, uint32_t frequency) { if (secondOfMinute == SECONDS_PER_MINUTE) { logmsg(LOG_DEBUG, "minute is full"); secondOfMinute = 0; - - struct sysinfo info; - sysinfo(&info); - - minuteBuffer.s.totalRunningHours = info.uptime / 3600; - minuteBuffer.s.totalPowercycles = 0; - minuteBuffer.s.totalWatchdogResets = 0; - minuteBuffer.s.version = strtol(VERSION, NULL, 16); - - memset(minuteBuffer.s.deviceId, 0, sizeof(minuteBuffer.s.deviceId)); - strcpy(minuteBuffer.s.deviceId, deviceId); - - memcpy(minuteBuffer.s.hash, sharedSecret, SHA256_BLOCK_SIZE); - SHA256_CTX ctx; - sha256_init(&ctx); - sha256_update(&ctx, minuteBuffer.b, sizeof(minuteBuffer.b)); - sha256_final(&ctx, minuteBuffer.s.hash); - - struct hostent *hptr = gethostbyname(sinkServer); - if (hptr) { - if (hptr->h_addrtype == AF_INET) { - char *sinkAddr = hptr->h_addr_list[0]; - logmsg(LOG_DEBUG, "sink addr: %d.%d.%d.%d", - sinkAddr[0], sinkAddr[1], sinkAddr[2], sinkAddr[3]); - - int sockfd = socket(AF_INET, SOCK_DGRAM, 0); - if (sockfd != -1) { - struct sockaddr_in servaddr; - memset(&servaddr, 0, sizeof(servaddr)); - servaddr.sin_family = AF_INET; - servaddr.sin_port = htons(sinkPort); - memcpy(&servaddr.sin_addr.s_addr, sinkAddr, 4); - - ssize_t res = sendto(sockfd, minuteBuffer.b, sizeof(minuteBuffer.b), - 0, (struct sockaddr*)&servaddr, - sizeof(servaddr)); - logmsg(LOG_DEBUG, "%d octets sent", res); - } else { - logmsg(LOG_ERR, "unable to get socket: %s", strerror(errno)); - } - } else { - logmsg(LOG_ERR, "unknown address type: %d", hptr->h_addrtype); - } - } else { - logmsg(LOG_ERR, "sinkserver %s couldn't be resolved: %s", sinkServer, hstrerror(h_errno)); - } - + + sinkSenderSendMinute(); } - led(E_GREEN, true); }