#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;
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) {
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,
.mmap = zlogger_mmap,
.unlocked_ioctl = zlogger_ioctl,
#ifdef CONFIG_COMPAT
- .compat_ioctl = zlogger_ioctl,
+ .compat_ioctl = zlogger_compat_ioctl,
#endif
.owner = THIS_MODULE,
};
.attrs = zlogger_attributes,
};
-int __init zlogger_init(void)
+static int zlogger_init(void)
{
int i = 0;
int g_shm_ptr_i = 0;
return r;
}
-static void __exit zlogger_exit(void)
+static void zlogger_exit(void)
{
int i;
struct thread_table_field *ptr = NULL;
#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 {
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;
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;
}