summaryrefslogtreecommitdiffstats
path: root/sys/compat
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2015-07-28 06:50:47 +0000
committered <ed@FreeBSD.org>2015-07-28 06:50:47 +0000
commit0371a98a00c2c58f50fa9a6e1bbd6c3a01f12848 (patch)
treee1f6fb4e3ee397ce6d1b34fd30366cb1452582c3 /sys/compat
parent734349761a341cf74cad5d38aa4afa0b3e4166e0 (diff)
downloadFreeBSD-src-0371a98a00c2c58f50fa9a6e1bbd6c3a01f12848.zip
FreeBSD-src-0371a98a00c2c58f50fa9a6e1bbd6c3a01f12848.tar.gz
Implement directory and FIFO creation.
The file_create() system call can be used to create files of a given type. Right now it can only be used to create directories and FIFOs. As CloudABI does not expose filesystem permissions, this system call lacks a mode argument. Simply use 0777 or 0666 depending on the file type.
Diffstat (limited to 'sys/compat')
-rw-r--r--sys/compat/cloudabi/cloudabi_file.c26
1 files changed, 24 insertions, 2 deletions
diff --git a/sys/compat/cloudabi/cloudabi_file.c b/sys/compat/cloudabi/cloudabi_file.c
index 3f917a0..72902ee 100644
--- a/sys/compat/cloudabi/cloudabi_file.c
+++ b/sys/compat/cloudabi/cloudabi_file.c
@@ -137,9 +137,31 @@ int
cloudabi_sys_file_create(struct thread *td,
struct cloudabi_sys_file_create_args *uap)
{
+ char *path;
+ int error;
- /* Not implemented. */
- return (ENOSYS);
+ error = copyin_path(uap->path, uap->pathlen, &path);
+ if (error != 0)
+ return (error);
+
+ /*
+ * CloudABI processes cannot interact with UNIX credentials and
+ * permissions. Depend on the umask that is set prior to
+ * execution to restrict the file permissions.
+ */
+ switch (uap->type) {
+ case CLOUDABI_FILETYPE_DIRECTORY:
+ error = kern_mkdirat(td, uap->fd, path, UIO_SYSSPACE, 0777);
+ break;
+ case CLOUDABI_FILETYPE_FIFO:
+ error = kern_mkfifoat(td, uap->fd, path, UIO_SYSSPACE, 0666);
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+ cloudabi_freestr(path);
+ return (error);
}
int
OpenPOWER on IntegriCloud