From: Arkadiusz Nowak Date: Tue, 30 Aug 2022 12:14:30 +0000 (+0200) Subject: Zlogger module ioctl rework X-Git-Tag: submit/tizen/20220906.135332~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=76a237c859ade55595d4f48de141978ce5bd8863;p=platform%2Fkernel%2Flinux-tizen-modules-source.git Zlogger module ioctl rework Changed ioctl command type. Added compat zlogger_compat_ioctl. Switch based selector against if in ioctl. Removed unnecessary __init, __exit attributes. Test program zlog_stdout should show error if ioctl and write call failed. Change-Id: I5994899de42c09997cced28a7a159e1b4a55bf38 Signed-off-by: Arkadiusz Nowak --- diff --git a/include/uapi/linux/zlogger.h b/include/uapi/linux/zlogger.h index f9c1b3e..5456cbf 100644 --- a/include/uapi/linux/zlogger.h +++ b/include/uapi/linux/zlogger.h @@ -35,8 +35,8 @@ #define ZLOGGER_MSG_MAX (140) #define ZLOGGER_IOCTL_COMMAND_ALLOC (20745321) -#define ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY _IOW('a', 'a', char*) -#define ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG _IOW('a', 'b', char*) +#define ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY _IOW('a', 'a', uint32_t) +#define ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG _IOW('a', 'b', char* ) struct zlogger_entry { __u64 time; diff --git a/kernel/zlogger/zlogger.c b/kernel/zlogger/zlogger.c index db39da1..796836d 100644 --- a/kernel/zlogger/zlogger.c +++ b/kernel/zlogger/zlogger.c @@ -88,7 +88,7 @@ enum log_priority { #define LOG_BUFFER_SIZE 512 static const char default_tag[] = "STDOUT"; struct zlog_file { - char prio; + uint32_t prio; char tag[ZLOGGER_TAG_MAX]; char msg[ZLOGGER_MSG_MAX]; char *buffer; @@ -424,7 +424,7 @@ static ssize_t init_file_zlog_tag_data(struct file *filep) zlog_file_data->buffer = NULL; memcpy(zlog_file_data->tag, default_tag, sizeof(default_tag) - 1); zlog_file_data->tag[sizeof(default_tag) - 1] = '\0'; - zlog_file_data->prio = (char)DLOG_INFO; + zlog_file_data->prio = (uint32_t)DLOG_INFO; zlog_file_data->buffer = kmalloc(LOG_BUFFER_SIZE, GFP_KERNEL); if (!zlog_file_data->buffer) { @@ -562,57 +562,93 @@ static ssize_t zlogger_write(struct file *filep, const char __user *buffer, size return len; } -static long update_prio(struct zlog_file *zlog_file_data, void __user *argp) +static long zlogger_update_prio(struct file *filp, unsigned long argp) { - char prio; + struct zlog_file *zlog_file_data; + uint32_t prio; + + if ((!filp->private_data) && init_file_zlog_tag_data(filp)) { + pr_err("zlogger_update_prio: init zlog tag data failed\n"); + return -ENOMEM; + } - prio = (char)(uintptr_t)argp; + zlog_file_data = (struct zlog_file *)filp->private_data; - if (prio < (char)DLOG_DEFAULT || prio >= DLOG_PRIO_MAX) + prio = (uint32_t) argp; + + if (prio < DLOG_DEFAULT || prio >= DLOG_PRIO_MAX) { + pr_err("zlogger_update_prio: incorrect prio value %u", prio); return -EINVAL; + } + zlog_file_data->prio = prio; return 0; } -static long zlogger_ioctl(struct file *file, unsigned int cmd, unsigned long arg) +static long zlogger_set_default_tag(struct file *filp, unsigned long arg) { - void __user *argp; struct zlog_file *zlog_file_data; + char tag[ZLOGGER_TAG_MAX + 1]; + void __user *argp; + size_t res; + size_t len; - if (cmd == ZLOGGER_IOCTL_COMMAND_ALLOC) - return alloc_block_for_thread(false); + if( (!filp->private_data ) && init_file_zlog_tag_data(filp)) { + pr_err("zlogger_set_default_tag: init zlog tag data failed\n"); + return -ENOMEM; + } + + zlog_file_data = (struct zlog_file *)filp->private_data; -#ifdef CONFIG_COMPAT - argp = compat_ptr(arg); -#else argp = (void __user *)arg; -#endif - if (cmd == ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY) { - if ((!file->private_data) && init_file_zlog_tag_data(file)) { - pr_err("zlogger_write init zlog tag data failed\n"); - return -ENOMEM; - } + res = copy_from_user(tag, argp, ZLOGGER_TAG_MAX + 1); - zlog_file_data = (struct zlog_file *)file->private_data; + if(res != 0) { + pr_err("zlogger_set_default_tag: copy_from_user failed\n"); + return -EFAULT; + } - return update_prio(zlog_file_data, argp); + len = strnlen(tag, ZLOGGER_TAG_MAX + 1); + if (len > ZLOGGER_TAG_MAX || len == 0) { + pr_err("zlogger_set_default_tag: tag is too long or empty\n"); + return -EINVAL; } + memset(zlog_file_data->tag, 0, ZLOGGER_TAG_MAX); + memcpy(zlog_file_data->tag, tag, len); - if (cmd == ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG) { - if ((!file->private_data) && init_file_zlog_tag_data(file)) { - pr_err("zlogger_write init zlog tag data failed\n"); - return -ENOMEM; - } + return 0; +} - zlog_file_data = (struct zlog_file *)file->private_data; +static long zlogger_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + switch (cmd) { + case ZLOGGER_IOCTL_COMMAND_ALLOC: + return alloc_block_for_thread(false); + break; - return copy_from_user(&zlog_file_data->tag, (char *)(uintptr_t)argp, strnlen((char *)(uintptr_t)argp, ZLOGGER_TAG_MAX)); + case ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY: + return zlogger_update_prio(filp, arg); + break; + + case ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG: + return zlogger_set_default_tag(filp, arg); + break; + default: + return -EINVAL; } +} - return -EINVAL; +#ifdef CONFIG_COMPAT +static long zlogger_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) +{ + if (cmd == ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG) { + return zlogger_ioctl(filp, cmd, (unsigned long)compat_ptr(arg)); + } + return zlogger_ioctl(filp, cmd, arg); } +#endif static const struct file_operations zlogger_fops = { .open = zlogger_open, @@ -622,7 +658,7 @@ static const struct file_operations zlogger_fops = { .mmap = zlogger_mmap, .unlocked_ioctl = zlogger_ioctl, #ifdef CONFIG_COMPAT - .compat_ioctl = zlogger_ioctl, + .compat_ioctl = zlogger_compat_ioctl, #endif .owner = THIS_MODULE, }; @@ -733,7 +769,7 @@ static const struct attribute_group zlogger_attr_group = { .attrs = zlogger_attributes, }; -int __init zlogger_init(void) +static int zlogger_init(void) { int i = 0; int g_shm_ptr_i = 0; @@ -815,7 +851,7 @@ out_free_g_thread_table_g_shm_ptr: return r; } -static void __exit zlogger_exit(void) +static void zlogger_exit(void) { int i; struct thread_table_field *ptr = NULL; diff --git a/tests/zlog_stdout/zlog_stdout.c b/tests/zlog_stdout/zlog_stdout.c index 1e28e4c..2dfd5eb 100644 --- a/tests/zlog_stdout/zlog_stdout.c +++ b/tests/zlog_stdout/zlog_stdout.c @@ -18,12 +18,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include // taken from dlog.h typedef enum { @@ -50,6 +52,28 @@ static const char *prio_silent = "Prio: SILENT\n"; static const char *test_message = "A test message\n"; + +#define zlogger_ioctl_prio(fd, ioctl_cmd, prio, message ) \ + if(ioctl(fd, ioctl_cmd, (uint32_t)prio) < 0) { \ + printf("Error setting default priority: errno: %d\n", errno); \ + return -1; \ + } \ + if (write(fd, message, strlen(message)) < 0) { \ + printf("Error writing to zlog device: errno %d\n", errno); \ + return -1; \ + } \ + + +#define zlogger_ioctl_tag(fd, ioctl_cmd, tag, message) \ + if(ioctl(fd, ioctl_cmd, tag) < 0) { \ + printf("Error setting default priority: errno: %d\n", errno); \ + return -1; \ + } \ + if (write(fd, message, strlen(message)) < 0) { \ + printf("Error writing to zlog device: errno %d\n", errno); \ + return -1; \ + } \ + int main(int argc, char *argv[]) { int fd; @@ -63,58 +87,27 @@ int main(int argc, char *argv[]) return -1; } - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_DEFAULT); - write(fd, prio_default, strlen(prio_default)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_VERBOSE); - write(fd, prio_verbose, strlen(prio_verbose)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_DEBUG); - write(fd, prio_debug, strlen(prio_debug)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_INFO); - write(fd, prio_info, strlen(prio_info)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_WARN); - write(fd, prio_warn, strlen(prio_warn)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_ERROR); - write(fd, prio_error, strlen(prio_error)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_FATAL); - write(fd, prio_fatal, strlen(prio_fatal)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_SILENT); - write(fd, prio_silent, strlen(prio_silent)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG, "TESTPROGRAM_1"); - write(fd, test_message, strlen(test_message)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_DEFAULT); - write(fd, prio_default, strlen(prio_default)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_VERBOSE); - write(fd, prio_verbose, strlen(prio_verbose)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_DEBUG); - write(fd, prio_debug, strlen(prio_debug)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_INFO); - write(fd, prio_info, strlen(prio_info)); - - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_WARN); - write(fd, prio_warn, strlen(prio_warn)); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_DEFAULT, prio_default); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_VERBOSE, prio_verbose); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_DEBUG, prio_debug); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_INFO, prio_info); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_WARN, prio_warn); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_ERROR, prio_error); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_FATAL, prio_fatal); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_SILENT, prio_silent); - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_ERROR); - write(fd, prio_error, strlen(prio_error)); + zlogger_ioctl_tag(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG, "TESTPROGRAM_1", test_message); - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_FATAL); - write(fd, prio_fatal, strlen(prio_fatal)); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_DEFAULT, prio_default); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_VERBOSE, prio_verbose); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_DEBUG, prio_debug); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_INFO, prio_info) + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_WARN, prio_warn); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_ERROR, prio_error); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_FATAL, prio_fatal); + zlogger_ioctl_prio(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, DLOG_SILENT, prio_silent); - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_PRIORITY, (char)DLOG_SILENT); - write(fd, prio_silent, strlen(prio_silent)); + zlogger_ioctl_tag(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG, "TESTPROGRAM_2", test_message); - ioctl(fd, ZLOGGER_IOCTL_COMMAND_SET_DEFAULT_TAG, "TESTPROGRAM_2"); - write(fd, test_message, strlen(test_message)); return 0; }