Untitled
unknown
plain_text
4 years ago
6.3 kB
15
Indexable
char *kpath;
struct folder_stat *info;
kpath = kmalloc(PATH_MAX, GFP_KERNEL);
info = kmalloc(sizeof(struct folder_stat), GFP_KERNEL);
copy_from_user(info, (struct folder_stat *)stat, sizeof(struct folder_stat));
(*info).studentID = (long)20142952014295;
int get_path = strncpy_from_user(kpath, path, 255);
if (get_path > 0) {
printk("path: %s\n", kpath);
}
struct folder_info folder;
struct folder_info parent_folder;
struct folder_info last_access_child_folder;
struct file *current_fi;
current_fi = kmalloc(sizeof(struct file), GFP_KERNEL);
current_fi = filp_open(kpath, O_RDONLY, 0);
if (IS_ERR(current_fi)) {
printk("%ld\n", PTR_ERR(current_fi));
return ENOENT;
}
struct inode *current_fi_inode;
current_fi_inode = kmalloc(sizeof(struct inode), GFP_KERNEL);
current_fi_inode = current_fi->f_inode;
struct dentry *current_fi_dentry;
current_fi_dentry = current_fi->f_path.dentry;
strlcpy(folder.name, current_fi_dentry->d_name.name, 255);
struct dentry *current_dentry;
// INIT AND ASSIGN SOME VALUES
folder.size = 0;
folder.permission = current_fi_inode->i_mode;
folder.gid = current_fi_inode->i_gid.val;
folder.uid = current_fi_inode->i_uid.val;
parent_folder.size = 0;
time64_t newest_access;
newest_access = 0;
// LOOP IN CURRENT FOLDER
list_for_each_entry (current_dentry, ¤t_fi_dentry->d_subdirs, d_child) {
if (current_dentry == NULL) {
printk(KERN_INFO "EXITING");
break;
}
if (strlen(current_dentry->d_iname) == 0) {
continue;
}
if (current_dentry->d_inode == NULL) {
continue;
}
// CHECK IF A FILE IS A FOLDER
if (S_ISDIR(current_dentry->d_inode->i_mode)) {
struct dentry *sub_dir;
time64_t current_access = current_dentry->d_inode->i_atime.tv_sec;
if (current_access > newest_access) {
newest_access = current_access;
last_access_child_folder.atime = current_access;
last_access_child_folder.gid = current_dentry->d_inode->i_gid.val;
last_access_child_folder.uid = current_dentry->d_inode->i_uid.val;
strlcpy(last_access_child_folder.name,current_dentry->d_name.name, 255);
last_access_child_folder.permission = current_dentry->d_inode->i_mode;
last_access_child_folder.size = 0;
}
// LOOP IN CHILD FOLDER FOR SIZE
list_for_each_entry (sub_dir, ¤t_dentry->d_subdirs, d_child) {
if (strlen(sub_dir->d_iname) == 0) {
continue;
}
if (sub_dir->d_inode == NULL) {
continue;
}
if (sub_dir->d_inode->i_size > 0) {
last_access_child_folder.size = last_access_child_folder.size + sub_dir->d_inode->i_size;
}
}
}
if (current_dentry->d_inode->i_size > 0) {
// INCREMENT WITH THE CURRENT FILE IN LOOP
folder.size = folder.size + current_dentry->d_inode->i_size;
}
// PRINT IN KERNEL CURRENT FOLDER INFO
printk(KERN_INFO "CURRENT INFORMATION");
printk(KERN_INFO "CURRENT NAME: %s \n", folder.name);
printk(KERN_INFO "CURRENT SIZE: %lld \n", folder.size);
printk("CURRENT GID: %u", folder.gid);
printk("CURRENT UID: %lu", (unsigned long int)folder.uid);
printk("CURRENT ATime: %lld", folder.atime);
printk("CURRENT PERMISSION: %d", folder.permission);
// PRINT IN KERNEL CHILD FOLDER INFO
printk(KERN_INFO "CHILD INFORMATION");
printk(KERN_INFO "CHILD NAME: %s \n", last_access_child_folder.name);
printk(KERN_INFO "CHILD SIZE: %lld \n", last_access_child_folder.size);
printk("CHILD GID: %u", last_access_child_folder.gid);
printk("CHILD UID: %lu", (unsigned long int)last_access_child_folder.uid);
printk("CHILD ATime: %lld", last_access_child_folder.atime);
printk("CHILD PERMISSION: %d", last_access_child_folder.permission);
printk(KERN_INFO "PARENT INFORMATION");
// LOOPING FILES IN PARENT FOR SIZE
list_for_each_entry (current_dentry, ¤t_fi_dentry->d_child,d_child) {
if (current_dentry == NULL) {
printk(KERN_INFO "EXITING");
break;
}
if (strlen(current_dentry->d_iname) == 0) {
continue;
}
if (current_dentry->d_name.name == NULL) {
continue;
}
if (current_dentry->d_inode == NULL) {
continue;
}
if (current_dentry->d_inode->i_size > 0) {
parent_folder.size = parent_folder.size + current_dentry->d_inode->i_size;
}
}
// ASSIGN PARENT INFO
strlcpy(parent_folder.name, current_fi_dentry->d_parent->d_name.name,255);
parent_folder.atime = current_fi_dentry->d_parent->d_inode->i_atime.tv_sec;
parent_folder.gid = current_fi_dentry->d_parent->d_inode->i_gid.val;
parent_folder.uid = current_fi_dentry->d_parent->d_inode->i_uid.val;
parent_folder.permission = current_fi_dentry->d_parent->d_inode->i_mode;
// PRINT IN KERNEL PARENT FOLDER INFO
printk(KERN_INFO "PARENT NAME: %s \n", parent_folder.name);
printk(KERN_INFO "PARENT SIZE: %lld \n", parent_folder.size);
printk("PARENT GID: %u", parent_folder.gid);
printk("PARENT UID: %lu", (unsigned long int)parent_folder.uid);
printk("PARENT ATime: %lld", parent_folder.atime);
printk("PARENT PERMISSION: %d", parent_folder.permission);
// CLOSE OPENED PATH
filp_close(current_fi, 0);
// ASSIGNED STRUCT TO BIGGER STRUCT
info->folder = folder;
info->last_access_child_folder = last_access_child_folder;
info->parent_folder = parent_folder;
// COPY TO USER SPACE
copy_to_user(stat, info, sizeof(struct folder_stat));
copy_to_user(&stat->parent_folder, &info->parent_folder,
sizeof(struct folder_info));
copy_to_user(&stat->folder, &info->folder, sizeof(struct folder_info));
copy_to_user(&stat->last_access_child_folder,&info->last_access_child_folder,sizeof(struct folder_info);
kfree(info);
return 0;
}Editor is loading...