From f6ce526080d307e752c1feeafc3f7ea39c9dffa4 Mon Sep 17 00:00:00 2001 From: jkim Date: Mon, 4 Dec 2006 22:46:09 +0000 Subject: MFP4: 109653 Linux mknod(2) can open any files, not just char/block or fifo files. This fixes Linux Test Project test cases mknod01, mknod07 and mknod09. --- sys/compat/linux/linux_misc.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) (limited to 'sys/compat/linux/linux_misc.c') diff --git a/sys/compat/linux/linux_misc.c b/sys/compat/linux/linux_misc.c index 10b0ad0..4511cfe 100644 --- a/sys/compat/linux/linux_misc.c +++ b/sys/compat/linux/linux_misc.c @@ -890,11 +890,34 @@ linux_mknod(struct thread *td, struct linux_mknod_args *args) printf(ARGS(mknod, "%s, %d, %d"), path, args->mode, args->dev); #endif - if (S_ISFIFO(args->mode)) + switch (args->mode & S_IFMT) { + case S_IFIFO: + case S_IFSOCK: error = kern_mkfifo(td, path, UIO_SYSSPACE, args->mode); - else + break; + + case S_IFCHR: + case S_IFBLK: error = kern_mknod(td, path, UIO_SYSSPACE, args->mode, args->dev); + break; + + case S_IFDIR: + error = EPERM; + break; + + case 0: + args->mode |= S_IFREG; + /* fall through */ + case S_IFREG: + error = kern_open(td, path, UIO_SYSSPACE, + O_WRONLY | O_CREAT | O_TRUNC, args->mode); + break; + + default: + error = EINVAL; + break; + } LFREEPATH(path); return (error); } -- cgit v1.1