diff options
author | Robert Greenwalt <rgreenwalt@google.com> | 2012-04-20 15:21:07 -0700 |
---|---|---|
committer | Robert Greenwalt <rgreenwalt@google.com> | 2012-04-20 17:41:42 -0700 |
commit | 594947793c98e8e7f58f0e9b2cb962c9ef23adeb (patch) | |
tree | 01be6143d60f80dec1048e5cea81c819e0d96ff2 | |
parent | 545ab46063f083239b29e59b8b491656d93f2a38 (diff) | |
download | system_core-594947793c98e8e7f58f0e9b2cb962c9ef23adeb.zip system_core-594947793c98e8e7f58f0e9b2cb962c9ef23adeb.tar.gz system_core-594947793c98e8e7f58f0e9b2cb962c9ef23adeb.tar.bz2 |
Add ability to quote responses as needed.
It's up to the protocol to know when quotes are required. In the future
the response should probably all be binary blobs with lengths.
bug:6353048
Change-Id: I3f9b48ab0f4e6746d75cdc9c0c84d33f38f63661
-rw-r--r-- | include/sysutils/SocketClient.h | 3 | ||||
-rw-r--r-- | libsysutils/src/SocketClient.cpp | 23 |
2 files changed, 26 insertions, 0 deletions
diff --git a/include/sysutils/SocketClient.h b/include/sysutils/SocketClient.h index 4d7c4fa..85b58ef 100644 --- a/include/sysutils/SocketClient.h +++ b/include/sysutils/SocketClient.h @@ -64,6 +64,9 @@ public: void incRef(); bool decRef(); // returns true at 0 (but note: SocketClient already deleted) + // return a new string in quotes with '\\' and '\"' escaped for "my arg" transmissions + static char *quoteArg(const char *arg); + private: // Send null-terminated C strings int sendMsg(const char *msg); diff --git a/libsysutils/src/SocketClient.cpp b/libsysutils/src/SocketClient.cpp index 1533120..4a1227f 100644 --- a/libsysutils/src/SocketClient.cpp +++ b/libsysutils/src/SocketClient.cpp @@ -107,6 +107,29 @@ int SocketClient::sendCode(int code) { return sendData(buf, sizeof(buf)); } +char *SocketClient::quoteArg(const char *arg) { + int len = strlen(arg); + char *result = (char *)malloc(len * 2 + 3); + char *current = result; + const char *end = arg + len; + + *(current++) = '"'; + while (arg < end) { + switch (*arg) { + case '\\': + case '"': + *(current++) = '\\'; // fallthrough + default: + *(current++) = *(arg++); + } + } + *(current++) = '"'; + *(current++) = '\0'; + result = (char *)realloc(result, current-result); + return result; +} + + int SocketClient::sendMsg(const char *msg) { if (mSocket < 0) { errno = EHOSTUNREACH; |