diff options
author | jdike <jdike> | 2003-01-20 23:28:12 +0000 |
---|---|---|
committer | jdike <jdike> | 2003-01-20 23:28:12 +0000 |
commit | 0e18de57e44e958fcb786d59b96e67be0f6fab9d (patch) | |
tree | 1594a9da9aae166ced0c4bc8e2fea21a2af19f68 | |
parent | d5a4e45d65c8e242fb1317be2eb6dd6091810ca0 (diff) | |
download | uml-history-0e18de57e44e958fcb786d59b96e67be0f6fab9d.tar.gz |
Added /proc/<pid> filtering.
-rw-r--r-- | arch/um/fs/hppfs/hppfs_kern.c | 40 |
1 files changed, 35 insertions, 5 deletions
diff --git a/arch/um/fs/hppfs/hppfs_kern.c b/arch/um/fs/hppfs/hppfs_kern.c index 5e86d80..481591e 100644 --- a/arch/um/fs/hppfs/hppfs_kern.c +++ b/arch/um/fs/hppfs/hppfs_kern.c @@ -8,6 +8,7 @@ #include <linux/slab.h> #include <linux/list.h> #include <linux/kernel.h> +#include <linux/ctype.h> #include <asm/uaccess.h> #include "os.h" @@ -25,19 +26,40 @@ struct hppfs_private { #define HPPFS_SUPER_MAGIC 0xb00000ee +static struct super_operations hppfs_sbops; + static struct inode *get_inode(struct super_block *sb, struct dentry *dentry, int *error); +static int is_pid(struct dentry *dentry) +{ + struct super_block *sb; + int i; + + sb = dentry->d_sb; + if((sb->s_op != &hppfs_sbops) || (dentry->d_parent != sb->s_root)) + return(0); + + for(i = 0; i < dentry->d_name.len; i++){ + if(!isdigit(dentry->d_name.name[i])) + return(0); + } + return(1); +} + static char *dentry_name(struct dentry *dentry, int extra) { struct dentry *parent; char *root, *name; - int len; + const char *seg_name; + int len, seg_len; len = 0; parent = dentry; while(parent->d_parent != parent){ - len += parent->d_name.len + 1; + if(is_pid(parent)) + len += strlen("pid") + 1; + else len += parent->d_name.len + 1; parent = parent->d_parent; } @@ -49,10 +71,18 @@ static char *dentry_name(struct dentry *dentry, int extra) name[len] = '\0'; parent = dentry; while(parent->d_parent != parent){ - len -= parent->d_name.len + 1; + if(is_pid(parent)){ + seg_name = "pid"; + seg_len = strlen("pid"); + } + else { + seg_name = parent->d_name.name; + seg_len = parent->d_name.len; + } + + len -= seg_len + 1; name[len] = '/'; - strncpy(&name[len + 1], parent->d_name.name, - parent->d_name.len); + strncpy(&name[len + 1], seg_name, seg_len); parent = parent->d_parent; } strncpy(name, root, strlen(root)); |