#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的更多相关文章

随机推荐

  1. OAuth2.0授权码模式

    OAuth2.0简单说就是一种授权的协议,OAuth2.0在客户端与服务提供商之间,设置了一个授权层(authorization layer).客户端不能直接登录服务提供商,只能登录授权层,以此将用户 ...

  2. ASCll编码,

  3. Kubernetes PV与PVC的关系

    Kubernetes PV与PVC的关系 PersistenVolume(PV):对存储资源创建和使用的抽象,使得存储作为集群中的资源管理,分为有静态与动态.PersistentVolumeClaim ...

  4. Spring Cloud 新一代Web框架微服务翘楚(一)

    序言 springcloud是微服务架构的集大成者,将一系列优秀的组件进行了整合.基于springboot构建,对我们熟悉spring的程序员来说,上手比较容易. 通过一些简单的注解,我们就可以快速的 ...

  5. WPF toolkit AutoCompleteBox

    checked http://www.broculos.net/2014/04/wpf-autocompletebox-autocomplete-text.html#.WGNnq4N95aQ. 1.S ...

  6. Xamarin移动开发备忘

    vs2017下: 1.debug用于本地生成和调试,release用于发布.区别主要在于: 安卓项目的生成选项属性中,开发者模式release是不勾的,而且高级里的cpu不同(debug是x86,re ...

  7. Java自学-集合框架 二叉树

    Java集合框架 二叉树 示例 1 : 二叉树概念 二叉树由各种节点组成 二叉树特点: 每个节点都可以有左子节点,右子节点 每一个节点都有一个值 package collection; public ...

  8. PHP格林威治时间

    echo gmdate('D, d M Y H:i:s \G\M\T'); echo '<br>'; echo gmdate ("l, d F Y H:i:s").&q ...

  9. 腾讯WeTest加入智慧零售“倍增计划”,引领微信小程序质量优化

    WeTest 导读 在2019腾讯全球数字生态大会零售分论坛上,腾讯正式面向全行业合作伙伴发布倍增计划,通过咨询.培训.竞赛三步走,帮助零售商户解决前端触点融通的问题,推动微信生意大盘阶梯式上涨. 倍 ...

  10. Qt 连接MySQL

    工程文件 QT += sql 举例 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); db.setHostName(&q ...