patch-2.3.27 linux/fs/proc/fd.c
Next file: linux/fs/proc/inode-alloc.txt
Previous file: linux/fs/proc/base.c
Back to the patch index
Back to the overall index
- Lines: 200
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.3.26/linux/fs/proc/fd.c
- Orig date:
Mon Oct 4 15:49:30 1999
diff -u --recursive --new-file v2.3.26/linux/fs/proc/fd.c linux/fs/proc/fd.c
@@ -1,199 +0,0 @@
-/*
- * linux/fs/proc/fd.c
- *
- * Copyright (C) 1991, 1992 Linus Torvalds
- *
- * proc fd directory handling functions
- *
- * 01-May-98 Edgar Toernig <froese@gmx.de>
- * Added support for more than 256 fds.
- * Limit raised to 32768.
- */
-
-#include <linux/errno.h>
-#include <linux/sched.h>
-#include <linux/file.h>
-#include <linux/proc_fs.h>
-#include <linux/stat.h>
-
-#include <asm/uaccess.h>
-
-static int proc_readfd(struct file *, void *, filldir_t);
-static struct dentry *proc_lookupfd(struct inode *, struct dentry *);
-
-static struct file_operations proc_fd_operations = {
- NULL, /* lseek - default */
- NULL, /* read - bad */
- NULL, /* write - bad */
- proc_readfd, /* readdir */
- NULL, /* poll - default */
- NULL, /* ioctl - default */
- NULL, /* mmap */
- NULL, /* no special open code */
- NULL, /* flush */
- NULL, /* no special release code */
- NULL /* can't fsync */
-};
-
-/*
- * proc directories can do almost nothing..
- */
-struct inode_operations proc_fd_inode_operations = {
- &proc_fd_operations, /* default base directory file-ops */
- NULL, /* create */
- proc_lookupfd, /* lookup */
- NULL, /* link */
- NULL, /* unlink */
- NULL, /* symlink */
- NULL, /* mkdir */
- NULL, /* rmdir */
- NULL, /* mknod */
- NULL, /* rename */
- NULL, /* readlink */
- NULL, /* follow_link */
- NULL, /* get_block */
- NULL, /* readpage */
- NULL, /* writepage */
- NULL, /* flushpage */
- NULL, /* truncate */
- proc_permission, /* permission */
- NULL, /* smap */
- NULL /* revalidate */
-};
-
-/*
- * NOTE! Normally we'd indicate that a file does not
- * exist by creating a negative dentry and returning
- * a successful return code. However, for this case
- * we do not want to create negative dentries, because
- * the state of the world can change behind our backs.
- *
- * Thus just return -ENOENT instead.
- */
-static struct dentry *proc_lookupfd(struct inode * dir, struct dentry * dentry)
-{
- unsigned int ino, pid, fd, c;
- struct task_struct * p;
- struct file * file;
- struct inode *inode;
- const char *name;
- int len, err;
-
- err = -ENOENT;
- ino = dir->i_ino;
- pid = ino >> 16;
- ino &= 0x0000ffff;
-
- if (!pid || ino != PROC_PID_FD)
- goto out;
-
- fd = 0;
- len = dentry->d_name.len;
- name = dentry->d_name.name;
- if (len > 1 && *name == '0') goto out;
- while (len-- > 0) {
- c = *name - '0';
- name++;
- if (c > 9)
- goto out;
- fd *= 10;
- fd += c;
- if (fd & 0xffff8000)
- goto out;
- }
-
- read_lock(&tasklist_lock);
- file = NULL;
- p = find_task_by_pid(pid);
- if (p && p->files)
- file = fcheck_task(p, fd);
- read_unlock(&tasklist_lock);
-
- /*
- * File handle is invalid if it is out of range, if the process
- * has no files (Zombie) if the file is closed, or if its inode
- * is NULL
- */
-
- if (!file)
- goto out;
-
- ino = (pid << 16) + PROC_PID_FD_DIR + fd;
- inode = proc_get_inode(dir->i_sb, ino, NULL);
- if (inode) {
- dentry->d_op = &proc_dentry_operations;
- d_add(dentry, inode);
- return NULL;
- }
-out:
- return ERR_PTR(err);
-}
-
-#define NUMBUF 10
-
-static int proc_readfd(struct file * filp, void * dirent, filldir_t filldir)
-{
- struct inode *inode = filp->f_dentry->d_inode;
- struct task_struct *p, *tmp;
- unsigned int fd, pid, ino;
- int retval;
- char buf[NUMBUF];
-
- retval = 0;
- ino = inode->i_ino;
- pid = ino >> 16;
- ino &= 0x0000ffff;
- if (ino != PROC_PID_FD)
- goto out;
-
- for (fd = filp->f_pos; fd < 2; fd++, filp->f_pos++) {
- ino = inode->i_ino;
- if (fd)
- ino = (ino & 0xffff0000) | PROC_PID_INO;
- if (filldir(dirent, "..", fd+1, fd, ino) < 0)
- goto out;
- }
-
- read_lock(&tasklist_lock);
- p = find_task_by_pid(pid);
- if (!p)
- goto out_unlock;
-
- for (fd -= 2 ; p->files && fd < p->files->max_fds; fd++, filp->f_pos++)
- {
- unsigned int i,j;
-
- if (!fcheck_task(p, fd))
- continue;
-
- j = NUMBUF;
- i = fd;
- do {
- j--;
- buf[j] = '0' + (i % 10);
- i /= 10;
- } while (i);
-
- /* Drop the task lock, as the filldir function may block */
- read_unlock(&tasklist_lock);
-
- ino = (pid << 16) + PROC_PID_FD_DIR + fd;
- if (filldir(dirent, buf+j, NUMBUF-j, fd+2, ino) < 0)
- goto out;
-
- read_lock(&tasklist_lock);
- /*
- * filldir() might have slept, so we must
- * re-validate "p". This is fast enough due
- * to the pidhash
- */
- tmp = find_task_by_pid(pid);
- if (p != tmp)
- break;
- }
-out_unlock:
- read_unlock(&tasklist_lock);
-
-out:
- return retval;
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)