printkd
#include <linux/fs.h> #include <asm/uaccess.h> #include <linux/namei.h> #include <linux/vmalloc.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/list.h> #include <linux/timer.h> #include <linux/workqueue.h> #define BUFSIZE (1024) static struct file *pFile = NULL; static char *pBuf = NULL; static struct delayed_work printkd_work; static struct workqueue_struct *printkd_workqueue = NULL; int printkd2sd(const char *buf, int bufLength) { mm_segment_t old_fs; if(NULL == buf) { printk("%s pBuf pFile null\n", __func__); ; } if (IS_ERR(pFile)) { printk("%s pFile null\n", __func__ ); ; } old_fs = get_fs(); set_fs(KERNEL_DS); if(bufLength != pFile->f_op->write(pFile, (char *)buf, bufLength, &pFile->f_pos) ) { printk("%s: write err\n", __FUNCTION__); set_fs(old_fs); ; } set_fs(old_fs); ; } int printkd2buf(char *buf, unsigned short len) { ; ; == len)) { printk("%s(), par err\n"); ; } if(len >= BUFSIZE) { ret = printkd2sd(pBuf, p); p = ; ret = printkd2sd(buf, len); } - p) ) { memcpy( (pBuf + p), buf, len); p = p + len; } else { ret = printkd2sd(pBuf, p); memcpy(pBuf, buf, len); p = len; } return ret; } static asmlinkage int vscnprintkd(const char *fmt, va_list args) { ]; int ret; unsigned int printed_len; printed_len = vscnprintf( printk_buf , (), fmt, args); ret = printkd2buf(printk_buf, printed_len ); return ret; } static void printkd_init_work(struct work_struct *work) { mm_segment_t old_fs; pFile = filp_open(); if (IS_ERR(pFile)) { printk("%s filp_open error\n", __func__ ); ; } pBuf = vmalloc(BUFSIZE + ); if(NULL == pBuf) { printk("%s vmalloc err\n", __func__); goto close_file; } printkd2buf("printkd log start...\n", sizeof("printkd log start...\n") ); printk("%s(), ok!\n", __func__); return; close_file: filp_close(pFile, NULL); pFile = NULL; printk("%s(), err!\n", __func__); queue_delayed_work(printkd_workqueue, &printkd_work, HZ * ); return; } int printkd_init(void ) { printkd_workqueue = create_workqueue("printkd_init"); INIT_DELAYED_WORK(&printkd_work, printkd_init_work); queue_delayed_work(printkd_workqueue, &printkd_work, HZ * ); } int printkd_read_log( char **pBuf) { struct inode *inode = NULL; mm_segment_t oldfs; char *buf = NULL; unsigned ; int ret; if((NULL == pFile) || (NULL == pBuf) ) { printk("%s pFile pBuf null\n", __func__); ; } oldfs = get_fs(); set_fs(KERNEL_DS); if (!pFile->f_op) { printk("%s: File Operation Method Error\n", __FUNCTION__); goto __fs_close; } inode = pFile->f_path.dentry->d_inode; if (!inode) { printk("%s: Get inode from pFile failed\n", __FUNCTION__); goto __fs_close; } file_length = i_size_read(inode->i_mapping->host); && (file_length < * ) )) { printk("%s file size error\n", __FUNCTION__); goto __fs_close; } buf = vmalloc(file_length + ); if (!buf) { printk("%s alloctation memory failed\n", __FUNCTION__); goto __fs_close; } pFile->f_op->llseek(pFile, , SEEK_SET); ret = vfs_read(pFile, buf, file_length, &pFile->f_pos); if (ret != file_length) { printk("%s: vfs_read error, file_length:%d, ret:%d\n", __FUNCTION__, file_length, ret); pFile->f_op->llseek(pFile, , SEEK_END); goto free_buf; } pFile->f_op->llseek(pFile, , SEEK_END); printk("%s file_length:0x%x\n", __func__, file_length); *pBuf = buf; set_fs(oldfs); printk("%s(), ok!\n", __func__); return file_length; free_buf: vfree(buf); __fs_close: set_fs(oldfs); printk("%s(), error!\n", __func__); ; } asmlinkage int printkd(const char *fmt, ...) { va_list args; int r; va_start(args, fmt); r = vscnprintkd(fmt, args); va_end(args); return r; }
printkd的更多相关文章
随机推荐
- git操作记录(如何回退到某个历史版本,如何提交部分文件等方法)
当前项目使用git管理代码,在使用的过程中会遇到一些问题,这里记录下 1.合并代码后 在合并组员的代码后会出现下面的界面,开始的时候都会关闭,重新打开,乐此不疲到忍无可忍 解决方法: 出现这种界面是要 ...
- Vue.js 源码分析(三十二) 总结
第一次写博客,坚持了一个多月时间,Vue源码分析基本分析完了,回过头也看也漏了一些地方,比如双向绑定里的观察者模式,也可以说是订阅者模式,也就是Vue里的Dep.Watcher等这些函数的作用,网上搜 ...
- Kubernetes Ingress 部署
Kubernetes Ingress 部署 Pod与Ingress的关系• 通过service相关联• 通过Ingress Controller实现Pod的负载均衡- 支持TCP/UDP 4层和HTT ...
- 【UOJ#60】【UR #5】怎样提高智商
[UOJ#60][UR #5]怎样提高智商 题面 UOJ 题解 首先猜猜答案是\(4*3^{n-1}\).即前面的选啥都行,后面的搞搞就行了. 而打表(看题解),可以知道答案就是这个,并且每个问题都是 ...
- 【EasyExcel】使用easyExcel过程中,项目报错的解决集合
报错:Can not close IO [ERROR] 2019-11-02 13:51:21.210 [ProExportSkuDataJob-1455-TaskThread-1] [com.dma ...
- winform子窗口调用父窗口的控件及方法-一般调用
首先新建一个窗体应用程序,在项目属性中点击右键->添加->添加新项,选择Windows窗体->添加. 在Form1和Form2窗口中各添加一个按钮,并双击添加事件处理函数: ...
- Python - 正则表达式 - 第二十二天
正则表达式 - 教程 正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式使用单 ...
- jsonp格式前端发送和后台接受写法
jsonp是ajax提交的一种格式不会受跨域限制 一.前端发送 <button>11111</button> <script src="https://cdn. ...
- 纯C语言实现链队
#include <stdio.h> #include <stdlib.h> typedef int QElemType; typedef struct QNode{ QEle ...
- centos7安装mysql5.7(rpm安装版)
1.下载mysql5.7的rpm安装包 rpm的mysql包,安装起来简单,解压版的mysql还需要做许多配置,稍有不慎就会出错!!! 下载地址:https://dev.mysql.com/downl ...