#define DEFAULT_SORT_TIMEOUT 1000 // ms
+#define UNLIMITED_LOG_LEN 0
+
static int sort_buffer_size = 0;
static long sort_timeout = DEFAULT_SORT_TIMEOUT;
static struct log_file l_file;
struct fd_info {
int fd;
int do_sorting;
+ int log_len;
fd_type type;
int index;
char buff[RECEIVE_BUFFER_SIZE];
free(msg);
return ret;
}
+/**
+ * @brief Get buffer filled size
+ * @details Sends a get log len ioctl to given fd
+ * @param[in] fd File descriptor of the buffer
+ * @return -errno on failure, else >= 0 length in bytes
+ * @remarks ANDROID LOGGER version
+ */
+int logger_get_log_len(int fd)
+{
+ int ret = ioctl(fd, LOGGER_GET_LOG_LEN);
+ if (ret < 0) {
+ const int saved_errno = errno;
+ _E("ioctl LOGGER_GET_LOG_LEN failed (%d)", saved_errno);
+ return -saved_errno;
+ }
+ return ret;
+}
/**
* @brief Clear the buffer
}
}
- if (r == 0) {
+ int stop = (r == 0);
+ if (dump && !stop && fdi->log_len > 0) {
+ fdi->log_len -= r;
+ if (fdi->log_len <= 0)
+ stop = 1;
+ }
+
+ filled = 1;
+ fdi->index += r;
+
+ if (stop) {
+ if (fdi->type != BINARY_FILE)
+ epoll_ctl(epollfd, EPOLL_CTL_DEL, fdi->fd, NULL);
+
if (fdi->type == PIPE && dump) {
--pipes;
- epoll_ctl(epollfd, EPOLL_CTL_DEL, fdi->fd, NULL);
} else if (--fd_count <= 0)
accepting_logs = 0;
- continue;
+ if (r == 0)
+ continue;
+ else
+ filled = 0;
}
- filled = 1;
- fdi->index += r;
-
e = (struct logger_entry *)fdi->buff;
switch (fdi->type) {
case ANDROID_LOGGER: {
goto closefile;
fdi->fd = fd;
fdi->do_sorting = 1;
+ fdi->log_len = UNLIMITED_LOG_LEN;
fdi->type = BINARY_FILE;
fdi->index = 0;
return fdi;
goto cleanup;
}
+ const int log_len = logger_get_log_len(fd);
+ if (log_len < 0)
+ goto cleanup;
+
struct fd_info * fdi = malloc(sizeof(struct fd_info));
if (!fdi)
goto cleanup;
fdi->fd = fd;
fdi->do_sorting = 1;
fdi->type = ANDROID_LOGGER;
+ fdi->log_len = log_len;
fdi->index = 0;
return fdi;
goto cleanup;
}
ret->fd = pipe_fd;
+ ret->log_len = UNLIMITED_LOG_LEN;
ret->do_sorting = strncmp(buffer_name, "kmsg", 5) && strncmp(buffer_name, "syslog", 7);
ret->type = PIPE;