Энциклопедия разработчика модулей ядра Linux | страница 34
> * would work in any case. */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> for(i=0; i<_NSIG_WORDS && !is_sig; i++) is_sig = current->signal.sig[i] & current->blocked.sig[i];
> if (is_sig) {
>#else
> if (current->signal & current->blocked) {
>#endif
> /* It's important to put MOD_DEC_USE_COUNT here,
> * because for processes where the open is
> * interrupted there will never be a corresponding
> * close. If we don't decrement the usage count
> * here, we will be left with a positive usage
> * count which we'll have no way to bring down to
> * zero, giving us an immortal module, which can
> * only be killed by rebooting the machine. */
> MOD_DEC_USE_COUNT;
> return -EINTR;
> }
> }
> /* If we got here, Already_Open must be zero */
> /* Open the file */
> Already_Open = 1;
> return 0; /* Allow the access */
>}
>/* Called when the /proc file is closed */
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
>int module_close(struct inode *inode, struct file *file)
>#else
>void module_close(struct inode *inode, struct file *file)
>#endif
>{
> /* Set Already_Open to zero, so one of the processes
> * in the WaitQ will be able to set Already_Open back
> * to one and to open the file. All the other processes
> * will be called when Already_Open is back to one, so
> * they'll go back to sleep. */
> Already_Open = 0;
> /* Wake up all the processes in WaitQ, so if anybody
> * is waiting for the file, they can have it. */
> module_wake_up(&WaitQ);
> MOD_DEC_USE_COUNT;
>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
> return 0; /* success */
>#endif
>}
>/* This function decides whether to allow an operation
>* (return zero) or not allow it (return a non-zero
>* which indicates why it is not allowed).
>*
>* The operation can be one of the following values:
>* 0 - Execute (run the "file" - meaningless in our case)
>* 2 - Write (input to the kernel module)
>* 4 - Read (output from the kernel module)
>*
>* This is the real function that checks file
>* permissions. The permissions returned by ls -l are
>* for referece only, and can be overridden here. */
>static int module_permission(struct inode *inode, int op) {
> /* We allow everybody to read from our module, but
> * only root (uid 0) may write to it */
> if (op == 4 || (op == 2 && current->euid == 0)) return 0;
> /* If it's anything else, access is denied */
> return -EACCES;
>}
>/* Structures to register as the /proc file, with
>* pointers to all the relevant functions. *********** */
>/* File operations for our proc file. This is where