mirror of
https://github.com/bashrc/LKMPG.git
synced 2018-06-11 03:06:54 +02:00
Fix proc second example
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<!-- 2016-03-08 Tue 15:25 -->
|
||||
<!-- 2016-03-08 Tue 15:42 -->
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||
<title>The Linux Kernel Module Programming Guide</title>
|
||||
@@ -2065,6 +2065,7 @@ HelloWorld!
|
||||
<span class="org-preprocessor">#include</span> <span class="org-string"><linux/kernel.h></span>
|
||||
<span class="org-preprocessor">#include</span> <span class="org-string"><linux/proc_fs.h></span>
|
||||
<span class="org-preprocessor">#include</span> <span class="org-string"><asm/uaccess.h></span>
|
||||
|
||||
<span class="org-preprocessor">#define</span> <span class="org-variable-name">procfs_name</span> <span class="org-string">"helloworld"</span>
|
||||
|
||||
<span class="org-keyword">struct</span> <span class="org-type">proc_dir_entry</span> *<span class="org-variable-name">Our_Proc_File</span>;
|
||||
@@ -2076,9 +2077,9 @@ HelloWorld!
|
||||
<span class="org-type">int</span> <span class="org-variable-name">ret</span>=0;
|
||||
<span class="org-keyword">if</span>(strlen(buffer) ==0)
|
||||
{
|
||||
printk(KERN_INFO <span class="org-string">"procfile read %s\n"</span>,filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,<span class="org-string">"HelloWorld!\n"</span>,<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>));
|
||||
ret=<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>);
|
||||
printk(KERN_INFO <span class="org-string">"procfile read %s\n"</span>,filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,<span class="org-string">"HelloWorld!\n"</span>,<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>));
|
||||
ret=<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>);
|
||||
}
|
||||
<span class="org-keyword">return</span> ret;
|
||||
|
||||
@@ -2169,73 +2170,60 @@ The only memory segment accessible to a process is its own, so when writing regu
|
||||
<span class="org-doc"> * This function is called then the /proc file is read</span>
|
||||
<span class="org-doc"> *</span>
|
||||
<span class="org-doc"> */</span>
|
||||
<span class="org-type">int</span>
|
||||
<span class="org-function-name">procfile_read</span>(<span class="org-type">char</span> *<span class="org-variable-name">buffer</span>,
|
||||
<span class="org-type">char</span> **<span class="org-variable-name">buffer_location</span>,
|
||||
<span class="org-type">off_t</span> <span class="org-variable-name">offset</span>, <span class="org-type">int</span> <span class="org-variable-name">buffer_length</span>, <span class="org-type">int</span> *<span class="org-variable-name">eof</span>, <span class="org-type">void</span> *<span class="org-variable-name">data</span>)
|
||||
<span class="org-type">ssize_t</span> <span class="org-function-name">procfile_read</span>(<span class="org-keyword">struct</span> <span class="org-type">file</span> *<span class="org-variable-name">filePointer</span>,<span class="org-type">char</span> *<span class="org-variable-name">buffer</span>,
|
||||
<span class="org-type">size_t</span> <span class="org-variable-name">buffer_length</span>, <span class="org-type">loff_t</span> * <span class="org-variable-name">offset</span>)
|
||||
{
|
||||
<span class="org-type">int</span> <span class="org-variable-name">ret</span>;
|
||||
|
||||
printk(KERN_INFO <span class="org-string">"procfile_read (/proc/%s) called\n"</span>, PROCFS_NAME);
|
||||
|
||||
<span class="org-keyword">if</span> (offset > 0) {
|
||||
<span class="org-comment-delimiter">/* </span><span class="org-comment">we have finished to read, return 0 </span><span class="org-comment-delimiter">*/</span>
|
||||
ret = 0;
|
||||
} <span class="org-keyword">else</span> {
|
||||
<span class="org-comment-delimiter">/* </span><span class="org-comment">fill the buffer, return the buffer size </span><span class="org-comment-delimiter">*/</span>
|
||||
memcpy(buffer, procfs_buffer, procfs_buffer_size);
|
||||
ret = procfs_buffer_size;
|
||||
<span class="org-type">int</span> <span class="org-variable-name">ret</span>=0;
|
||||
<span class="org-keyword">if</span>(strlen(buffer) ==0)
|
||||
{
|
||||
printk(KERN_INFO <span class="org-string">"procfile read %s\n"</span>,filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,<span class="org-string">"HelloWorld!\n"</span>,<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>));
|
||||
ret=<span class="org-keyword">sizeof</span>(<span class="org-string">"HelloWorld!\n"</span>);
|
||||
}
|
||||
|
||||
<span class="org-keyword">return</span> ret;
|
||||
}
|
||||
|
||||
|
||||
<span class="org-doc">/**</span>
|
||||
<span class="org-doc"> * This function is called with the /proc file is written</span>
|
||||
<span class="org-doc"> *</span>
|
||||
<span class="org-doc"> */</span>
|
||||
<span class="org-type">int</span> <span class="org-function-name">procfile_write</span>(<span class="org-keyword">struct</span> <span class="org-type">file</span> *<span class="org-variable-name">file</span>, <span class="org-keyword">const</span> <span class="org-type">char</span> *<span class="org-variable-name">buffer</span>, <span class="org-type">unsigned</span> <span class="org-type">long</span> <span class="org-variable-name">count</span>,
|
||||
<span class="org-type">void</span> *<span class="org-variable-name">data</span>)
|
||||
<span class="org-keyword">static</span> <span class="org-type">ssize_t</span> <span class="org-function-name">procfile_write</span>(<span class="org-keyword">struct</span> <span class="org-type">file</span> *<span class="org-variable-name">file</span>, <span class="org-keyword">const</span> <span class="org-type">char</span> *<span class="org-variable-name">buff</span>,
|
||||
<span class="org-type">size_t</span> <span class="org-variable-name">len</span>, <span class="org-type">loff_t</span> *<span class="org-variable-name">off</span>)
|
||||
{
|
||||
<span class="org-comment-delimiter">/* </span><span class="org-comment">get buffer size </span><span class="org-comment-delimiter">*/</span>
|
||||
procfs_buffer_size = count;
|
||||
<span class="org-keyword">if</span> (procfs_buffer_size > PROCFS_MAX_SIZE ) {
|
||||
procfs_buffer_size = len;
|
||||
<span class="org-keyword">if</span> (procfs_buffer_size > PROCFS_MAX_SIZE)
|
||||
procfs_buffer_size = PROCFS_MAX_SIZE;
|
||||
}
|
||||
|
||||
<span class="org-comment-delimiter">/* </span><span class="org-comment">write data to the buffer </span><span class="org-comment-delimiter">*/</span>
|
||||
<span class="org-keyword">if</span> ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) {
|
||||
<span class="org-keyword">if</span> (copy_from_user(procfs_buffer, buff, procfs_buffer_size))
|
||||
<span class="org-keyword">return</span> -EFAULT;
|
||||
}
|
||||
|
||||
procfs_buffer[procfs_buffer_size] = <span class="org-string">'\0'</span>;
|
||||
<span class="org-keyword">return</span> procfs_buffer_size;
|
||||
}
|
||||
|
||||
<span class="org-keyword">static</span> <span class="org-keyword">const</span> <span class="org-keyword">struct</span> <span class="org-type">file_operations</span> <span class="org-variable-name">proc_file_fops</span> = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = procfile_read,
|
||||
.write = procfile_write,
|
||||
};
|
||||
|
||||
<span class="org-doc">/**</span>
|
||||
<span class="org-doc"> *This function is called when the module is loaded</span>
|
||||
<span class="org-doc"> *</span>
|
||||
<span class="org-doc"> */</span>
|
||||
<span class="org-type">int</span> <span class="org-function-name">init_module</span>()
|
||||
{
|
||||
<span class="org-comment-delimiter">/* </span><span class="org-comment">create the /proc file </span><span class="org-comment-delimiter">*/</span>
|
||||
Our_Proc_File = proc_create(PROCFS_NAME, 0, <span class="org-constant">NULL</span>, <span class="org-constant">NULL</span>);
|
||||
|
||||
<span class="org-keyword">if</span> (Our_Proc_File == <span class="org-constant">NULL</span>) {
|
||||
remove_proc_entry(PROCFS_NAME, <span class="org-constant">NULL</span>);
|
||||
printk(KERN_ALERT <span class="org-string">"Error: Could not initialize /proc/%s\n"</span>,
|
||||
PROCFS_NAME);
|
||||
Our_Proc_File = proc_create(PROCFS_NAME,0644,<span class="org-constant">NULL</span>,&proc_file_fops);
|
||||
<span class="org-keyword">if</span>(<span class="org-constant">NULL</span>==Our_Proc_File)
|
||||
{
|
||||
proc_remove(Our_Proc_File);
|
||||
printk(KERN_ALERT <span class="org-string">"Error:Could not initialize /proc/%s\n"</span>,PROCFS_NAME);
|
||||
<span class="org-keyword">return</span> -ENOMEM;
|
||||
}
|
||||
|
||||
Our_Proc_File->read_proc = procfile_read;
|
||||
Our_Proc_File->write_proc = procfile_write;
|
||||
Our_Proc_File->mode = S_IFREG | S_IRUGO;
|
||||
Our_Proc_File->uid = 0;
|
||||
Our_Proc_File->gid = 0;
|
||||
Our_Proc_File->size = 37;
|
||||
|
||||
printk(KERN_INFO <span class="org-string">"/proc/%s created\n"</span>, PROCFS_NAME);
|
||||
<span class="org-keyword">return</span> 0; <span class="org-comment-delimiter">/* </span><span class="org-comment">everything is ok </span><span class="org-comment-delimiter">*/</span>
|
||||
<span class="org-keyword">return</span> 0;
|
||||
}
|
||||
|
||||
<span class="org-doc">/**</span>
|
||||
@@ -2244,7 +2232,7 @@ The only memory segment accessible to a process is its own, so when writing regu
|
||||
<span class="org-doc"> */</span>
|
||||
<span class="org-type">void</span> <span class="org-function-name">cleanup_module</span>()
|
||||
{
|
||||
remove_proc_entry(PROCFS_NAME, <span class="org-constant">NULL</span>);
|
||||
proc_remove(Our_Proc_File);
|
||||
printk(KERN_INFO <span class="org-string">"/proc/%s removed\n"</span>, PROCFS_NAME);
|
||||
}
|
||||
</pre>
|
||||
|
||||
@@ -1170,6 +1170,7 @@ HelloWorld!
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
#define procfs_name "helloworld"
|
||||
|
||||
struct proc_dir_entry *Our_Proc_File;
|
||||
@@ -1181,9 +1182,9 @@ ssize_t procfile_read(struct file *filePointer,char *buffer,
|
||||
int ret=0;
|
||||
if(strlen(buffer) ==0)
|
||||
{
|
||||
printk(KERN_INFO "procfile read %s\n",filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,"HelloWorld!\n",sizeof("HelloWorld!\n"));
|
||||
ret=sizeof("HelloWorld!\n");
|
||||
printk(KERN_INFO "procfile read %s\n",filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,"HelloWorld!\n",sizeof("HelloWorld!\n"));
|
||||
ret=sizeof("HelloWorld!\n");
|
||||
}
|
||||
return ret;
|
||||
|
||||
@@ -1260,73 +1261,60 @@ static unsigned long procfs_buffer_size = 0;
|
||||
* This function is called then the /proc file is read
|
||||
*
|
||||
*/
|
||||
int
|
||||
procfile_read(char *buffer,
|
||||
char **buffer_location,
|
||||
off_t offset, int buffer_length, int *eof, void *data)
|
||||
ssize_t procfile_read(struct file *filePointer,char *buffer,
|
||||
size_t buffer_length, loff_t * offset)
|
||||
{
|
||||
int ret;
|
||||
|
||||
printk(KERN_INFO "procfile_read (/proc/%s) called\n", PROCFS_NAME);
|
||||
|
||||
if (offset > 0) {
|
||||
/* we have finished to read, return 0 */
|
||||
ret = 0;
|
||||
} else {
|
||||
/* fill the buffer, return the buffer size */
|
||||
memcpy(buffer, procfs_buffer, procfs_buffer_size);
|
||||
ret = procfs_buffer_size;
|
||||
}
|
||||
|
||||
return ret;
|
||||
int ret=0;
|
||||
if(strlen(buffer) ==0)
|
||||
{
|
||||
printk(KERN_INFO "procfile read %s\n",filePointer->f_path.dentry->d_name.name);
|
||||
ret=copy_to_user(buffer,"HelloWorld!\n",sizeof("HelloWorld!\n"));
|
||||
ret=sizeof("HelloWorld!\n");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This function is called with the /proc file is written
|
||||
*
|
||||
*/
|
||||
int procfile_write(struct file *file, const char *buffer, unsigned long count,
|
||||
void *data)
|
||||
static ssize_t procfile_write(struct file *file, const char *buff,
|
||||
size_t len, loff_t *off)
|
||||
{
|
||||
/* get buffer size */
|
||||
procfs_buffer_size = count;
|
||||
if (procfs_buffer_size > PROCFS_MAX_SIZE ) {
|
||||
procfs_buffer_size = len;
|
||||
if (procfs_buffer_size > PROCFS_MAX_SIZE)
|
||||
procfs_buffer_size = PROCFS_MAX_SIZE;
|
||||
}
|
||||
|
||||
/* write data to the buffer */
|
||||
if ( copy_from_user(procfs_buffer, buffer, procfs_buffer_size) ) {
|
||||
if (copy_from_user(procfs_buffer, buff, procfs_buffer_size))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
procfs_buffer[procfs_buffer_size] = '\0';
|
||||
return procfs_buffer_size;
|
||||
}
|
||||
|
||||
static const struct file_operations proc_file_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.read = procfile_read,
|
||||
.write = procfile_write,
|
||||
};
|
||||
|
||||
/**
|
||||
*This function is called when the module is loaded
|
||||
*
|
||||
*/
|
||||
int init_module()
|
||||
{
|
||||
/* create the /proc file */
|
||||
Our_Proc_File = proc_create(PROCFS_NAME, 0, NULL, NULL);
|
||||
Our_Proc_File = proc_create(PROCFS_NAME,0644,NULL,&proc_file_fops);
|
||||
if(NULL==Our_Proc_File)
|
||||
{
|
||||
proc_remove(Our_Proc_File);
|
||||
printk(KERN_ALERT "Error:Could not initialize /proc/%s\n",PROCFS_NAME);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (Our_Proc_File == NULL) {
|
||||
remove_proc_entry(PROCFS_NAME, NULL);
|
||||
printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",
|
||||
PROCFS_NAME);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
Our_Proc_File->read_proc = procfile_read;
|
||||
Our_Proc_File->write_proc = procfile_write;
|
||||
Our_Proc_File->mode = S_IFREG | S_IRUGO;
|
||||
Our_Proc_File->uid = 0;
|
||||
Our_Proc_File->gid = 0;
|
||||
Our_Proc_File->size = 37;
|
||||
|
||||
printk(KERN_INFO "/proc/%s created\n", PROCFS_NAME);
|
||||
return 0; /* everything is ok */
|
||||
printk(KERN_INFO "/proc/%s created\n", PROCFS_NAME);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1335,8 +1323,8 @@ int init_module()
|
||||
*/
|
||||
void cleanup_module()
|
||||
{
|
||||
remove_proc_entry(PROCFS_NAME, NULL);
|
||||
printk(KERN_INFO "/proc/%s removed\n", PROCFS_NAME);
|
||||
proc_remove(Our_Proc_File);
|
||||
printk(KERN_INFO "/proc/%s removed\n", PROCFS_NAME);
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
|
||||
Reference in New Issue
Block a user