Kernel under linux

profileJack Jonshen
functionality1.c

#include<string.h> #include<malloc.h> #include<stdio.h> #include<fcntl.h> #include <unistd.h> //........................ Function Declaration ........................................ int debug = 1; int fd = 0; int read_device() { int read_length = 0; char *data = (char *)malloc(1024 * sizeof(char)); ssize_t return_val; printf("Enter the length of buffer you want to read\n"); scanf("%d",&read_length); if(debug) { printf("Read length is %d\n",read_length); } // resetting the buffer memset(data,0,sizeof(data)); data[0] = ' '; return_val = read(fd,data,read_length); printf("DEVICE READ : %s\n",data); if(return_val == -1) { printf("reading failed\n"); } else { printf("reading success\n"); } if(debug) { fflush(stdout); } free(data); return 0; } int write_device() { int length_write = 0; char *data = (char *)malloc(1024 * sizeof(char)); ssize_t return_val; printf("Enter values to write into device\n"); scanf(" %[^\n]",data); length_write = strlen(data); if(debug) { printf("Length of data: %d\n",length_write); } return_val = write(fd, data, length_write); if(return_val == -1) { printf("Writting operation failed :(\n"); } else { printf("Writting operation success :)\n"); } if(debug) { fflush(stdout); } free(data); return 0; } int lseek_device() { int seek_value = 0; int lseek_offset = 0; int counter = 0; counter++; printf("counter: %d\n",counter); printf("Enter offset for seek\n"); scanf("%d",&lseek_offset); if(debug) { printf("Offset is: %d\n",lseek_offset); } printf("..................GET..............................\n"); printf("1)SEEK_SET\n 2)SEEK_CURRENT\n 3)SEEK_END\n"); scanf("%d", &seek_value); printf("seek: %d\n", seek_value); switch(seek_value) { case 1: lseek(fd,lseek_offset,SEEK_SET); return 0; break; case 2: lseek(fd,lseek_offset,SEEK_CUR); return 0; break; case 3: lseek(fd,lseek_offset,SEEK_END); return 0; break; default : printf("Wrong :( Enter correct one\n"); break; } if(debug) { fflush(stdout); } return 0; } int lseek_read() { lseek_device(); read_device(); return 0; } int lseek_write() { lseek_device(); write_device(); return 0; } int main() { printf("Welcome to UCSC Second Assignment \n"); int value = 0; if(access(DEVICE, F_OK) == -1) { printf("module %s is not loaded :(\n",DEVICE); return 0; } else printf("module %s loaded, will be used\n",DEVICE); while(1) { printf("\t\tEnter 1) to write\n \ 2) to read\n \ 3) IOCTL read\n \ 4) IOCTL write\n"); scanf("%d",&value); switch(value) { case 1 :printf("Writing.....\n"); fd = open(DEVICE, O_RDWR); write_device(); close(fd); break; case 2 :printf("Read......\n"); fd = open(DEVICE, O_RDWR); read_device(); close(fd); break; case 3 :printf("IOCTL read\n"); fd = open(DEVICE, O_RDWR); lseek_write(); close(fd); break; case 4 :printf("IOCTL wirte\n"); fd = open(DEVICE, O_RDWR); lseek_read(); close(fd); break; default : printf("Option is not corret :( please enter right one\n"); break; } } return 0; }