summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThe Android Open Source Project <initial-contribution@android.com>2010-07-20 10:11:20 -0700
committerThe Android Open Source Project <initial-contribution@android.com>2010-07-20 10:11:20 -0700
commit02565fec8240bbff105f285e9e25aade52c15450 (patch)
treed2063af442ad61240b09dac49fe570321742c202
parent7fdcc435b67ddc82e4bfb68067b8bb96f34ebf77 (diff)
parentfdb13f793742bd981f45333f056e4baa5281e4b5 (diff)
downloadsystem_core-02565fec8240bbff105f285e9e25aade52c15450.tar.gz
system_core-02565fec8240bbff105f285e9e25aade52c15450.tar.bz2
system_core-02565fec8240bbff105f285e9e25aade52c15450.zip
merge from open-source master
Change-Id: Ice679e12b8393621b21a8dafe640dd880a09d35e
-rw-r--r--adb/jdwp_service.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/adb/jdwp_service.c b/adb/jdwp_service.c
index 0c26f7b66..296f718f6 100644
--- a/adb/jdwp_service.c
+++ b/adb/jdwp_service.c
@@ -5,6 +5,7 @@
#include <errno.h>
#include <stdio.h>
#include <string.h>
+#include <unistd.h>
/* here's how these things work.
@@ -320,6 +321,7 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
struct iovec iov;
char dummy = '!';
char buffer[sizeof(struct cmsghdr) + sizeof(int)];
+ int flags;
iov.iov_base = &dummy;
iov.iov_len = 1;
@@ -337,10 +339,27 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
cmsg->cmsg_type = SCM_RIGHTS;
((int*)CMSG_DATA(cmsg))[0] = fd;
+ flags = fcntl(proc->socket,F_GETFL,0);
+
+ if (flags == -1) {
+ D("failed to get cntl flags for socket %d: %s\n",
+ proc->pid, strerror(errno));
+ goto CloseProcess;
+
+ }
+
+ if (fcntl(proc->socket, F_SETFL, flags & ~O_NONBLOCK) == -1) {
+ D("failed to remove O_NONBLOCK flag for socket %d: %s\n",
+ proc->pid, strerror(errno));
+ goto CloseProcess;
+ }
+
for (;;) {
ret = sendmsg(proc->socket, &msg, 0);
- if (ret >= 0)
+ if (ret >= 0) {
+ adb_close(fd);
break;
+ }
if (errno == EINTR)
continue;
D("sending new file descriptor to JDWP %d failed: %s\n",
@@ -354,6 +373,12 @@ jdwp_process_event( int socket, unsigned events, void* _proc )
for (n = 1; n < proc->out_count; n++)
proc->out_fds[n-1] = proc->out_fds[n];
+ if (fcntl(proc->socket, F_SETFL, flags) == -1) {
+ D("failed to set O_NONBLOCK flag for socket %d: %s\n",
+ proc->pid, strerror(errno));
+ goto CloseProcess;
+ }
+
if (--proc->out_count == 0)
fdevent_del( proc->fde, FDE_WRITE );
}