|
|
1.1 ! root 1: /* ! 2: * linux/fs/proc/root.c ! 3: * ! 4: * Copyright (C) 1991, 1992 Linus Torvalds ! 5: * ! 6: * proc root directory handling functions ! 7: */ ! 8: ! 9: #include <asm/segment.h> ! 10: ! 11: #include <linux/errno.h> ! 12: #include <linux/sched.h> ! 13: #include <linux/proc_fs.h> ! 14: #include <linux/stat.h> ! 15: ! 16: static int proc_readroot(struct inode *, struct file *, struct dirent *, int); ! 17: static int proc_lookuproot(struct inode *,const char *,int,struct inode **); ! 18: ! 19: static struct file_operations proc_root_operations = { ! 20: NULL, /* lseek - default */ ! 21: NULL, /* read - bad */ ! 22: NULL, /* write - bad */ ! 23: proc_readroot, /* readdir */ ! 24: NULL, /* select - default */ ! 25: NULL, /* ioctl - default */ ! 26: NULL, /* no special open code */ ! 27: NULL /* no special release code */ ! 28: }; ! 29: ! 30: /* ! 31: * proc directories can do almost nothing.. ! 32: */ ! 33: struct inode_operations proc_root_inode_operations = { ! 34: &proc_root_operations, /* default base directory file-ops */ ! 35: NULL, /* create */ ! 36: proc_lookuproot, /* lookup */ ! 37: NULL, /* link */ ! 38: NULL, /* unlink */ ! 39: NULL, /* symlink */ ! 40: NULL, /* mkdir */ ! 41: NULL, /* rmdir */ ! 42: NULL, /* mknod */ ! 43: NULL, /* rename */ ! 44: NULL, /* readlink */ ! 45: NULL, /* follow_link */ ! 46: NULL, /* bmap */ ! 47: NULL /* truncate */ ! 48: }; ! 49: ! 50: static int proc_lookuproot(struct inode * dir,const char * name, int len, ! 51: struct inode ** result) ! 52: { ! 53: unsigned int pid, c; ! 54: int i, ino; ! 55: ! 56: *result = NULL; ! 57: if (!dir) ! 58: return -ENOENT; ! 59: if (!S_ISDIR(dir->i_mode)) { ! 60: iput(dir); ! 61: return -ENOENT; ! 62: } ! 63: pid = 0; ! 64: if (!len || (get_fs_byte(name) == '.' && (len == 1 || ! 65: (get_fs_byte(name+1) == '.' && len == 2)))) { ! 66: *result = dir; ! 67: return 0; ! 68: } ! 69: while (len-- > 0) { ! 70: c = get_fs_byte(name) - '0'; ! 71: name++; ! 72: if (c > 9) { ! 73: pid = 0; ! 74: break; ! 75: } ! 76: pid *= 10; ! 77: pid += c; ! 78: if (pid & 0xffff0000) { ! 79: pid = 0; ! 80: break; ! 81: } ! 82: } ! 83: for (i = 0 ; i < NR_TASKS ; i++) ! 84: if (task[i] && task[i]->pid == pid) ! 85: break; ! 86: if (!pid || i >= NR_TASKS) { ! 87: iput(dir); ! 88: return -ENOENT; ! 89: } ! 90: ino = (pid << 16) + 2; ! 91: if (!(*result = iget(dir->i_dev,ino))) { ! 92: iput(dir); ! 93: return -ENOENT; ! 94: } ! 95: iput(dir); ! 96: return 0; ! 97: } ! 98: ! 99: static int proc_readroot(struct inode * inode, struct file * filp, ! 100: struct dirent * dirent, int count) ! 101: { ! 102: struct task_struct * p; ! 103: unsigned int pid; ! 104: int i,j; ! 105: ! 106: if (!inode || !S_ISDIR(inode->i_mode)) ! 107: return -EBADF; ! 108: while ((pid = filp->f_pos) < NR_TASKS+2) { ! 109: filp->f_pos++; ! 110: if (pid < 2) { ! 111: i = j = pid+1; ! 112: put_fs_long(1, &dirent->d_ino); ! 113: put_fs_word(i, &dirent->d_reclen); ! 114: put_fs_byte(0, i+dirent->d_name); ! 115: while (i--) ! 116: put_fs_byte('.', i+dirent->d_name); ! 117: return j; ! 118: } ! 119: p = task[pid-2]; ! 120: if (!p || !(pid = p->pid)) ! 121: continue; ! 122: if (pid & 0xffff0000) ! 123: continue; ! 124: j = 10; ! 125: i = 1; ! 126: while (pid >= j) { ! 127: j *= 10; ! 128: i++; ! 129: } ! 130: j = i; ! 131: put_fs_long((pid << 16)+2, &dirent->d_ino); ! 132: put_fs_word(i, &dirent->d_reclen); ! 133: put_fs_byte(0, i+dirent->d_name); ! 134: while (i--) { ! 135: put_fs_byte('0'+(pid % 10), i+dirent->d_name); ! 136: pid /= 10; ! 137: } ! 138: return j; ! 139: } ! 140: return 0; ! 141: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.