Let SocketClient users write binary data to clients.

This is a dependency for the DNS proxy CLs.

This CL also adds a new socket for the netd process to inherit which
is owned by the inet group.  (so only apps with the INTERNET
permission can use the DNS proxy...)

Change-Id: Ic3475c697913ba85805b4e49801b65e7a1d59289
This commit is contained in:
Brad Fitzpatrick 2010-10-27 10:23:16 -07:00
parent 7ffa661595
commit 8c5669f9f9
3 changed files with 18 additions and 5 deletions

View File

@ -28,8 +28,12 @@ public:
uid_t getUid() const { return mUid; }
gid_t getGid() const { return mGid; }
// Send null-terminated C strings:
int sendMsg(int code, const char *msg, bool addErrno);
int sendMsg(const char *msg);
// Sending binary data:
int sendData(const void *data, int len);
};
typedef android::List<SocketClient *> SocketClientCollection;

View File

@ -50,14 +50,22 @@ int SocketClient::sendMsg(const char *msg) {
}
// Send the message including null character
if (sendData(msg, strlen(msg) + 1) != 0) {
SLOGW("Unable to send msg '%s'", msg);
return -1;
}
return 0;
}
int SocketClient::sendData(const void* data, int len) {
int rc = 0;
const char *p = msg;
int brtw = strlen(msg) + 1;
const char *p = (const char*) data;
int brtw = len;
pthread_mutex_lock(&mWriteMutex);
while(brtw) {
if ((rc = write(mSocket,p, brtw)) < 0) {
SLOGW("Unable to send msg '%s' (%s)", msg, strerror(errno));
while (brtw > 0) {
if ((rc = write(mSocket, p, brtw)) < 0) {
SLOGW("write error (%s)", strerror(errno));
pthread_mutex_unlock(&mWriteMutex);
return -1;
} else if (!rc) {

View File

@ -309,6 +309,7 @@ service vold /system/bin/vold
service netd /system/bin/netd
socket netd stream 0660 root system
socket dnsproxyd stream 0660 root inet
service debuggerd /system/bin/debuggerd