root/fs/proc/link.c

/* [previous][next][first][last][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. proc_follow_link
  2. proc_readlink

   1 /*
   2  *  linux/fs/proc/link.c
   3  *
   4  *  Copyright (C) 1991, 1992  Linus Torvalds
   5  *
   6  *  /proc link-file handling code
   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  * links can't do much...
  22  */
  23 struct inode_operations proc_link_inode_operations = {
  24         NULL,                   /* no file-operations */
  25         NULL,                   /* create */
  26         NULL,                   /* lookup */
  27         NULL,                   /* link */
  28         NULL,                   /* unlink */
  29         NULL,                   /* symlink */
  30         NULL,                   /* mkdir */
  31         NULL,                   /* rmdir */
  32         NULL,                   /* mknod */
  33         NULL,                   /* rename */
  34         proc_readlink,          /* readlink */
  35         proc_follow_link,       /* follow_link */
  36         NULL,                   /* bmap */
  37         NULL                    /* truncate */
  38 };
  39 
  40 static int proc_follow_link(struct inode * dir, struct inode * inode,
     /* [previous][next][first][last][top][bottom][index][help] */
  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)
     /* [previous][next][first][last][top][bottom][index][help] */
  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 }

/* [previous][next][first][last][top][bottom][index][help] */