From 8024e86b5ce80beb2870654cf29308a0f1f208b8 Mon Sep 17 00:00:00 2001 From: Niklas Date: Thu, 1 Sep 2011 16:16:07 +0200 Subject: bigger changes in the checkConnectivity method. using now route command to delete and add the default route. for this i am writing the gateways for every interface into a new file. located at /var/tmp/gateways_ --- LogReceiver/LogReceiver | Bin 122376 -> 130952 bytes LogReceiver/Makefile | 2 +- LogReceiver/logreceiver.cpp | 57 ++++++++++++++++++++++++++++++- LogReceiver/logreceiver.h | 4 ++- UnixDomainSocketServer/server | Bin 0 -> 7638 bytes UnixDomainSocketServer/server.c | 74 ++++++++++++++++++++++++++++++++++++++++ customdhcpcd/src/Makefile | 4 +-- customdhcpcd/src/configure.c | 2 ++ customdhcpcd/src/customdhcpcd | Bin 173171 -> 175254 bytes customdhcpcd/src/dhcpcd.h | 1 + customdhcpcd/src/logwriter.c | 74 ++++++++++++++++++++++++++++++++-------- customdhcpcd/src/logwriter.h | 2 +- 12 files changed, 200 insertions(+), 20 deletions(-) create mode 100755 UnixDomainSocketServer/server create mode 100644 UnixDomainSocketServer/server.c diff --git a/LogReceiver/LogReceiver b/LogReceiver/LogReceiver index a16897b..21d42f2 100755 Binary files a/LogReceiver/LogReceiver and b/LogReceiver/LogReceiver differ diff --git a/LogReceiver/Makefile b/LogReceiver/Makefile index cd541af..2b6b8c6 100644 --- a/LogReceiver/Makefile +++ b/LogReceiver/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: LogReceiver -# Generated by qmake (2.01a) (Qt 4.7.2) on: Wed Aug 24 10:11:58 2011 +# Generated by qmake (2.01a) (Qt 4.7.2) on: Thu Sep 1 13:01:39 2011 # Project: LogReceiver.pro # Template: app # Command: /usr/local/Trolltech/QtEmbedded-4.7.2/bin/qmake -o Makefile LogReceiver.pro diff --git a/LogReceiver/logreceiver.cpp b/LogReceiver/logreceiver.cpp index 802f442..1256bfe 100644 --- a/LogReceiver/logreceiver.cpp +++ b/LogReceiver/logreceiver.cpp @@ -222,6 +222,60 @@ void LogReceiver::checkInternetConnection(QList &interfaces) { checkInternetConnection(nI); } } + +void LogReceiver::checkConnectivity(QString ifName) { + QString command("route"); + QStringList argList; + QString gateway(" "); + + // get gateway address + QString pathToGatewayFile(DEFAULT_GATEWAY_INFO_LOCATION); + pathToGatewayFile += ifName; + QFile file(pathToGatewayFile); + if(file.exists()) { + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + qDebug() << "couldnt open file:" << pathToGatewayFile; + return; + } + while(!file.atEnd()) { + QString line(file.readLine()); + QStringList gateways = line.split(","); + gateway = gateways.first().trimmed(); + } + } + else { + qDebug() << "file doesn't exist:" << pathToGatewayFile; + return; + } + + // delete default route + argList << "del" << "default"; + QProcess * p = new QProcess(this); + p->start(command, argList); + p->waitForFinished(); + + // add new default route + argList.clear(); + argList << "add" << "default" << "gw" << gateway << ifName; + p = new QProcess(this); + p->start(command, argList); + p->waitForFinished(); + + // check connectivity via tcp connection + QTcpSocket *tcpSocket = new QTcpSocket(this); + tcpSocket->connectToHost(QString("209.85.148.105"), 80); + if (!tcpSocket->waitForConnected(2000)) { + qDebug() << "no internet connection with interface" << ifName; + qDebug() << tcpSocket->errorString(); + emit updateStatusLabel(ifName, "connection not possible"); + } else { + qDebug() << "internet: check passed! for interface" << ifName; + emit + updateStatusLabel(ifName, "connection possible"); + emit connectionEstablished(ifName); + } +} + void LogReceiver::checkInternetConnectionViaTCP(QString ifName) { const bool canStartIAP = (configurationManager.capabilities() @@ -418,7 +472,8 @@ void LogReceiver::handleProcessFinished(int exitCode, emit updateStatusLabel(ifName, "check connectivity"); //checkInternetConnection(ifName); - checkInternetConnectionViaTCP(ifName); + //checkInternetConnectionViaTCP(ifName); + checkConnectivity(ifName); } } QLocalSocket *client = ifNameToClient.value(ifName, 0); diff --git a/LogReceiver/logreceiver.h b/LogReceiver/logreceiver.h index ce6d070..a8572d0 100644 --- a/LogReceiver/logreceiver.h +++ b/LogReceiver/logreceiver.h @@ -16,7 +16,8 @@ class LogReceiver: public QObject { Q_OBJECT #define DEFAULT_QTSOCKETADDRESS "/var/tmp/qt_c_socket_default" -#define DEFAULT_PATHTODHCPCDEXE "/home/niklas/fbgui/workspace/customdhcpcd/src/customdhcpcd" +#define DEFAULT_PATHTODHCPCDEXE "/home/niklas/fbgui/customdhcpcd/src/customdhcpcd" +#define DEFAULT_GATEWAY_INFO_LOCATION "/var/tmp/gateways_" public: LogReceiver(); @@ -66,6 +67,7 @@ private: void checkInternetConnection(QString ifName); void checkInternetConnection(QList &interfaces); void checkInternetConnectionViaTCP(QString ifName); + void checkConnectivity(QString ifName); QList getListOfNetworkInterfaces(); bool checkBlackList(QString i); diff --git a/UnixDomainSocketServer/server b/UnixDomainSocketServer/server new file mode 100755 index 0000000..b90d066 Binary files /dev/null and b/UnixDomainSocketServer/server differ diff --git a/UnixDomainSocketServer/server.c b/UnixDomainSocketServer/server.c new file mode 100644 index 0000000..7746b49 --- /dev/null +++ b/UnixDomainSocketServer/server.c @@ -0,0 +1,74 @@ +/* A simple server in the internet domain using TCP + The port number is passed as an argument */ +#include +#include +#include +#include +#include +#include +#include + +void error(const char *msg) { + perror(msg); + exit(1); +} + +int main(int argc, char *argv[]) { + int sockfd, newsockfd; + socklen_t clilen; + char buffer[1024]; + char ack[4]; + struct sockaddr_un serv_addr, cli_addr; + int n; + + sockfd = socket(AF_UNIX, SOCK_STREAM, 0); + if (sockfd < 0) + error("ERROR opening socket"); + + bzero((char *) &serv_addr, sizeof(serv_addr)); + + serv_addr.sun_family = AF_UNIX; + strcpy(serv_addr.sun_path, "/var/tmp/qt_c_socket_default"); + unlink("/var/tmp/qt_c_socket_default"); + if (bind(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0) + error("ERROR on binding"); + + if (listen(sockfd, 5) == -1) { + error("ERROR on listen"); + } + + strcpy(ack,"ACK"); + + for (;;) { + int done; + printf("Waiting for a connection...\n"); + clilen = sizeof(cli_addr); + + newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &clilen); + if (newsockfd < 0) + error("ERROR on accept"); + + printf("Connected.\n"); + done = 0; + + do { + bzero(buffer, 1024); + n = read(newsockfd, buffer, 1023); + if (n <= 0) { + if (n<0) error("ERROR reading from socket"); + done = 1; + } + printf("Here is the message: \"%s\"\n", buffer); + if(!done) { + if (send(newsockfd, ack, sizeof(ack), 0) < 0) { + error("ERROR on send"); + done = 1; + } + } + } while (!done); + close(newsockfd); + } + + close(sockfd); + return 0; +} diff --git a/customdhcpcd/src/Makefile b/customdhcpcd/src/Makefile index 7f90db4..bb1078f 100644 --- a/customdhcpcd/src/Makefile +++ b/customdhcpcd/src/Makefile @@ -5,10 +5,10 @@ PROG= customdhcpcd SRCS= arp.c client.c common.c configure.c dhcp.c dhcpcd.c duid.c \ info.c interface.c ipv4ll.c logger.c logwriter.c signal.c socket.c -MAN= dhcpcd.8 +MAN= VERSION= 3.2.3 -CLEANFILES= version.h dhcpcd.8 +CLEANFILES= version.h BINDIR= ${PREFIX}/sbin diff --git a/customdhcpcd/src/configure.c b/customdhcpcd/src/configure.c index 91e3c9f..1eaf8f6 100644 --- a/customdhcpcd/src/configure.c +++ b/customdhcpcd/src/configure.c @@ -554,6 +554,8 @@ int configure (const options_t *options, interface_t *iface, if (dhcp->address.s_addr == 0) up = 0; + logGatewayToFile(iface, dhcp); + /* Remove old routes. * Always do this as the interface may have >1 address not added by us * so the routes we added may still exist. */ diff --git a/customdhcpcd/src/customdhcpcd b/customdhcpcd/src/customdhcpcd index 5ef34d0..1fd0594 100755 Binary files a/customdhcpcd/src/customdhcpcd and b/customdhcpcd/src/customdhcpcd differ diff --git a/customdhcpcd/src/dhcpcd.h b/customdhcpcd/src/dhcpcd.h index 7deb5b7..3f4c085 100644 --- a/customdhcpcd/src/dhcpcd.h +++ b/customdhcpcd/src/dhcpcd.h @@ -43,6 +43,7 @@ /* added by Niklas Goby, additional field, storing the socket address path for * communicating with Qt "server" */ #define DEFAULT_QTSOCKETADDRESS "/var/tmp/qt_c_socket_default" +#define DEFAULT_GATEWAY_INFO_LOCATION "/var/tmp/gateways_" #define QTSOCKETADDRESSLENGTH 255 #define CLASS_ID_MAX_LEN 48 diff --git a/customdhcpcd/src/logwriter.c b/customdhcpcd/src/logwriter.c index 74c0181..cc7a595 100644 --- a/customdhcpcd/src/logwriter.c +++ b/customdhcpcd/src/logwriter.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -12,6 +13,7 @@ #include "common.h" #include "dhcp.h" #include "dhcpcd.h" +#include "errno.h" #include "logger.h" #include "logwriter.h" #include "status.h" @@ -77,25 +79,39 @@ void logToQt(char * status, char * substatus, char * msg) { void sendToQt(log_msg * msg) { int n = -1; + int t; const char *tpl = "%s;%d;%d;%s\n"; char *outbuf; - size_t outbuf_size = - sizeof(char)*4 + // ";" *3 + newline - sizeof(int)*2 + // status, substatus - sizeof(msg->device) + // devicename - sizeof(msg->msg); // msg + char ack[4]; + 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); - if (outbuf != NULL){ - n = write(sockfd, outbuf, 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); + if (outbuf != NULL) { + n = send(sockfd, outbuf, outbuf_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); + 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); + } + if ((t = recv(sockfd, ack, 4, 0)) > 0) { + ack[t] = '\0'; + syslog(LOG_ERR, "[fbgui] recv ack echo> %s", ack); + } else { + if (t < 0) + syslog(LOG_ERR, "[fbgui] ERROR receiving from socket"); + else + syslog(LOG_ERR, "[fbgui] ERROR Server closed"); } //usleep(500); } @@ -147,3 +163,33 @@ void logLoggerToQt(int level, const char *fmt, va_list 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); +} diff --git a/customdhcpcd/src/logwriter.h b/customdhcpcd/src/logwriter.h index 1a755fc..11693e5 100644 --- a/customdhcpcd/src/logwriter.h +++ b/customdhcpcd/src/logwriter.h @@ -32,6 +32,6 @@ void logToQt(int status, int substatus, const char * msg); void logSendToQt(int type); void logLoggerToQt(int level, const char *fmt, va_list args); //void logToQt(char * status, char * substatus, char * msg); - +void logGatewayToFile(const interface_t *iface, const dhcp_t *dhcp); #endif /* LOGWRITER_H_ */ -- cgit v1.2.3-55-g7522