summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjdike <jdike>2003-01-20 23:28:12 +0000
committerjdike <jdike>2003-01-20 23:28:12 +0000
commit0e18de57e44e958fcb786d59b96e67be0f6fab9d (patch)
tree1594a9da9aae166ced0c4bc8e2fea21a2af19f68
parentd5a4e45d65c8e242fb1317be2eb6dd6091810ca0 (diff)
downloaduml-history-0e18de57e44e958fcb786d59b96e67be0f6fab9d.tar.gz
Added /proc/<pid> filtering.
-rw-r--r--arch/um/fs/hppfs/hppfs_kern.c40
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));