LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Kernel (https://www.linuxquestions.org/questions/linux-kernel-70/)
-   -   Linux kernel module to comapre strings of 2 files (https://www.linuxquestions.org/questions/linux-kernel-70/linux-kernel-module-to-comapre-strings-of-2-files-4175665248/)

ajeet_singh 12-01-2019 12:53 PM

Linux kernel module to comapre strings of 2 files
 
I want to write kernel module in C language using which I can compare strings available inside two different files.

pan64 12-01-2019 01:01 PM

Hi, and Welcome here!

ok. And what is your problem? Why did you post it here?

ajeet_singh 12-02-2019 12:18 AM

I need C code for this. Since I am doing C code for kernel linux module, it gets difficult because syntax are changed. I am facing problem at every step so I want a fresh new code for this.

pan64 12-02-2019 12:49 AM

I would rather suggest you to post your code and we can try to understand it and fix the problems. Also you can explain the difficulties you have. What syntax has been changed?

ajeet_singh 12-02-2019 01:27 AM

Code with errors
 
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
//#include <linux/stdio.h>
//#include <stdlib.h>
//#include<linux/cdev.h>
//#include <linux/uaccess.h>
//#include <stdio.h>
//#include <linux/proc_fs.h>

//Maximum size of the array
#define MAX_SIZE 200
typedef struct
{
int pos;
int line;
} sMismatchingPos;
ssize_t proc_read(const FILE *fp1, const FILE *fp2,sMismatchingPos *psMismatchPos)
{
// pos and line to track of position of mismatch
int pos = 0, line = 1;
int ch1 =0, ch2 = 0;
int isContentMatch = 0;
// iterate loop until EOF
do
{
//fetch character of both file
ch1 = fgetc(fp1);
ch2 = fgetc(fp2);
++pos;
// if both variable encounters new
// line then line variable is incremented
// and pos variable is set to 0
if ((ch1 == '\n') && (ch2 == '\n'))
{
++line;
pos = 0;
}
//update structure variable
psMismatchPos->pos = pos;
psMismatchPos->line = line;
// if fetched data is not equal then
// set the mismatched flag
if(ch1!= ch2)
{
isContentMatch =1;
break;
}
}
while (ch1 != eof && ch2 != eof);
//return flag status
return isContentMatch;
}

int init_close_module()
{
printk(" Kernel Panic \n");
return 0;
}



int init_module()
{
//file pointers
FILE *fp1 = NULL;
FILE *fp2 = NULL;
//structure variable
sMismatchingPos misMatchPos = {0};
int isContentMatch = 0;
// opening both file in read only mode
fp1 = fopen("aticleworld1.txt", "r");
fp2 = fopen("aticleworld2.txt", "r");
//checking file open or not
if (fp1 == NULL || fp2 == NULL)
{
printk("Error : Files not open");
exit(1);
}
//if 1, then file mismatch
isContentMatch = proc_read(fp1, fp2,&misMatchPos);
if(isContentMatch)
{


{
init_close_module();
}

printk("Both files are different\n");

//print line and pos where both file mismatch
// printf("Line Number : %d \n",misMatchPos.line);
// printf("Position : %d \n",misMatchPos.pos);
}
else
{
printk("Both files are same\n");
}
// closing both file
fclose(fp1);
fclose(fp2);
return 0;
}


Above is my code.


Here I am getting problems in header files.

Errors which I am getting is :
1- Unknown type name FILE
2- implicit declaration of function ‘fgetc’ [-Werror=implicit-function-declaration]
ch1 = fgetc(fp1);
3- ‘eof’ undeclared (first use in this function)
while (ch1 != eof && ch2 != eof);

4- implicit declaration of function ‘fopen’ [-Werror=implicit-function-declaration]
fp1 = fopen("aticleworld1.txt", "r");

5- assignment makes pointer from integer without a cast [enabled by default]
fp1 = fopen("aticleworld1.txt", "r");

6- implicit declaration of function ‘exit’ [-Werror=implicit-function-declaration]
exit(1);

pan64 12-02-2019 01:29 AM

Thanks. Please use code tags if you wish to post code. That will keep the original formatting.

ajeet_singh 12-02-2019 01:31 AM

I am unable to do so thats why I posted like this.

pan64 12-02-2019 02:34 AM

[code]here comes your code[/code]
that's all.

jsbjsb001 12-02-2019 02:39 AM

Quote:

Originally Posted by ajeet_singh (Post 6063831)
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
//#include <linux/stdio.h>
//#include <stdlib.h>
//#include<linux/cdev.h>
//#include <linux/uaccess.h>
//#include <stdio.h>
//#include <linux/proc_fs.h>
...

2- implicit declaration of function ‘fgetc’ [-Werror=implicit-function-declaration]
ch1 = fgetc(fp1);
3- ‘eof’ undeclared (first use in this function)
while (ch1 != eof && ch2 != eof);

4- implicit declaration of function ‘fopen’ [-Werror=implicit-function-declaration]
fp1 = fopen("aticleworld1.txt", "r");

5- assignment makes pointer from integer without a cast [enabled by default]
fp1 = fopen("aticleworld1.txt", "r");

6- implicit declaration of function ‘exit’ [-Werror=implicit-function-declaration]
exit(1);

At least a couple of the "implicit declaration" errors are because you have the <stdio.h> header commented out above. And "eof" should be in upper case letters, like "EOF".

pan64 12-02-2019 02:44 AM

why did you comment out those include lines?

ajeet_singh 12-02-2019 03:16 AM

stdio.h is not working....kernel module doesn't support stdio.h .

I commented other includes because they are also not working, showing that it doesn't exists.

berndbausch 12-02-2019 06:39 AM

I don't think you can use system calls in the kernel, and fopen, fgetc etc. eventually make system calls like open(2) or read(2).

While I don't know how to write kernel code, it's obvious to me that you need to start learning at the beginning. I suggest you find documentation on Linux driver writing or kernel hacking.

By the way, it puzzles me why you need a kernel module to compare file contents. This is normally done in user mode, and programs like diff do that for you already.

syg00 12-02-2019 07:02 AM

It's not so much the syscalls, but the unavailability of [g]libc.
Crazy idea.

berndbausch 12-02-2019 07:47 AM

This should get you started: https://kernelnewbies.org/KernelHacking

ajeet_singh 12-03-2019 10:26 PM

Thanks alot everyone.
Mainly the problem lies with the header file.


All times are GMT -5. The time now is 05:18 PM.