summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authorjkim <jkim@FreeBSD.org>2006-12-04 22:46:09 +0000
committerjkim <jkim@FreeBSD.org>2006-12-04 22:46:09 +0000
commitf6ce526080d307e752c1feeafc3f7ea39c9dffa4 (patch)
treefc1bef3488a7a4a9059e6c9d2c2300bdb5d06720 /sys/compat
parent00066d507ee6fa277d9494eae0695cbdf750f9d8 (diff)
downloadFreeBSD-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.c27
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);
}
OpenPOWER on IntegriCloud