diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs.h ac/arch/um/fs/hostfs/hostfs.h --- ac_cur/arch/um/fs/hostfs/hostfs.h Fri Jun 1 20:50:46 2001 +++ ac/arch/um/fs/hostfs/hostfs.h Fri Jun 1 21:23:40 2001 @@ -4,6 +4,10 @@ #define HOSTFS_FILE 1 #define HOSTFS_DIR 2 #define HOSTFS_SYMLINK 3 +#define HOSTFS_CHARDEV 4 +#define HOSTFS_BLOCDEV 5 +#define HOSTFS_FIFO 6 +#define HOSTFS_SOCK 7 /* These are exactly the same definitions as in fs.h, but the names are * changed so that this file can be included in both kernel and user files. @@ -41,7 +45,7 @@ int *blocks_out); extern int access_file(char *path, int r, int w, int x); extern int open_file(char *path, int r, int w); -extern int file_type(const char *path); +extern int file_type(const char *path, int *rdev); extern void *open_dir(char *path, int *err_out); extern char *read_dir(void *stream, unsigned long long *pos, int *len_out); extern void close_file(void *stream); @@ -57,6 +61,7 @@ extern int unlink_file(const char *file); extern int do_mkdir(const char *file, int mode); extern int do_rmdir(const char *file); +extern int do_mknod(const char *file, int mode, int dev); extern int link_file(const char *from, const char *to); extern int do_readlink(char *file, char *buf, int size); extern int rename_file(char *from, char *to); diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs_kern.c ac/arch/um/fs/hostfs/hostfs_kern.c --- ac_cur/arch/um/fs/hostfs/hostfs_kern.c Fri Jun 1 20:50:46 2001 +++ ac/arch/um/fs/hostfs/hostfs_kern.c Fri Jun 1 21:24:46 2001 @@ -318,7 +318,7 @@ { struct inode *inode; char *name; - int type, err = 0; + int type, err = 0, rdev; inode = get_empty_inode(); if(inode == NULL) return(NULL); @@ -331,7 +331,7 @@ err = -ENOMEM; goto out; } - type = file_type(name); + type = file_type(name, &rdev); kfree(name); } else type = HOSTFS_DIR; @@ -347,6 +347,21 @@ if(type == HOSTFS_SYMLINK) inode->i_mapping->a_ops = &hostfs_link_aops; else inode->i_mapping->a_ops = &hostfs_aops; + switch (type) { + case HOSTFS_CHARDEV: + init_special_inode(inode, S_IFCHR, rdev); + break; + case HOSTFS_BLOCDEV: + init_special_inode(inode, S_IFBLK, rdev); + break; + case HOSTFS_FIFO: + init_special_inode(inode, S_IFIFO, 0); + break; + case HOSTFS_SOCK: + init_special_inode(inode, S_IFSOCK, 0); + break; + } + return(inode); out: iput(inode); @@ -481,8 +496,13 @@ int hostfs_mknod(struct inode *ino, struct dentry *dentry, int mode, int dev) { - not_implemented(); - return(-EINVAL); + char *file; + int err; + + if((file = inode_dentry_name(ino, dentry)) == NULL) return(-ENOMEM); + err = do_mknod(file, mode, dev); + kfree(file); + return(err); } int hostfs_rename(struct inode *from_ino, struct dentry *from, diff -Naur -X exclude-files ac_cur/arch/um/fs/hostfs/hostfs_user.c ac/arch/um/fs/hostfs/hostfs_user.c --- ac_cur/arch/um/fs/hostfs/hostfs_user.c Fri Jun 1 20:50:47 2001 +++ ac/arch/um/fs/hostfs/hostfs_user.c Fri Jun 1 21:25:29 2001 @@ -41,13 +41,18 @@ return(0); } -int file_type(const char *path) +int file_type(const char *path, int *rdev) { struct stat buf; if(lstat(path, &buf) < 0) return(-errno); + *rdev = buf.st_rdev; if(S_ISDIR(buf.st_mode)) return(HOSTFS_DIR); else if(S_ISLNK(buf.st_mode)) return(HOSTFS_SYMLINK); + else if(S_ISCHR(buf.st_mode)) return(HOSTFS_CHARDEV); + else if(S_ISBLK(buf.st_mode)) return(HOSTFS_BLOCDEV); + else if(S_ISFIFO(buf.st_mode)) return(HOSTFS_FIFO); + else if(S_ISSOCK(buf.st_mode)) return(HOSTFS_SOCK); else return(HOSTFS_FILE); } @@ -252,6 +257,15 @@ int err; err = rmdir(file); + if(err) return(-errno); + return(0); +} + +int do_mknod(const char *file, int mode, int dev) +{ + int err; + + err = mknod(file, mode, dev); if(err) return(-errno); return(0); } diff -Naur -X exclude-files ac_cur/arch/um/kernel/user_syms.c ac/arch/um/kernel/user_syms.c --- ac_cur/arch/um/kernel/user_syms.c Fri Jun 1 20:50:47 2001 +++ ac/arch/um/kernel/user_syms.c Fri Jun 1 21:25:44 2001 @@ -74,6 +74,7 @@ EXPORT_SYMBOL(utime); EXPORT_SYMBOL(chmod); EXPORT_SYMBOL(rename); +EXPORT_SYMBOL(__xmknod); EXPORT_SYMBOL(symlink); EXPORT_SYMBOL(link);