diff options
author | San Mehat <san@google.com> | 2009-06-23 21:10:57 -0700 |
---|---|---|
committer | San Mehat <san@google.com> | 2009-07-10 14:23:51 -0700 |
commit | c4a895b7094461c98101924cf096680bfb7856f1 (patch) | |
tree | 002d78d20dc1d3ddd548f10c5d39807f6d5b7fb7 /libsysutils | |
parent | a0c0d8a89e1cd775d0ecf5a3df744d8ac0ccfc2f (diff) | |
download | system_core-c4a895b7094461c98101924cf096680bfb7856f1.zip system_core-c4a895b7094461c98101924cf096680bfb7856f1.tar.gz system_core-c4a895b7094461c98101924cf096680bfb7856f1.tar.bz2 |
nexus: Rollup update for nexus
nexus: Change field separator from : to ' '
Signed-off-by: San Mehat <san@google.com>
nexus: Add some prototypes for stuff to come
Signed-off-by: San Mehat <san@google.com>
nexus: Add some TODOs
Signed-off-by: San Mehat <san@google.com>
libsysutils: Put a proper token parser into the FrameworkListener which
supports minimal \ escapes and quotes
Signed-off-by: San Mehat <san@google.com>
nexus: Fix a lot of bugs
Signed-off-by: San Mehat <san@google.com>
libsysutils: Remove some debugging
Signed-off-by: San Mehat <san@google.com>
nexus: Send broadcasts for supplicant state changes
Signed-off-by: San Mehat <san@google.com>
nexus: Plumb DHCP listener state changes to NetworkManager
Signed-off-by: San Mehat <san@google.com>
nexus: Make the SupplicantState strings more parsable
Signed-off-by: San Mehat <san@google.com>
nexus: Broadcast a message when dhcp state changes.
Signed-off-by: San Mehat <san@google.com>
nexus: Add a few new response codes
Signed-off-by: San Mehat <san@google.com>
nexus: Rename ErrorCode -> ResponseCode
Signed-off-by: San Mehat <san@google.com>
nexus: Add DHCP event broadcasting. Also adds the framework for
tracking supplicant 'searching-for-AP' state
Signed-off-by: San Mehat <san@google.com>
nexus: REmove WifiScanner
Signed-off-by: San Mehat <san@google.com>
nexus: Change the way scanning works. scanmode can now be selected
independantly of triggering a scan. Also adds rxfilter support
Signed-off-by: San Mehat <san@google.com>
nexus: Add support for configuring bluetooth coexistence scanning and modes
Signed-off-by: San Mehat <san@google.com>
nexus: use case insensitive match for property names
Signed-off-by: San Mehat <san@google.com>
nexus: Rollup of a bunch of stuff:
- 'list' command now takes an argument to match against
- InterfaceConfig has been moved into the Controller base (for now)
- DhcpClient now has some rudimentry locking
- process 'ADDRINFO' messages from dhcpcd
- Drop tertiary dns
Signed-off-by: San Mehat <san@google.com>
nexus: Clean up some of the supplicant variable parsing and add 'wifi.current'
Signed-off-by: San Mehat <san@google.com>
nexus: Add driver-stop/start, initial suspend support
Signed-off-by: San Mehat <san@google.com>
nexus: Add Controller suspend/resume callbacks, as well as locking
Signed-off-by: San Mehat <san@google.com>
nexus: Make ARP probing configurable for DhcpClient
Signed-off-by: San Mehat <san@google.com>
nexus: Add linkspeed / rssi retrieval
Signed-off-by: San Mehat <san@google.com>
nexus: Add WifiStatusPoller to track RSSI/linkspeed when associated
Signed-off-by: San Mehat <san@google.com>
nexus: Disable some debugging and add 'wifi.netcount' property
Signed-off-by: San Mehat <san@google.com>
nexus: Replace the hackish property system with something more flexible with namespaces
Signed-off-by: San Mehat <san@google.com>
libsysutils: Fix a few bugs in SocketListener
Signed-off-by: San Mehat <san@google.com>
nexus: PropertyManager: Add array support
Signed-off-by: San Mehat <san@google.com>
nexus: Clean up properties
Signed-off-by: San Mehat <san@google.com>
nexus: WifiController: Change name of 'CurrentNetwork' property
Signed-off-by: San Mehat <san@google.com>
Diffstat (limited to 'libsysutils')
-rw-r--r-- | libsysutils/src/FrameworkListener.cpp | 81 | ||||
-rw-r--r-- | libsysutils/src/SocketListener.cpp | 38 |
2 files changed, 103 insertions, 16 deletions
diff --git a/libsysutils/src/FrameworkListener.cpp b/libsysutils/src/FrameworkListener.cpp index e9ca897..4c74765 100644 --- a/libsysutils/src/FrameworkListener.cpp +++ b/libsysutils/src/FrameworkListener.cpp @@ -56,24 +56,73 @@ void FrameworkListener::registerCmd(FrameworkCommand *cmd) { } void FrameworkListener::dispatchCommand(SocketClient *cli, char *data) { - int argc; + FrameworkCommandCollection::iterator i; + int argc = 0; char *argv[FrameworkListener::CMD_ARGS_MAX]; + char tmp[255]; + char *p = data; + char *q = tmp; + bool esc = false; + bool quote = false; + int k; + + memset(argv, 0, sizeof(argv)); + memset(tmp, 0, sizeof(tmp)); + while(*p) { + if (*p == '\\') { + if (esc) { + *q++ = '\\'; + esc = false; + } else + esc = true; + p++; + continue; + } else if (esc) { + if (*p == '"') + *q++ = '"'; + else if (*p == '\\') + *q++ = '\\'; + else { + cli->sendMsg(500, "Unsupported escape sequence", false); + goto out; + } + p++; + esc = false; + continue; + } + + if (*p == '"') { + if (quote) + quote = false; + else + quote = true; + p++; + continue; + } - if (!index(data, '"')) { - char *next = data; - char *field; - int i; - - for (i = 0; (i < FrameworkListener::CMD_ARGS_MAX) && - (argv[i] = strsep(&next, " ")); i++); - argc = i+1; - } else { - LOGD("blehhh not supported"); - return; + *q = *p++; + if (!quote && *q == ' ') { + *q = '\0'; + argv[argc++] = strdup(tmp); + memset(tmp, 0, sizeof(tmp)); + q = tmp; + continue; + } + q++; } - FrameworkCommandCollection::iterator i; + argv[argc++] = strdup(tmp); +#if 0 + for (k = 0; k < argc; k++) { + LOGD("arg[%d] = '%s'", k, argv[k]); + } +#endif + if (quote) { + cli->sendMsg(500, "Unclosed quotes error", false); + goto out; + } + for (i = mCommands->begin(); i != mCommands->end(); ++i) { FrameworkCommand *c = *i; @@ -81,10 +130,14 @@ void FrameworkListener::dispatchCommand(SocketClient *cli, char *data) { if (c->runCommand(cli, argc, argv)) { LOGW("Handler '%s' error (%s)", c->getCommand(), strerror(errno)); } - return; + goto out; } } cli->sendMsg(500, "Command not recognized", false); +out: + int j; + for (j = 0; j < argc; j++) + free(argv[j]); return; } diff --git a/libsysutils/src/SocketListener.cpp b/libsysutils/src/SocketListener.cpp index 1a937c2..72e128d 100644 --- a/libsysutils/src/SocketListener.cpp +++ b/libsysutils/src/SocketListener.cpp @@ -45,9 +45,26 @@ SocketListener::SocketListener(int socketFd, bool listen) { mClients = new SocketClientCollection(); } +SocketListener::~SocketListener() { + if (mSocketName && mSock > -1) + close(mSock); + + if (mCtrlPipe[0] != -1) { + close(mCtrlPipe[0]); + close(mCtrlPipe[1]); + } + SocketClientCollection::iterator it; + for (it = mClients->begin(); it != mClients->end(); ++it) { + delete (*it); + it = mClients->erase(it); + } + delete mClients; +} + int SocketListener::startListener() { if (!mSocketName && mSock == -1) { + LOGE("Failed to start unbound listener"); errno = EINVAL; return -1; } else if (mSocketName) { @@ -64,11 +81,15 @@ int SocketListener::startListener() { } else if (!mListen) mClients->push_back(new SocketClient(mSock)); - if (pipe(mCtrlPipe)) + if (pipe(mCtrlPipe)) { + LOGE("pipe failed (%s)", strerror(errno)); return -1; + } - if (pthread_create(&mThread, NULL, SocketListener::threadStart, this)) + if (pthread_create(&mThread, NULL, SocketListener::threadStart, this)) { + LOGE("pthread_create (%s)", strerror(errno)); return -1; + } return 0; } @@ -88,6 +109,19 @@ int SocketListener::stopListener() { } close(mCtrlPipe[0]); close(mCtrlPipe[1]); + mCtrlPipe[0] = -1; + mCtrlPipe[1] = -1; + + if (mSocketName && mSock > -1) { + close(mSock); + mSock = -1; + } + + SocketClientCollection::iterator it; + for (it = mClients->begin(); it != mClients->end(); ++it) { + delete (*it); + it = mClients->erase(it); + } return 0; } |