[ Pobierz całość w formacie PDF ]
.*//* Get the parameter given to ioctl by the process */temp = (char *) ioctl_param;/* Find the length of the message */#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)get_user(ch, temp);for (i=0; ch && i= KERNEL_VERSION(2,2,0)i = device_read(file, (char *) ioctl_param, 99, 0);#elsei = device_read(inode, file, (char *) ioctl_param,99);#endif/* Warning - we assume here the buffer length is* 100.If it s less than that we might overflow* the buffer, causing the process to core dump.** The reason we only allow up to 99 characters is* that the NULL which terminates the string also* needs room.*//* Put a zero at the end of the buffer, so it* will be properly terminated */put_user( \0 , (char *) ioctl_param+i);break;case IOCTL_GET_NTH_BYTE:/* This ioctl is both input (ioctl_param) and* output (the return value of this function) */return Message[ioctl_param];break;}return SUCCESS;}/* Module Declarations *************************** *//* This structure will hold the functions to be called* when a process does something to the device we* created.Since a pointer to this structure is kept in* the devices table, it can t be local to* init_module.NULL is for unimplemented functions.*/struct file_operations Fops = {NULL, /* seek */device_read,device_write,NULL, /* readdir */NULL, /* select */device_ioctl, /* ioctl */NULL, /* mmap */device_open,#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)NULL, /* flush */#endifdevice_release /* a.k.a.close */};/* Initialize the module - Register the character device */int init_module(){int ret_val;/* Register the character device (atleast try) */ret_val = module_register_chrdev(MAJOR_NUM,DEVICE_NAME,&Fops);/* Negative values signify an error */if (ret_val
[ Pobierz całość w formacie PDF ]