/* * Receive a log message. We happen to know that "vector" has three parts: * * priority (1 byte) * tag (N bytes -- null-terminated ASCII string) * message (N bytes -- null-terminated ASCII string) */ static ssize_t logWritev(int fd, const struct iovec* vector, int count) { LogState* state; DECLARE_SIGSET(sigflags); /* Make sure that no-one frees the LogState while we're using it. * Also guarantees that only one thread is in showLog() at a given * time (if it matters). */ lock(&sigflags); state = fdToLogState(fd); if (state == NULL) { errno = EBADF; goto error; } if (state->isBinary) { TRACE("%s: ignoring binary log\n", state->debugName); goto bail; } if (count != 3) { TRACE("%s: writevLog with count=%d not expected\n", state->debugName, count); goto error; } /* pull out the three fields */ int logPrio = *(const char*)vector[0].iov_base; const char* tag = (const char*) vector[1].iov_base; const char* msg = (const char*) vector[2].iov_base; /* see if this log tag is configured */ int i; int minPrio = state->globalMinPriority; for (i = 0; i < kTagSetSize; i++) { if (state->tagSet[i].minPriority == ANDROID_LOG_UNKNOWN) break; /* reached end of configured values */ if (strcmp(state->tagSet[i].tag, tag) == 0) { //TRACE("MATCH tag '%s'\n", tag); minPrio = state->tagSet[i].minPriority; break; } } if (logPrio >= minPrio) { showLog(state, logPrio, tag, msg); } else { //TRACE("+++ NOLOG(%d): %s %s", logPrio, tag, msg); } bail: unlock(&sigflags); return vector[0].iov_len + vector[1].iov_len + vector[2].iov_len; error: unlock(&sigflags); return -1; }
/* * Unregister the fake fd and free the memory it pointed to. */ static void deleteFakeFd(int fd) { LogState *ls; lock(); ls = fdToLogState(fd); if (ls != NULL) { openLogTable[fd - FAKE_FD_BASE] = NULL; free(ls->debugName); free(ls); } unlock(); }