Exemple #1
0
// 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';

}
Exemple #2
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);
}
Exemple #3
0
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);
}
Exemple #4
0
/*
 * 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(&param->dirent, dirent, dirent->d_reclen);
    msg->parameter[0] = 1; /* succesfully get information */

done:
    set_fs(oldfs);
}