From: Mateusz Majewski Date: Thu, 13 Aug 2020 10:48:30 +0000 (+0200) Subject: Move some functions to backend_androidlogger.c X-Git-Tag: accepted/tizen/unified/20200820.034649~8 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a7ff675b989386efc512758cfd61e06264a07e3c;p=platform%2Fcore%2Fsystem%2Fdlog.git Move some functions to backend_androidlogger.c Change-Id: I6043e488277ddcf382a7743a0c8579a9efd0e395 --- diff --git a/Makefile.am b/Makefile.am index 551aa11..9da5b39 100644 --- a/Makefile.am +++ b/Makefile.am @@ -411,11 +411,11 @@ src_tests_fd_info_neg_SOURCES = src/tests/fd_info_neg.c \ src_tests_fd_info_neg_CFLAGS = $(check_CFLAGS) src_tests_fd_info_neg_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=sort_vector_push,--wrap=malloc,--wrap=free,--wrap=close,--wrap=dlogutil_entry_get_timestamp,--wrap=log_should_print_line -src_tests_fdi_logger_pos_SOURCES = src/tests/fdi_logger_pos.c src/libdlogutil/fdi_logger.c src/shared/ptrs_list.c src/shared/logcommon.c +src_tests_fdi_logger_pos_SOURCES = src/tests/fdi_logger_pos.c src/libdlogutil/fdi_logger.c src/shared/ptrs_list.c src/shared/logcommon.c src/shared/backend_androidlogger.c src/shared/logconfig.c src/shared/parsers.c src_tests_fdi_logger_pos_CFLAGS = $(check_CFLAGS) src_tests_fdi_logger_pos_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=logger_open_buffer_from_config_get_path,--wrap=dlogutil_filter_options_set_filterspec,--wrap=parse_androidlogger_message,--wrap=copy_recv_timestamp,--wrap=malloc,--wrap=read,--wrap=close,--wrap=ioctl,--wrap=calloc -src_tests_fdi_logger_neg_SOURCES = src/tests/fdi_logger_neg.c src/libdlogutil/fdi_logger.c src/shared/ptrs_list.c src/shared/logcommon.c +src_tests_fdi_logger_neg_SOURCES = src/tests/fdi_logger_neg.c src/libdlogutil/fdi_logger.c src/shared/ptrs_list.c src/shared/logcommon.c src/shared/backend_androidlogger.c src/shared/logconfig.c src/shared/parsers.c src_tests_fdi_logger_neg_CFLAGS = $(check_CFLAGS) src_tests_fdi_logger_neg_LDFLAGS = $(AM_LDFLAGS) -Wl,--wrap=logger_open_buffer_from_config_get_path,--wrap=dlogutil_filter_options_set_filterspec,--wrap=parse_androidlogger_message,--wrap=copy_recv_timestamp,--wrap=malloc,--wrap=read,--wrap=close,--wrap=ioctl,--wrap=calloc diff --git a/include/backend_androidlogger.h b/include/backend_androidlogger.h index 69b981d..3bf138d 100644 --- a/include/backend_androidlogger.h +++ b/include/backend_androidlogger.h @@ -13,6 +13,9 @@ int logger_open_buffer_get_path(int buf_id, const char *const config_list, int o int logger_open_buffer_from_config(int buf_id, const struct log_config *conf, int open_flags, int *fd); int logger_open_buffer_from_config_get_path(int buf_id, const struct log_config *conf, int open_flags, int *fd, char *actual_path, size_t path_size); +int logger_ioctl(int fd, int ioctl_id); +int logger_get_log_len(int fd); + #ifdef __cplusplus } #endif diff --git a/src/libdlogutil/fdi_logger.c b/src/libdlogutil/fdi_logger.c index 519c3ba..e0c9012 100644 --- a/src/libdlogutil/fdi_logger.c +++ b/src/libdlogutil/fdi_logger.c @@ -33,16 +33,6 @@ #define UNLIMITED_LOG_LEN -1 -static int logger_ioctl(int fd, int ioctl_id) -{ - assert(fd >= 0); - - int ret = ioctl(fd, ioctl_id); - if (ret < 0) - return -errno; - return ret; -} - static int logger_get_capacity(struct fd_info *fdi, unsigned int *capacity) { assert(fdi); @@ -68,57 +58,6 @@ static int logger_get_usage(struct fd_info *fdi, unsigned int *usage) } /** - * @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 - */ -static int logger_get_log_len(int fd) -{ - /* WARNING! This value REQUIRES `CAP_SYSLOG` to be correct! - * - * The driver returns the total amount of logs in the buffer - * from this syscall, but poll() and read() will NOT return - * all of those unless we have `CAP_SYSLOG` or `euid` matches. - * - * This means that the code will know there are more logs and - * wait for them, but will never receive them, causing what - * looks like a hang until more valid logs appear to fill in - * the gap. This usually takes a long time and is not what - * we want, at any rate. - * - * A full workaround (given that a kernel fix would be nearly - * impossible to properly distribute) would be to perform an - * additional read() call after the first one, on following - * conditions: - * - CAP_SYSLOG is not present - * - epoll marked our FD ready the previous iteration - * - epoll marked our FD unready the current iteration - * - we are a dumping instance - * - we are using Android Logger backend. - * That would solve the issue with the minimal amount of syscalls. - * However, it would be a horrible idea to do so because it would - * turn our code into an abomination, and terror would consume - * those who dwell upon the earth. - * - * Alternatively, the loop could receive special handling for - * dumping Android Logger instances since technically they don't - * even need to poll (just read a log after each extraction to - * replace the hole). It's not very elegant either but would - * also offer a decent performance bonus so if mana permits it - * might be worth doing regardless. - * - * In the meantime, using [lib]dlogutil without CAP_SYSLOG is - * unsupported and people should just be told to get the cap if - * they want to use it (it took us four years to discover that - * this is an actual condition so presumably nowadays the cap is - * a dime a dozen and comparatively easy to obtain). */ - - return logger_ioctl(fd, LOGGER_GET_LOG_LEN); -} - -/** * @brief Clear the buffer * @details Sends a clear ioctl to given fd * @param[in] fdi File descriptor info diff --git a/src/shared/backend_androidlogger.c b/src/shared/backend_androidlogger.c index 0fa40e3..5aa09e8 100644 --- a/src/shared/backend_androidlogger.c +++ b/src/shared/backend_androidlogger.c @@ -186,3 +186,59 @@ int logger_open_buffer_from_config(int buf_id, const struct log_config *conf, in { return logger_open_buffer_from_config_get_path(buf_id, conf, open_flags, fd, NULL, 0U); } + +int logger_ioctl(int fd, int ioctl_id) +{ + assert(fd >= 0); + + int ret = ioctl(fd, ioctl_id); + if (ret < 0) + return -errno; + 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 + */ +int logger_get_log_len(int fd) +{ + /* WARNING! This value REQUIRES `CAP_SYSLOG` to be correct! + * + * The driver returns the total amount of logs in the buffer + * from this syscall, but poll() and read() will NOT return + * all of those unless we have `CAP_SYSLOG` or `euid` matches. + * + * This is problematic in [lib]dlogutil. For example, the + * monitor and dump modes use the number of logs to recognize + * how much logs to print (dump) or skip (monitor). + * This means that the code will know there are more logs and + * wait for them, but will never receive them, causing what + * looks like a hang until more valid logs appear to fill in + * the gap. This usually takes a long time and is not what + * we want, at any rate. + * + * A full workaround (given that a kernel fix would be nearly + * impossible to properly distribute) would be to perform an + * additional read() call after the first one, on following + * conditions: + * - CAP_SYSLOG is not present + * - epoll marked our FD ready the previous iteration + * - epoll marked our FD unready the current iteration + * - we are a dumping or monitoring instance + * - we are using Android Logger backend. + * That would solve the issue with the minimal amount of syscalls. + * However, it would be a horrible idea to do so because it would + * turn our code into an abomination, and terror would consume + * those who dwell upon the earth. + * + * Therefore, using [lib]dlogutil without CAP_SYSLOG is + * unsupported and people should just be told to get the cap if + * they want to use it (it took us four years to discover that + * this is an actual condition so presumably nowadays the cap is + * a dime a dozen and comparatively easy to obtain). */ + + return logger_ioctl(fd, LOGGER_GET_LOG_LEN); +}