nexus: Move to a line based protocol (similar to FTP) + fix bugs

Signed-off-by: San Mehat <san@google.com>
This commit is contained in:
San Mehat 2009-05-10 09:27:07 -07:00
parent d768066ef5
commit 69772dc644
9 changed files with 191 additions and 93 deletions

View file

@ -47,11 +47,11 @@ CommandListener::WifiEnableCmd::WifiEnableCmd() :
int CommandListener::WifiEnableCmd::runCommand(SocketClient *cli, char *data) {
Controller *c = NetworkManager::Instance()->findController("WIFI");
char buffer[32];
sprintf(buffer, "WIFI_ENABLE:%d", (c->enable() ? errno : 0));
cli->sendMsg(buffer);
if (c->enable())
cli->sendMsg(400, "Failed to enable wifi", true);
else
cli->sendMsg(200, "Wifi Enabled", false);
return 0;
}
@ -61,10 +61,11 @@ CommandListener::WifiDisableCmd::WifiDisableCmd() :
int CommandListener::WifiDisableCmd::runCommand(SocketClient *cli, char *data) {
Controller *c = NetworkManager::Instance()->findController("WIFI");
char buffer[32];
sprintf(buffer, "WIFI_DISABLE:%d", (c->disable() ? errno : 0));
cli->sendMsg(buffer);
if (c->disable())
cli->sendMsg(400, "Failed to disable wifi", true);
else
cli->sendMsg(200, "Wifi Disabled", false);
return 0;
}
@ -77,7 +78,6 @@ int CommandListener::WifiScanCmd::runCommand(SocketClient *cli, char *data) {
WifiController *wc = (WifiController *) NetworkManager::Instance()->findController("WIFI");
char buffer[32];
int mode = 0;
char *bword, *last;
@ -93,8 +93,11 @@ int CommandListener::WifiScanCmd::runCommand(SocketClient *cli, char *data) {
mode = atoi(bword);
sprintf(buffer, "WIFI_SCAN:%d", (wc->setScanMode(mode) ? errno : 0));
cli->sendMsg(buffer);
if (wc->setScanMode(mode))
cli->sendMsg(400, "Failed to set scan mode", true);
else
cli->sendMsg(200, "Scan mode set", false);
return 0;
}
@ -112,16 +115,16 @@ int CommandListener::WifiScanResultsCmd::runCommand(SocketClient *cli, char *dat
char buffer[256];
for(it = src->begin(); it != src->end(); ++it) {
sprintf(buffer, "WIFI_SCAN_RESULT:%s:%u:%d:%s:%s",
sprintf(buffer, "%s:%u:%d:%s:%s",
(*it)->getBssid(), (*it)->getFreq(), (*it)->getLevel(),
(*it)->getFlags(), (*it)->getSsid());
cli->sendMsg(buffer);
cli->sendMsg(125, buffer, false);
delete (*it);
it = src->erase(it);
}
delete src;
cli->sendMsg("WIFI_SCAN_RESULT:0");
cli->sendMsg(200, "Scan results complete", false);
return 0;
}
@ -134,10 +137,11 @@ CommandListener::VpnEnableCmd::VpnEnableCmd() :
int CommandListener::VpnEnableCmd::runCommand(SocketClient *cli, char *data) {
Controller *c = NetworkManager::Instance()->findController("VPN");
char buffer[32];
sprintf(buffer, "VPN_ENABLE:%d", (c->enable() ? errno : 0));
cli->sendMsg(buffer);
if (c->enable())
cli->sendMsg(400, "Failed to enable VPN", true);
else
cli->sendMsg(200, "VPN enabled", false);
return 0;
}
@ -147,9 +151,10 @@ CommandListener::VpnDisableCmd::VpnDisableCmd() :
int CommandListener::VpnDisableCmd::runCommand(SocketClient *cli, char *data) {
Controller *c = NetworkManager::Instance()->findController("VPN");
char buffer[32];
sprintf(buffer, "VPN_DISABLE:%d", (c->disable() ? errno : 0));
cli->sendMsg(buffer);
if (c->disable())
cli->sendMsg(400, "Failed to disable VPN", true);
else
cli->sendMsg(200, "VPN disabled", false);
return 0;
}

View file

@ -14,6 +14,7 @@
* limitations under the License.
*/
#include <stdlib.h>
#include <ctype.h>
#define LOG_TAG "ScanResult"
#include <cutils/log.h>
@ -24,30 +25,53 @@ ScanResult::ScanResult() {
}
ScanResult::ScanResult(char *rawResult) {
char *tok, *next = NULL;
char *p = rawResult, *q = rawResult;
char tmp[255];
if (!(tok = strtok_r(rawResult, "\t", &next)))
goto out_bad;
mBssid = strdup(tok);
// BSSID
for (q = p; *q != '\t'; ++q);
strncpy(tmp, p, (q - p));
tmp[q-p] = '\0';
mBssid = strdup(tmp);
++q;
if (!(tok = strtok_r(NULL, "\t", &next)))
goto out_bad;
mFreq = atoi(tok);
// FREQ
for (p = q; *q != '\t'; ++q);
strncpy(tmp, p, (q - p));
tmp[q-p] = '\0';
mFreq = atoi(tmp);
++q;
if (!(tok = strtok_r(NULL, "\t", &next)))
goto out_bad;
mLevel = atoi(tok);
// LEVEL
for (p = q; *q != '\t'; ++q);
strncpy(tmp, p, (q - p));
tmp[q-p] = '\0';
mLevel = atoi(tmp);
++q;
if (!(tok = strtok_r(rawResult, "\t", &next)))
goto out_bad;
mFlags = strdup(tok);
// FLAGS
for (p = q; *q != '\t'; ++q);
strncpy(tmp, p, (q - p));
tmp[q-p] = '\0';
mFlags = strdup(tmp);
++q;
if (!(tok = strtok_r(rawResult, "\t", &next)))
goto out_bad;
mSsid = strdup(tok);
// XXX: For some reason Supplicant sometimes sends a double-tab here.
// haven't had time to dig into it ...
if (*q == '\t')
q++;
for (p = q; *q != '\t'; ++q) {
if (*q == '\0')
break;
}
strncpy(tmp, p, (q - p));
tmp[q-p] = '\0';
mSsid = strdup(tmp);
++q;
return;
out_bad:
LOGW("Malformatted scan result (%s)", rawResult);
}

View file

@ -15,12 +15,16 @@
*/
#include <stdlib.h>
#include <sys/types.h>
#include <fcntl.h>
#include <errno.h>
#define LOG_TAG "Supplicant"
#include <cutils/log.h>
#include <cutils/properties.h>
#include "private/android_filesystem_config.h"
#undef HAVE_LIBC_SYSTEM_PROPERTIES
#ifdef HAVE_LIBC_SYSTEM_PROPERTIES
@ -41,6 +45,9 @@
#define DRIVER_PROP_NAME "wlan.driver.status"
#define SUPPLICANT_NAME "wpa_supplicant"
#define SUPP_PROP_NAME "init.svc.wpa_supplicant"
#define SUPP_CONFIG_TEMPLATE "/system/etc/wifi/wpa_supplicant.conf"
#define SUPP_CONFIG_FILE "/data/misc/wifi/wpa_supplicant.conf"
Supplicant::Supplicant() {
mCtrl = NULL;
@ -55,7 +62,10 @@ Supplicant::Supplicant() {
}
int Supplicant::start() {
// XXX: Validate supplicant config file
if (setupConfig()) {
LOGW("Unable to setup supplicant.conf");
}
char status[PROPERTY_VALUE_MAX] = {'\0'};
int count = 200;
@ -66,7 +76,6 @@ int Supplicant::start() {
if (property_get(SUPP_PROP_NAME, status, NULL) &&
!strcmp(status, "running")) {
LOGD("Supplicant already started");
} else {
#ifdef HAVE_LIBC_SYSTEM_PROPERTIES
pi = __system_property_find(SUPP_PROP_NAME);
@ -93,7 +102,7 @@ int Supplicant::start() {
}
#else
if (property_get(SUPP_PROP_NAME, status, NULL)) {
if (strcmp(status, "running") == 0)
if (!strcmp(status, "running"))
break;
}
#endif
@ -348,9 +357,9 @@ int Supplicant::onScanResultsEvent(SupplicantEvent *evt) {
while((linep = strtok_r(NULL, "\n", &linep_next)))
mLatestScanResults->push_back(new ScanResult(linep));
char tmp[32];
sprintf(tmp, "WIFI_SCAN_RESULTS_READY:%d", mLatestScanResults->size());
NetworkManager::Instance()->getBroadcaster()->sendBroadcast(tmp);
char tmp[128];
sprintf(tmp, "%d scan results ready", mLatestScanResults->size());
NetworkManager::Instance()->getBroadcaster()->sendBroadcast(600, tmp, false);
pthread_mutex_unlock(&mLatestScanResultsLock);
free(reply);
} else {
@ -403,4 +412,52 @@ ScanResultCollection *Supplicant::createLatestScanResults() {
pthread_mutex_unlock(&mLatestScanResultsLock);
return d;
};
}
int Supplicant::setupConfig() {
char buf[2048];
int srcfd, destfd;
int nread;
if (access(SUPP_CONFIG_FILE, R_OK|W_OK) == 0) {
return 0;
} else if (errno != ENOENT) {
LOGE("Cannot access \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
return -1;
}
srcfd = open(SUPP_CONFIG_TEMPLATE, O_RDONLY);
if (srcfd < 0) {
LOGE("Cannot open \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno));
return -1;
}
destfd = open(SUPP_CONFIG_FILE, O_CREAT|O_WRONLY, 0660);
if (destfd < 0) {
close(srcfd);
LOGE("Cannot create \"%s\": %s", SUPP_CONFIG_FILE, strerror(errno));
return -1;
}
while ((nread = read(srcfd, buf, sizeof(buf))) != 0) {
if (nread < 0) {
LOGE("Error reading \"%s\": %s", SUPP_CONFIG_TEMPLATE, strerror(errno));
close(srcfd);
close(destfd);
unlink(SUPP_CONFIG_FILE);
return -1;
}
write(destfd, buf, nread);
}
close(destfd);
close(srcfd);
if (chown(SUPP_CONFIG_FILE, AID_SYSTEM, AID_WIFI) < 0) {
LOGE("Error changing group ownership of %s to %d: %s",
SUPP_CONFIG_FILE, AID_WIFI, strerror(errno));
unlink(SUPP_CONFIG_FILE);
return -1;
}
return 0;
}

View file

@ -67,6 +67,7 @@ public:
private:
int connectToSupplicant();
int sendCommand(const char *cmd, char *reply, size_t *reply_len);
int setupConfig();
};
#endif

View file

@ -67,15 +67,6 @@ int TiwlanWifiController::loadFirmware() {
}
bool TiwlanWifiController::isFirmwareLoaded() {
char driver_status[PROPERTY_VALUE_MAX];
if (property_get(DRIVER_PROP_NAME, driver_status, NULL)) {
if (!strcmp(driver_status, "ok"))
return true;
else {
LOGD("Driver status '%s'", driver_status);
return false;
}
}
LOGW("Unable to get property '%s'", DRIVER_PROP_NAME);
// Always load the firmware
return false;
}

View file

@ -93,11 +93,8 @@ out_powerdown:
return -1;
}
void WifiController::sendStatusBroadcast(const char *msg) {
char tmp[255];
sprintf(tmp, "WIFI_STATUS:%s", msg);
NetworkManager::Instance()->getBroadcaster()->sendBroadcast(tmp);
void WifiController::sendStatusBroadcast(char *msg) {
NetworkManager::Instance()->getBroadcaster()->sendBroadcast(600, msg, false);
}
int WifiController::disable() {

View file

@ -77,7 +77,7 @@ protected:
virtual bool isFirmwareLoaded() = 0;
virtual bool isPoweredUp() = 0;
void sendStatusBroadcast(const char *msg);
void sendStatusBroadcast(char *msg);
};
#endif

View file

@ -54,6 +54,8 @@ int main() {
exit (1);
}
// XXX: we'll use the main thread for the NetworkManager eventuall
while(1) {
sleep(1000);
}

View file

@ -31,10 +31,6 @@
#include <private/android_filesystem_config.h>
static void signal_handler(int sig) {
fprintf(stdout, "{ interrupt! }\n");
}
int main(int argc, char **argv) {
int sock;
@ -47,56 +43,81 @@ int main(int argc, char **argv) {
printf("Connected to nexus\n");
char line[255];
char *buffer = malloc(4096);
int cursor = 0;
int col = 0;
while(1) {
fd_set read_fds;
struct timeval to;
int rc = 0;
signal(SIGINT, SIG_DFL);
printf("-> ");
fflush(stdout);
char buffer[255];
if (!fgets(buffer, sizeof(buffer) -1, stdin)) {
printf("Exiting...\n");
exit(0);
}
buffer[strlen(buffer) -1] = 0;
if (write(sock, buffer, strlen(buffer) +1) < 0) {
fprintf(stderr, "Error writing data (%s)\n", strerror(errno));
exit(2);
}
wait:
to.tv_sec = 10;
to.tv_usec = 0;
FD_ZERO(&read_fds);
FD_SET(sock, &read_fds);
FD_SET(0, &read_fds);
if (col == 0) {
fprintf(stdout, "-> ");
fflush(stdout);
col = 3;
}
signal(SIGINT, signal_handler);
if ((rc = select(sock +1, &read_fds, NULL, NULL, &to)) < 0) {
if (errno == EINTR)
continue;
fprintf(stderr, "Error in select (%s)\n", strerror(errno));
exit(2);
} else if (!rc) {
printf("{response timeout}\n");
continue;
} else if (FD_ISSET(sock, &read_fds)) {
if ((rc = read(sock, buffer, sizeof(buffer)-1)) <= 0) {
memset(buffer, 0, 4096);
if ((rc = read(sock, buffer, 4096)) <= 0) {
fprintf(stderr, "Error reading response (%s)\n", strerror(errno));
exit(2);
}
printf(" %s\n", buffer);
goto wait;
}
int i;
for (i = 0; i < col; i++) {
fprintf(stdout, "%c", 8);
}
printf("%s", buffer);
printf("-> ");
for (i = 0; i < cursor; i++) {
fprintf(stdout, "%c", line[i]);
}
fflush(stdout);
} else if (FD_ISSET(0, &read_fds)) {
char c;
if ((rc = read(0, &c, 1)) < 0) {
fprintf(stderr, "Error reading from terminal (%s)\n", strerror(errno));
exit(2);
} else if (!rc) {
fprintf(stderr, "0 length read from terminal\n");
exit(2);
}
fprintf(stdout, "%c", c);
fflush(stdout);
line[cursor] = c;
if (c == '\n') {
if ((rc = write(sock, line, strlen(line))) < 0) {
fprintf(stderr, "Error writing to nexus (%s)\n", strerror(errno));
exit(2);
}
memset(line, 0, sizeof(line));
cursor = 0;
col = 0;
} else {
cursor++;
col++;
}
}
}
exit(0);
}