Skip to content

Commit 4c4d501

Browse files
committed
gltrace: Use Unix Domain Socket rather than INET Socket
Export trace information via abstract Unix Domain Socket (UDS). This allows tracing of applications without INTERNET permission, and should be faster as well. Change-Id: Iabb67fcc2bc2484afd8128af07dca723b81c52c6
1 parent cf0c7d1 commit 4c4d501

File tree

3 files changed

+21
-19
lines changed

3 files changed

+21
-19
lines changed

opengl/libs/GLES_trace/src/gltrace_eglapi.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,10 @@ static void *commandReceiveTask(void *arg) {
7777
}
7878

7979
void GLTrace_start() {
80-
char value[PROPERTY_VALUE_MAX];
80+
char udsName[PROPERTY_VALUE_MAX];
8181

82-
property_get("debug.egl.debug_port", value, "5039");
83-
const unsigned short port = (unsigned short)atoi(value);
84-
85-
int clientSocket = gltrace::acceptClientConnection(port);
82+
property_get("debug.egl.debug_portname", udsName, "gltrace");
83+
int clientSocket = gltrace::acceptClientConnection(udsName);
8684
if (clientSocket < 0) {
8785
ALOGE("Error creating GLTrace server socket. Quitting application.");
8886
exit(-1);

opengl/libs/GLES_trace/src/gltrace_transport.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,10 @@
1717
#include <stdlib.h>
1818
#include <unistd.h>
1919

20+
#include <unistd.h>
2021
#include <sys/socket.h>
22+
#include <sys/un.h>
2123
#include <netinet/in.h>
22-
#include <arpa/inet.h>
2324

2425
#include <cutils/log.h>
2526

@@ -28,22 +29,24 @@
2829
namespace android {
2930
namespace gltrace {
3031

31-
int acceptClientConnection(int serverPort) {
32-
int serverSocket = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
32+
int acceptClientConnection(char *sockname) {
33+
int serverSocket = socket(AF_LOCAL, SOCK_STREAM, 0);
3334
if (serverSocket < 0) {
3435
ALOGE("Error (%d) while creating socket. Check if app has network permissions.",
3536
serverSocket);
3637
return -1;
3738
}
3839

39-
struct sockaddr_in server, client;
40+
struct sockaddr_un server, client;
4041

41-
server.sin_family = AF_INET;
42-
server.sin_addr.s_addr = htonl(INADDR_ANY);
43-
server.sin_port = htons(serverPort);
42+
memset(&server, 0, sizeof server);
43+
server.sun_family = AF_UNIX;
44+
// the first byte of sun_path should be '\0' for abstract namespace
45+
strcpy(server.sun_path + 1, sockname);
4446

45-
socklen_t sockaddr_len = sizeof(sockaddr_in);
46-
if (bind(serverSocket, (struct sockaddr *) &server, sizeof(server)) < 0) {
47+
// note that sockaddr_len should be set to the exact size of the buffer that is used.
48+
socklen_t sockaddr_len = sizeof(server.sun_family) + strlen(sockname) + 1;
49+
if (bind(serverSocket, (struct sockaddr *) &server, sockaddr_len) < 0) {
4750
close(serverSocket);
4851
ALOGE("Failed to bind the server socket");
4952
return -1;
@@ -55,7 +58,7 @@ int acceptClientConnection(int serverPort) {
5558
return -1;
5659
}
5760

58-
ALOGD("gltrace::waitForClientConnection: server listening @ port %d", serverPort);
61+
ALOGD("gltrace::waitForClientConnection: server listening @ path %s", sockname);
5962

6063
int clientSocket = accept(serverSocket, (struct sockaddr *)&client, &sockaddr_len);
6164
if (clientSocket < 0) {
@@ -64,7 +67,7 @@ int acceptClientConnection(int serverPort) {
6467
return -1;
6568
}
6669

67-
ALOGD("gltrace::waitForClientConnection: client connected: %s", inet_ntoa(client.sin_addr));
70+
ALOGD("gltrace::waitForClientConnection: client connected.");
6871

6972
// do not accept any more incoming connections
7073
close(serverSocket);

opengl/libs/GLES_trace/src/gltrace_transport.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,10 +76,11 @@ class BufferedOutputStream {
7676
};
7777

7878
/**
79-
* Utility method: start a server at @serverPort, and wait for a client
80-
* connection. Returns the connected client socket on success, or -1 on failure.
79+
* Utility method: start a server listening at @sockName (unix domain socket,
80+
* abstract namespace path), and wait for a client connection.
81+
* Returns the connected client socket on success, or -1 on failure.
8182
*/
82-
int acceptClientConnection(int serverPort);
83+
int acceptClientConnection(char *sockName);
8384

8485
};
8586
};

0 commit comments

Comments
 (0)