diff options
author | jkim <jkim@FreeBSD.org> | 2006-12-04 22:46:09 +0000 |
---|---|---|
committer | jkim <jkim@FreeBSD.org> | 2006-12-04 22:46:09 +0000 |
commit | f6ce526080d307e752c1feeafc3f7ea39c9dffa4 (patch) | |
tree | fc1bef3488a7a4a9059e6c9d2c2300bdb5d06720 /sys/compat | |
parent | 00066d507ee6fa277d9494eae0695cbdf750f9d8 (diff) | |
download | FreeBSD-src-f6ce526080d307e752c1feeafc3f7ea39c9dffa4.zip FreeBSD-src-f6ce526080d307e752c1feeafc3f7ea39c9dffa4.tar.gz |
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.
Diffstat (limited to 'sys/compat')
-rw-r--r-- | sys/compat/linux/linux_misc.c | 27 |
1 files changed, 25 insertions, 2 deletions
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); } |