// Prints out all open file descriptors static void print_fds(struct pid_info_t* info) { int fd; struct linux_dirent64 *dirp; struct linux_dirent64 buf[BUF_MAX]; int num; static char* fd_path = "fd/"; int previous_length ; strncat(info->path, fd_path, sizeof(info->path)); previous_length = info->parent_length; info->parent_length += strlen(fd_path); fd = sys_open(info->path, O_RDONLY, 0); if (fd >= 0) { dirp = buf; num = sys_getdents64(fd, dirp, sizeof(buf)); while (num > 0) { while (num > 0) { if ( strcmp(dirp->d_name, ".") && strcmp(dirp->d_name, "..")) print_type(dirp->d_name, info); num -= dirp->d_reclen; dirp = (void *)dirp + dirp->d_reclen; } dirp = buf; memset(buf, 0, sizeof(buf)); num = sys_getdents64(fd, dirp, sizeof(buf)); } } sys_close(fd); info->parent_length = previous_length; info->path[info->parent_length] = '\0'; }
long hio_getdents64(unsigned int fd, struct linux_dirent64 __user *dirent, unsigned int count) { if ( (!syscall_isset(__NR_getdents64, current->aspace->hio_syscall_mask)) || (fdTableFile(current->fdTable, fd)) ) return sys_getdents64(fd, dirent, count); return hio_format_and_exec_syscall(__NR_getdents64, 3, fd, dirent, count); }
void sec_disp_lsof_info(void) { int fd; unsigned long old_fs; int pid; struct linux_dirent64 *dirp; struct linux_dirent64 buf[BUF_MAX]; int num; old_fs = get_fs(); set_fs(KERNEL_DS); fd = sys_open("/proc", O_RDONLY, 0); if (fd >= 0) { print_header(); dirp = buf; num = sys_getdents64(fd, dirp, sizeof(buf)); while (num > 0) { while (num > 0) { if (nm2id(dirp->d_name, &pid)) { lsof_dumpinfo(pid); } num -= dirp->d_reclen; dirp = (void *)dirp + dirp->d_reclen; } dirp = buf; memset(buf, 0, sizeof(buf)); num = sys_getdents64(fd, dirp, sizeof(buf)); } printk(KERN_EMERG "\n"); } set_fs(old_fs); }
/* * If the dir will fit in *buf, return its length. If it won't fit, return * zero. Return -ve on error. */ static int __init do_read_dir(int fd, void *buf, int len) { long bytes, n; char *p = buf; sys_lseek(fd, 0, 0); for (bytes = 0; bytes < len; bytes += n) { n = sys_getdents64(fd, (struct linux_dirent64 *)(p + bytes), len - bytes); if (n < 0) return n; if (n == 0) return bytes; } return 0; }
/* * process READDIR command */ static void rfs_readdir(struct aipc_rfs_msg *msg) { struct aipc_rfs_dir *param = (struct aipc_rfs_dir*) msg->parameter; struct DIR *dir = (struct DIR *) param->dirp; struct linux_dirent64 *dirent = NULL; int bytes = 0; mm_segment_t oldfs = get_fs(); set_fs(KERNEL_DS); do { /* run out of the buffer, need to refill it. */ if(dir->offset >= dir->read_size ) { /* get several dirdents */ bytes = sys_getdents64(dir->fd, dir->buf, dir->buf_size); if(bytes <= 0 ) { DMSG("rfs_readdir error: %d\n", bytes); msg->parameter[0] = -1; goto done; } /* reinitial the parameter for the buffer */ dir->read_size = (unsigned int) bytes; dir->offset = 0; } dirent = (struct linux_dirent64 *) (((char *) dir->buf) + dir->offset); dir->offset += dirent->d_reclen; /* skip the deleted files */ } while(dirent->d_ino == 0); memcpy(¶m->dirent, dirent, dirent->d_reclen); msg->parameter[0] = 1; /* succesfully get information */ done: set_fs(oldfs); }