#include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "dhcp.h" #include "dhcpcd.h" #include "errno.h" #include "logger.h" #include "logwriter.h" #include "status.h" #include "../../common/fbgui.h" // for constants /*sockets for the logger and the qt-reader */ int sockfd, ns; int retval = -1; char socketName[QTSOCKETADDRESSLENGTH]; char interfaceName[IF_NAMESIZE]; char mesg[1024]; void setSocketName(const char * sn) { snprintf(socketName, sizeof(socketName), "%s", sn); } void setInterfaceName(const char * in){ snprintf(interfaceName, sizeof(interfaceName), "%s", in); } int initQtLoggerSocket() { /** * new code. seems to be right. */ struct sockaddr_un serv_addr; fprintf(stdout,"start init \n"); sockfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sockfd < 0) { fprintf(stdout,"ERROR opening socket \n"); retval = sockfd; return sockfd; } serv_addr.sun_family = AF_UNIX; strcpy(serv_addr.sun_path, socketName); retval = connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); if ( retval < 0) fprintf(stdout,"ERROR connecting \n"); fprintf(stdout,"init Qt Logger Socket done \n"); return retval; } void closeQtLoggerSocket (){ close(sockfd); } /* void logToQt(char * status, char * substatus, char * msg) { char * m = malloc(strlen(interfaceName) + strlen(status) + strlen(substatus) + strlen(msg) +4 ); strcpy(m,interfaceName); strcat(m,";"); strcat(m,status); strcat(m,";"); strcat(m,substatus); strcat(m,";"); strcat(m,msg); sendToQt(m); free(m); } */ void sendToQt(log_msg * msg) { int n = -1; int t; int ret; const char *tpl = "%s;%d;%d;%s\n"; char outbuf[DHCP_MESSAGE_SIZE]; char ack[ACK_SIZE]; /* size_t outbuf_size = sizeof(char) * 4 + // ";" *3 + newline sizeof(int) * 2 + // status, substatus sizeof(msg->device) + // devicename sizeof(msg->msg); // msg outbuf = malloc(outbuf_size); memset(outbuf, 0, outbuf_size); snprintf(outbuf, sizeof(char) * 3 + sizeof(int) * 2 + sizeof(msg->device) + sizeof(msg->msg), tpl, msg->device, msg->status, msg->substatus, msg->msg); */ memset(outbuf, '\0', DHCP_MESSAGE_SIZE); ret = snprintf(outbuf, DHCP_MESSAGE_SIZE, tpl, msg->device, msg->status, msg->substatus, msg->msg); if (ret < 1) { syslog(LOG_INFO, "[fbgui] ERROR filling message buffer"); return; } if (outbuf != NULL) { n = send(sockfd, outbuf, DHCP_MESSAGE_SIZE, 0); } //free(outbuf); syslog(LOG_INFO, "[fbgui] INFO writing to socket: [%d:%d] %s (%s)", msg->status, msg->substatus, msg->msg, msg->device); // fflush(sockfd); if (n <= 0) { syslog(LOG_ERR, "[fbgui] ERROR writing to socket: [%d:%d] %s (%s)", msg->status, msg->substatus, msg->msg, msg->device); // fprintf(stdout, "ERROR writing to socket: %s", msg); } memset(ack,0,ACK_SIZE); if ((t = recv(sockfd, ack, ACK_SIZE, 0)) > 0) { syslog(LOG_ERR, "[fbgui] recv ack echo> %s", ack); printf("received: %s\n", ack); } else { if (t < 0) syslog(LOG_ERR, "[fbgui] ERROR receiving from socket"); else syslog(LOG_ERR, "[fbgui] ERROR Server closed"); } //usleep(500); } void logToQt(int status, int substatus, const char * msg) { if (retval >= 0) { log_msg lm; lm.status = status; lm.substatus = substatus; snprintf(lm.msg, sizeof(lm.msg), "%s", msg); snprintf(lm.device, sizeof(lm.device), "%s", interfaceName); sendToQt(&lm); } } void logSendToQt(int type) { switch(type) { case DHCP_DISCOVER: logToQt(LOG_INFO, DHCP_DISCOVER, "send discover"); break; case DHCP_OFFER: logToQt(LOG_INFO, DHCP_OFFER, "send offer"); break; case DHCP_REQUEST: logToQt(LOG_INFO, DHCP_REQUEST, "send request"); break; case DHCP_DECLINE: logToQt(LOG_INFO, DHCP_DECLINE, "send decline"); break; case DHCP_ACK: logToQt(LOG_INFO, DHCP_ACK, "send ack"); break; case DHCP_NAK: logToQt(LOG_INFO, DHCP_NAK, "send nak"); break; case DHCP_RELEASE: logToQt(LOG_INFO, DHCP_RELEASE, "send release"); break; case DHCP_INFORM: logToQt(LOG_INFO, DHCP_INFORM, "send inform"); break; default : break; } } void logLoggerToQt(int level, const char *fmt, va_list args) { vsnprintf(mesg, sizeof(mesg), fmt, args); strcat(mesg, "\n"); logToQt(level, DHCPCD_LOG, mesg); } void logGatewayToFile(const interface_t *iface, const dhcp_t *dhcp) { FILE *f; route_t *route; char path[QTSOCKETADDRESSLENGTH]; strcpy(path, DEFAULT_GATEWAY_INFO_LOCATION); strcat(path, iface->name); syslog (LOG_INFO, "[fbgui] try to open file: %s", path); logger(LOG_DEBUG, "writing %s", iface->infofile); if ((f = fopen(path, "w")) == NULL) { logger(LOG_ERR, "fopen `%s': %s", path, strerror(errno)); } if (dhcp->routes) { bool doneone = false; STAILQ_FOREACH (route, dhcp->routes, entries) { if (route->destination.s_addr == 0) { if (doneone) fprintf(f, ","); fprintf(f, "%s", inet_ntoa(route->gateway)); doneone = true; } } fprintf(f, "\n"); } fclose(f); }