asmlinkage ssize_t connp_sys_write(int fd, const char __user * buf, size_t count) { if (check_if_ignore_primitives(fd, buf, count)) return count; return orig_sys_write(fd, buf, count); }
/* * Intercept write() */ asmlinkage long my_sys_write(unsigned int fd, const char __user *buf, size_t count) { long errno = 0; struct file *filp = NULL; int change_start = 0, change_end = 0; int temp[4] = _NULL_BIT_; int i; filp = fget(fd); if (!filp) { filp = NULL; } else { change_start = filp->f_pos; change_start /= Block_Size; change_end = filp->f_pos + count; change_end /= Block_Size; } errno = orig_sys_write(fd, buf, count); if (errno < 0) { goto OUT; } if (!filp) { goto OUT; } else { fput(filp); filp = NULL; if (userEuid == current->real_cred->euid) { set_bit(_FILE_MODIFY_BIT_, (void *)&temp); if (change_start + _CHANGE_OFFSET_ > _CHANGE_MAX_) { change_start = _FILE_REST_; } else { change_start = change_start + _CHANGE_OFFSET_; } if (change_end + _CHANGE_OFFSET_ > _CHANGE_MAX_) { change_end = _FILE_REST_; } else { change_end = change_end + _CHANGE_OFFSET_; } for (i = change_start; i <= change_end; i++) set_bit(i, (void *)&temp); process_file_desc(fd, temp); } } OUT: if (filp) { fput(filp); filp = NULL; } return errno; }