Zlogger module ioctl rework 69/280469/7
authorArkadiusz Nowak <a.nowak3@samsung.com>
Tue, 30 Aug 2022 12:14:30 +0000 (14:14 +0200)
committerArkadiusz Nowak <a.nowak3@samsung.com>
Thu, 1 Sep 2022 07:46:18 +0000 (09:46 +0200)
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 <a.nowak3@samsung.com>
include/uapi/linux/zlogger.h
kernel/zlogger/zlogger.c
tests/zlog_stdout/zlog_stdout.c

index f9c1b3e75230fe7d1b0bb1060218b7f8c934ac85..5456cbfd54dda9bd75265022a357602715426667 100644 (file)
@@ -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;
index db39da1d5a6fb75df374cbd740c34b6a4037de2c..796836dc676638c7e6ff73970450f7aaafb4bcd7 100644 (file)
@@ -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;
index 1e28e4ca23de250df2cdbf2fdeeedf68aca31297..2dfd5ebd591e0d2e5d7823f89ad9e5bb30b90440 100644 (file)
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <stdint.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include <sys/ioctl.h>
 #include <linux/zlogger.h>
+#include <errno.h>
 
 // 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;
 }