This source file includes following definitions.
- proc_follow_link
- proc_readlink
1
2
3
4
5
6
7
8
9 #include <asm/segment.h>
10
11 #include <linux/errno.h>
12 #include <linux/sched.h>
13 #include <linux/fs.h>
14 #include <linux/minix_fs.h>
15 #include <linux/stat.h>
16
17 static int proc_readlink(struct inode *, char *, int);
18 static int proc_follow_link(struct inode *, struct inode *, int, int, struct inode **);
19
20
21
22
23 struct inode_operations proc_link_inode_operations = {
24 NULL,
25 NULL,
26 NULL,
27 NULL,
28 NULL,
29 NULL,
30 NULL,
31 NULL,
32 NULL,
33 NULL,
34 proc_readlink,
35 proc_follow_link,
36 NULL,
37 NULL
38 };
39
40 static int proc_follow_link(struct inode * dir, struct inode * inode,
41 int flag, int mode, struct inode ** res_inode)
42 {
43 unsigned int pid, ino;
44 struct task_struct * p;
45 int i;
46
47 *res_inode = NULL;
48 if (dir)
49 iput(dir);
50 if (!inode)
51 return -ENOENT;
52 ino = inode->i_ino;
53 pid = ino >> 16;
54 ino &= 0x0000ffff;
55 iput(inode);
56 for (i = 0 ; i < NR_TASKS ; i++)
57 if ((p = task[i]) && p->pid == pid)
58 break;
59 if (i >= NR_TASKS)
60 return -ENOENT;
61 inode = NULL;
62 switch (ino) {
63 case 4:
64 inode = p->pwd;
65 break;
66 case 5:
67 inode = p->root;
68 break;
69 case 6:
70 inode = p->executable;
71 break;
72 default:
73 switch (ino >> 8) {
74 case 1:
75 ino &= 0xff;
76 if (ino < NR_OPEN && p->filp[ino])
77 inode = p->filp[ino]->f_inode;
78 break;
79 case 2:
80 ino &= 0xff;
81 if (ino < p->numlibraries)
82 inode = p->libraries[ino].library;
83 }
84 }
85 if (!inode)
86 return -ENOENT;
87 *res_inode = inode;
88 inode->i_count++;
89 return 0;
90 }
91
92 static int proc_readlink(struct inode * inode, char * buffer, int buflen)
93 {
94 int i;
95
96 iput(inode);
97 if (buflen > 3)
98 buflen = 3;
99 i = 0;
100 while (i++ < buflen)
101 put_fs_byte('-',buffer++);
102 return i;
103 }