1
0
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:
Bob Mottram
2016-03-08 15:43:13 +00:00
parent 74b4798d6d
commit e986da507b
2 changed files with 71 additions and 95 deletions

View File

@@ -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">&lt;linux/kernel.h&gt;</span>
<span class="org-preprocessor">#include</span> <span class="org-string">&lt;linux/proc_fs.h&gt;</span>
<span class="org-preprocessor">#include</span> <span class="org-string">&lt;asm/uaccess.h&gt;</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-&gt;f_path.dentry-&gt;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-&gt;f_path.dentry-&gt;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 &gt; 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-&gt;f_path.dentry-&gt;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 &gt; PROCFS_MAX_SIZE ) {
procfs_buffer_size = len;
<span class="org-keyword">if</span> (procfs_buffer_size &gt; 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>,&amp;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-&gt;read_proc = procfile_read;
Our_Proc_File-&gt;write_proc = procfile_write;
Our_Proc_File-&gt;mode = S_IFREG | S_IRUGO;
Our_Proc_File-&gt;uid = 0;
Our_Proc_File-&gt;gid = 0;
Our_Proc_File-&gt;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>

View File

@@ -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