diff options
author | ed <ed@FreeBSD.org> | 2015-07-28 06:50:47 +0000 |
---|---|---|
committer | ed <ed@FreeBSD.org> | 2015-07-28 06:50:47 +0000 |
commit | 0371a98a00c2c58f50fa9a6e1bbd6c3a01f12848 (patch) | |
tree | e1f6fb4e3ee397ce6d1b34fd30366cb1452582c3 /sys/compat | |
parent | 734349761a341cf74cad5d38aa4afa0b3e4166e0 (diff) | |
download | FreeBSD-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.c | 26 |
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 |