|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | /* | 
|  | * Copyright (c) 2019 MediaTek Inc. | 
|  | */ | 
|  |  | 
|  | #include "util.h" | 
|  | #include <linux/fs.h> | 
|  | #include <linux/kernel.h> | 
|  | /* #include <asm/uaccess.h> */ | 
|  | #include <linux/uaccess.h> | 
|  |  | 
|  | #ifdef FILELOG | 
|  |  | 
|  | static char tmp[1000] = { 0 }; | 
|  |  | 
|  | /*TODO*/ | 
|  | /** | 
|  | * open file | 
|  | * @param name path to open | 
|  | * @return file pointer | 
|  | */ | 
|  | struct file *open_file(const char *name) | 
|  | { | 
|  | struct file *fp = NULL; | 
|  |  | 
|  | fp = filp_open(name, O_WRONLY | O_APPEND /*| O_TRUNC */  | O_CREAT, 0664); | 
|  | if (unlikely(fp == NULL)) { | 
|  | pr_debug(KERNEL_INFO "can not open result file"); | 
|  | return NULL; | 
|  | } | 
|  | return fp; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * write to file | 
|  | * @param fp file pointer | 
|  | * @param format format string | 
|  | * @param ... variable-length subsequent arguments | 
|  | */ | 
|  | void write_file(struct file *fp, const char *format, ...) | 
|  | { | 
|  | va_list va; | 
|  | mm_segment_t fs = get_fs(); | 
|  |  | 
|  | va_start(va, format); | 
|  | vsnprintf(tmp, sizeof(tmp), format, va); | 
|  | set_fs(KERNEL_DS); | 
|  | vfs_write(fp, tmp, strlen(tmp), &(fp->f_pos)); | 
|  | set_fs(fs); | 
|  | va_end(va); | 
|  | } | 
|  |  | 
|  | /** | 
|  | * close file | 
|  | * @param fp file pointer | 
|  | * @return exit code | 
|  | */ | 
|  | int close_file(struct file *fp) | 
|  | { | 
|  | if (likely(fp != NULL)) { | 
|  | filp_close(fp, NULL); | 
|  | fp = NULL; | 
|  | return 0; | 
|  | } | 
|  | pr_debug("cannot close file pointer:%p\n", fp); | 
|  | return -1; | 
|  | } | 
|  |  | 
|  | void filelog(char *str) | 
|  | { | 
|  | struct file *fp; | 
|  |  | 
|  | fp = open_file("/data/met.log"); | 
|  | if (fp != NULL) { | 
|  | write_file(fp, "%s", str); | 
|  | close_file(fp); | 
|  | } | 
|  | } | 
|  |  | 
|  | #endif				/* FILELOG */ |