Merge "SocketClient: don't ignore SIGPIPE"
This commit is contained in:
commit
037292424e
2 changed files with 18 additions and 35 deletions
|
|
@ -201,50 +201,31 @@ int SocketClient::sendDataLockedv(struct iovec *iov, int iovcnt) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int ret = 0;
|
|
||||||
int e = 0; // SLOGW and sigaction are not inert regarding errno
|
|
||||||
int current = 0;
|
int current = 0;
|
||||||
|
|
||||||
struct sigaction new_action, old_action;
|
|
||||||
memset(&new_action, 0, sizeof(new_action));
|
|
||||||
new_action.sa_handler = SIG_IGN;
|
|
||||||
sigaction(SIGPIPE, &new_action, &old_action);
|
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
ssize_t rc = TEMP_FAILURE_RETRY(
|
ssize_t rc = TEMP_FAILURE_RETRY(writev(mSocket, iov + current, iovcnt - current));
|
||||||
writev(mSocket, iov + current, iovcnt - current));
|
|
||||||
|
|
||||||
if (rc > 0) {
|
|
||||||
size_t written = rc;
|
|
||||||
while ((current < iovcnt) && (written >= iov[current].iov_len)) {
|
|
||||||
written -= iov[current].iov_len;
|
|
||||||
current++;
|
|
||||||
}
|
|
||||||
if (current == iovcnt) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
iov[current].iov_base = (char *)iov[current].iov_base + written;
|
|
||||||
iov[current].iov_len -= written;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
e = EIO;
|
errno = EIO;
|
||||||
SLOGW("0 length write :(");
|
SLOGW("0 length write :(");
|
||||||
} else {
|
return -1;
|
||||||
e = errno;
|
} else if (rc < 0) {
|
||||||
SLOGW("write error (%s)", strerror(e));
|
SLOGW("write error (%s)", strerror(errno));
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
ret = -1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
sigaction(SIGPIPE, &old_action, &new_action);
|
size_t written = rc;
|
||||||
|
while (current < iovcnt && written >= iov[current].iov_len) {
|
||||||
if (e != 0) {
|
written -= iov[current].iov_len;
|
||||||
errno = e;
|
current++;
|
||||||
|
}
|
||||||
|
if (current == iovcnt) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
iov[current].iov_base = (char*)iov[current].iov_base + written;
|
||||||
|
iov[current].iov_len -= written;
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SocketClient::incRef() {
|
void SocketClient::incRef() {
|
||||||
|
|
|
||||||
|
|
@ -218,6 +218,8 @@ static int issueReinit() {
|
||||||
// logging plugins like auditd and restart control. Additional
|
// logging plugins like auditd and restart control. Additional
|
||||||
// transitory per-client threads are created for each reader.
|
// transitory per-client threads are created for each reader.
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
|
// We want EPIPE when a reader disconnects, not to terminate logd.
|
||||||
|
signal(SIGPIPE, SIG_IGN);
|
||||||
// logd is written under the assumption that the timezone is UTC.
|
// logd is written under the assumption that the timezone is UTC.
|
||||||
// If TZ is not set, persist.sys.timezone is looked up in some time utility
|
// If TZ is not set, persist.sys.timezone is looked up in some time utility
|
||||||
// libc functions, including mktime. It confuses the logd time handling,
|
// libc functions, including mktime. It confuses the logd time handling,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue