4 * Copyright (C) 1991, 1992 Linus Torvalds
6 * /proc link-file handling code
9 #include <asm/uaccess.h>
11 #include <linux/errno.h>
12 #include <linux/sched.h>
15 #include <linux/file.h>
16 #include <linux/proc_fs.h>
17 #include <linux/stat.h>
19 static int proc_readlink(struct dentry
*, char *, int);
20 static struct dentry
* proc_follow_link(struct dentry
*, struct dentry
*, unsigned int);
23 * links can't do much...
25 static struct file_operations proc_fd_link_operations
= {
26 NULL
, /* lseek - default */
27 NULL
, /* read - bad */
28 NULL
, /* write - bad */
29 NULL
, /* readdir - bad */
30 NULL
, /* poll - default */
31 NULL
, /* ioctl - default */
33 NULL
, /* very special open code */
35 NULL
, /* no special release code */
36 NULL
/* can't fsync */
39 struct inode_operations proc_link_inode_operations
= {
40 &proc_fd_link_operations
,/* file-operations */
50 proc_readlink
, /* readlink */
51 proc_follow_link
, /* follow_link */
57 proc_permission
, /* permission */
62 static struct dentry
* proc_follow_link(struct dentry
*dentry
,
66 struct inode
*inode
= dentry
->d_inode
;
67 struct task_struct
*p
;
68 struct dentry
* result
;
72 /* We don't need a base pointer in the /proc filesystem */
75 error
= permission(inode
, MAY_EXEC
);
76 result
= ERR_PTR(error
);
84 result
= ERR_PTR(-ENOENT
);
88 read_lock(&tasklist_lock
);
89 p
= find_task_by_pid(pid
);
90 if (p
&& p
->fs
&& p
->fs
->pwd
)
91 result
= dget(p
->fs
->pwd
);
92 read_unlock(&tasklist_lock
);
96 read_lock(&tasklist_lock
);
97 p
= find_task_by_pid(pid
);
98 if (p
&& p
->fs
&& p
->fs
->root
)
99 result
= dget(p
->fs
->root
);
100 read_unlock(&tasklist_lock
);
104 struct mm_struct
*mm
= NULL
;
105 struct vm_area_struct
* vma
;
106 read_lock(&tasklist_lock
);
107 p
= find_task_by_pid(pid
);
111 atomic_inc(&mm
->mm_users
);
112 read_unlock(&tasklist_lock
);
118 if ((vma
->vm_flags
& VM_EXECUTABLE
) &&
120 result
= dget(vma
->vm_file
->f_dentry
);
130 if (ino
& PROC_PID_FD_DIR
) {
132 struct files_struct
*files
= NULL
;
133 read_lock(&tasklist_lock
);
134 p
= find_task_by_pid(pid
);
137 read_unlock(&tasklist_lock
);
141 read_lock(&files
->file_lock
);
142 /* XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */
143 if (ino
< files
->max_fds
&&
144 (file
= files
->fd
[ino
]) && file
->f_dentry
)
145 result
= dget(file
->f_dentry
);
146 read_unlock(&p
->files
->file_lock
);
154 * This pretty-prints the pathname of a dentry,
155 * clarifying sockets etc.
157 static int do_proc_readlink(struct dentry
*dentry
, char * buffer
, int buflen
)
159 struct inode
* inode
;
160 char * tmp
= (char*)__get_free_page(GFP_KERNEL
), *path
, *pattern
;
166 /* Check for special dentries.. */
168 inode
= dentry
->d_inode
;
169 if (inode
&& IS_ROOT(dentry
)) {
170 if (S_ISSOCK(inode
->i_mode
))
171 pattern
= "socket:[%lu]";
172 if (S_ISFIFO(inode
->i_mode
))
173 pattern
= "pipe:[%lu]";
177 len
= sprintf(tmp
, pattern
, inode
->i_ino
);
180 path
= d_path(dentry
, tmp
, PAGE_SIZE
);
181 len
= tmp
+ PAGE_SIZE
- 1 - path
;
187 copy_to_user(buffer
, path
, buflen
);
188 free_page((unsigned long)tmp
);
192 static int proc_readlink(struct dentry
* dentry
, char * buffer
, int buflen
)
196 dentry
= proc_follow_link(dentry
, NULL
, 1);
197 error
= PTR_ERR(dentry
);
198 if (!IS_ERR(dentry
)) {
201 error
= do_proc_readlink(dentry
, buffer
, buflen
);