From e2ec63d089524e52b2d9272680ec12d6569c5903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Leczkowski?= Date: Fri, 8 Mar 2024 13:06:38 +0100 Subject: [PATCH 1/2] phoenix: add function to fill struct _attrs errors JIRA: RTOS-792 --- Makefile | 1 + include/phoenix/attribute.h | 26 ++++++++++++++++++++++++++ phoenix/Makefile | 9 +++++++++ phoenix/attribute.c | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 include/phoenix/attribute.h create mode 100644 phoenix/Makefile create mode 100644 phoenix/attribute.c diff --git a/Makefile b/Makefile index 49625cd1..31e74b07 100644 --- a/Makefile +++ b/Makefile @@ -49,6 +49,7 @@ include misc/Makefile include net/Makefile include netinet/Makefile include posix/Makefile +include phoenix/Makefile include pthread/Makefile include regex/Makefile include signal/Makefile diff --git a/include/phoenix/attribute.h b/include/phoenix/attribute.h new file mode 100644 index 00000000..a25d8363 --- /dev/null +++ b/include/phoenix/attribute.h @@ -0,0 +1,26 @@ +/* + * Phoenix-RTOS + * + * libphoenix + * + * phoenix/attribute.h + * + * Copyright 2024 Phoenix Systems + * Author: Lukasz Leczkowski + * + * This file is part of Phoenix-RTOS. + * + * %LICENSE% + */ + +#ifndef _LIBPHOENIX_PHOENIX_ATTRIBUTE_H_ +#define _LIBPHOENIX_PHOENIX_ATTRIBUTE_H_ + + +#include + +/* Initializes `struct _attrAll` errors to `err` */ +void _phoenix_initAttrsStruct(struct _attrAll *attrs, int err); + + +#endif diff --git a/phoenix/Makefile b/phoenix/Makefile new file mode 100644 index 00000000..5d896d69 --- /dev/null +++ b/phoenix/Makefile @@ -0,0 +1,9 @@ +# +# Makefile for libphoenix/phoenix +# +# Copyright 2024 Phoenix Systems +# +# %LICENSE% +# + +OBJS += $(addprefix $(PREFIX_O)phoenix/, attribute.o) diff --git a/phoenix/attribute.c b/phoenix/attribute.c new file mode 100644 index 00000000..d19dec41 --- /dev/null +++ b/phoenix/attribute.c @@ -0,0 +1,37 @@ +/* + * Phoenix-RTOS + * + * libphoenix + * + * phoenix/attribute + * + * Copyright 2024 Phoenix Systems + * Author: Lukasz Leczkowski + * + * This file is part of Phoenix-RTOS. + * + * %LICENSE% + */ + +#include + + +void _phoenix_initAttrsStruct(struct _attrAll *attrs, int err) +{ + attrs->mode.err = err; + attrs->uid.err = err; + attrs->gid.err = err; + attrs->size.err = err; + attrs->blocks.err = err; + attrs->blocks.err = err; + attrs->ioblock.err = err; + attrs->type.err = err; + attrs->port.err = err; + attrs->pollStatus.err = err; + attrs->eventMask.err = err; + attrs->cTime.err = err; + attrs->mTime.err = err; + attrs->aTime.err = err; + attrs->links.err = err; + attrs->dev.err = err; +} From c53f4675feeb27793e2980bf4770a8b386075b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Leczkowski?= Date: Thu, 14 Mar 2024 16:26:31 +0100 Subject: [PATCH 2/2] !adapt to msg api changes JIRA: RTOS-792 --- include/sys/file.h | 2 - include/sys/ioctl.h | 13 ++-- sys/events.c | 16 ++--- sys/ioctl.c | 35 +++-------- sys/mount.c | 95 +++++++++++++++-------------- sys/socket.c | 21 ++++--- sys/stat.c | 143 ++++++++++++++++++++++++++------------------ sys/statvfs.c | 28 +++++---- sys/time.c | 35 ++++++----- unistd/dir.c | 118 ++++++++++++++++++++---------------- unistd/file.c | 128 ++++++++++++++++++++------------------- 11 files changed, 335 insertions(+), 299 deletions(-) diff --git a/include/sys/file.h b/include/sys/file.h index b9d076dc..7af28d60 100644 --- a/include/sys/file.h +++ b/include/sys/file.h @@ -32,7 +32,6 @@ enum { mtMount = 0xf50, mtUmount, mtSync, mtStat, mtMountPoint }; typedef struct { - oid_t dev; oid_t mnt; unsigned long mode; char fstype[16]; @@ -40,7 +39,6 @@ typedef struct { typedef struct { - int err; oid_t oid; } mount_o_msg_t; diff --git a/include/sys/ioctl.h b/include/sys/ioctl.h index 2e2c0a33..23c951b3 100644 --- a/include/sys/ioctl.h +++ b/include/sys/ioctl.h @@ -59,16 +59,19 @@ extern "C" { int ioctl(int fd, unsigned long cmd, ...); -const void *ioctl_unpack(const msg_t *msg, unsigned long *request, id_t *id); +const void *ioctl_unpack(msg_t *msg, unsigned long *request, id_t *id); -const void *ioctl_unpackEx(const msg_t *msg, unsigned long *request, id_t *id, void **response_buf); -pid_t ioctl_getSenderPid(const msg_t *msg); +const void *ioctl_unpackEx(msg_t *msg, unsigned long *request, id_t *id, void **response_buf); -void ioctl_setResponse(msg_t *msg, unsigned long request, int err, const void *data); +static inline pid_t ioctl_getSenderPid(const msg_t *msg) +{ + return (pid_t)msg->pid; +} -void ioctl_setResponseErr(msg_t *msg, unsigned long request, int err); + +void ioctl_setResponse(msg_t *msg, unsigned long request, int err, const void *data); #ifdef __cplusplus diff --git a/sys/events.c b/sys/events.c index d5d11623..887f905c 100644 --- a/sys/events.c +++ b/sys/events.c @@ -26,17 +26,17 @@ static struct { int eventsSend(event_t *event, int count) { - msg_t msg; int err = -ENOSYS; if (event_common.sink_open || (event_common.sink_open = (lookup("/dev/event/sink", NULL, &event_common.sink) == EOK))) { - msg.type = mtWrite; - - msg.i.io.oid = event_common.sink; - msg.i.data = event; - msg.i.size = count * sizeof(event_t); - msg.o.data = NULL; - msg.o.size = 0; + msg_t msg = { + .type = mtWrite, + .oid = event_common.sink, + .i.data = event, + .i.size = count * sizeof(event_t), + .o.data = NULL, + .o.size = 0 + }; err = msgSend(event_common.sink.port, &msg); } diff --git a/sys/ioctl.c b/sys/ioctl.c index 58400589..ad74da9b 100644 --- a/sys/ioctl.c +++ b/sys/ioctl.c @@ -27,13 +27,13 @@ #include -const void *ioctl_unpack(const msg_t *msg, unsigned long *request, id_t *id) +const void *ioctl_unpack(msg_t *msg, unsigned long *request, id_t *id) { return ioctl_unpackEx(msg, request, id, NULL); } -const void *ioctl_unpackEx(const msg_t *msg, unsigned long *request, id_t *id, void **response_buf) +const void *ioctl_unpackEx(msg_t *msg, unsigned long *request, id_t *id, void **response_buf) { size_t size; const void *data = NULL; @@ -44,7 +44,7 @@ const void *ioctl_unpackEx(const msg_t *msg, unsigned long *request, id_t *id, v } if (id != NULL) { - *id = ioctl->id; + *id = msg->oid.id; } size = IOCPARM_LEN(ioctl->request); @@ -91,9 +91,8 @@ const void *ioctl_unpackEx(const msg_t *msg, unsigned long *request, id_t *id, v } if ((response_buf != NULL) && ((ioctl->request & IOC_OUT) != 0)) { - ioctl_out_t *ioctl_out = (ioctl_out_t *)msg->o.raw; - if (size <= (sizeof(msg->o.raw) - sizeof(ioctl_out_t))) { - *response_buf = ioctl_out->data; + if (size <= sizeof(msg->o.raw)) { + *response_buf = msg->o.raw; } else { *response_buf = msg->o.data; @@ -108,24 +107,16 @@ const void *ioctl_unpackEx(const msg_t *msg, unsigned long *request, id_t *id, v } -pid_t ioctl_getSenderPid(const msg_t *msg) -{ - const ioctl_in_t *ioctl = (const ioctl_in_t *)msg->i.raw; - return (pid_t)ioctl->pid; -} - - void ioctl_setResponse(msg_t *msg, unsigned long request, int err, const void *data) { size_t size = IOCPARM_LEN(request); void *dst; - ioctl_out_t *ioctl = (ioctl_out_t *)msg->o.raw; - ioctl->err = err; + msg->o.err = err; if (((request & IOC_OUT) != 0) && (data != NULL)) { - if (size <= (sizeof(msg->o.raw) - sizeof(ioctl_out_t))) { - dst = ioctl->data; + if (size <= sizeof(msg->o.raw)) { + dst = msg->o.raw; } else { dst = msg->o.data; @@ -134,13 +125,3 @@ void ioctl_setResponse(msg_t *msg, unsigned long request, int err, const void *d (void)memcpy(dst, data, size); } } - - -void ioctl_setResponseErr(msg_t *msg, unsigned long request, int err) -{ - ioctl_out_t *ioctl = (ioctl_out_t *)msg->o.raw; - - (void)request; - - ioctl->err = err; -} diff --git a/sys/mount.c b/sys/mount.c index ddbe6619..29d3796c 100644 --- a/sys/mount.c +++ b/sys/mount.c @@ -24,23 +24,18 @@ int mount(const char *source, const char *target, const char *fstype, unsigned long mode, const char *data) { - struct stat buf; - oid_t toid, soid, doid; - msg_t msg = {0}; - char *source_abspath, *target_abspath; - int err; - - mount_i_msg_t *imnt = (mount_i_msg_t *)msg.i.raw; - mount_o_msg_t *omnt = (mount_o_msg_t *)msg.o.raw; - - if ((target_abspath = resolve_path(target, NULL, 1, 0)) == NULL) + char *target_abspath = resolve_path(target, NULL, 1, 0); + if (target_abspath == NULL) { return -1; /* errno set by resolve_path */ - - if ((source_abspath = resolve_path(source, NULL, 1, 0)) == NULL) { + } + char *source_abspath = resolve_path(source, NULL, 1, 0); + if (source_abspath == NULL) { free(target_abspath); return -1; /* errno set by resolve_path */ } + oid_t toid, soid, doid; + if (lookup(target_abspath, NULL, &toid) < 0) { free(target_abspath); free(source_abspath); @@ -53,33 +48,43 @@ int mount(const char *source, const char *target, const char *fstype, unsigned l return SET_ERRNO(-ENOENT); } - err = stat(target_abspath, &buf); + struct stat buf; + int err = stat(target_abspath, &buf); free(target_abspath); free(source_abspath); - if (err < 0) + if (err < 0) { return err; + } - if (!S_ISDIR(buf.st_mode)) + if (!S_ISDIR(buf.st_mode)) { return SET_ERRNO(-ENOTDIR); + } + + msg_t msg = { + .type = mtMount, + .i.size = (data != NULL) ? strlen(data) : 0, + .i.data = data, + .oid = soid + }; + + mount_i_msg_t *imnt = (mount_i_msg_t *)msg.i.raw; + mount_o_msg_t *omnt = (mount_o_msg_t *)msg.o.raw; - msg.type = mtMount; - imnt->dev = soid; imnt->mnt = toid; imnt->mode = mode; strncpy(imnt->fstype, fstype, sizeof(imnt->fstype)); imnt->fstype[sizeof(imnt->fstype) - 1] = '\0'; - msg.i.size = data != NULL ? strlen(data) : 0; - msg.i.data = (char *)data; /* FIXME: dropping const because of broken msg_t declaration */ - if (msgSend(soid.port, &msg) < 0) + if (msgSend(soid.port, &msg) < 0) { return SET_ERRNO(-EIO); + } /* Mount failed */ - if (omnt->err < 0) { - return SET_ERRNO(omnt->err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); } doid = omnt->oid; @@ -87,27 +92,25 @@ int mount(const char *source, const char *target, const char *fstype, unsigned l memset(&msg, 0, sizeof(msg)); msg.type = mtSetAttr; - msg.i.attr.oid = toid; + msg.oid = toid; msg.i.attr.type = atDev; msg.i.data = &doid; msg.i.size = sizeof(oid_t); - if (msgSend(toid.port, &msg) < 0) + if (msgSend(toid.port, &msg) < 0) { return SET_ERRNO(-EIO); /* FIXME: rollback partial mount */ + } - return SET_ERRNO(msg.o.attr.err); + return SET_ERRNO(msg.o.err); } int umount(const char *target) { - msg_t msg = { 0 }; - mount_o_msg_t *omnt = (mount_o_msg_t *)msg.o.raw; int rootfs = 0; oid_t oid, dev; - char *abspath; - abspath = resolve_path(target, NULL, 1, 0); + char *abspath = resolve_path(target, NULL, 1, 0); if (abspath == NULL) { /* errno set by resolve_path() */ return -1; @@ -133,16 +136,18 @@ int umount(const char *target) free(abspath); /* Check file type */ - msg.type = mtGetAttr; - msg.i.attr.type = atMode; - msg.i.attr.oid = oid; + msg_t msg = { + .type = mtGetAttr, + .oid = oid, + .i.attr.type = atMode, + }; if (msgSend(oid.port, &msg) < 0) { return SET_ERRNO(-EIO); } - if (msg.o.attr.err < 0) { - return SET_ERRNO(msg.o.attr.err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); } /* Got mountpoint */ @@ -153,23 +158,24 @@ int umount(const char *target) /* Got mounted device */ /* TODO: check device type (should be S_IFBLK?) */ else { + mount_o_msg_t *omnt = (mount_o_msg_t *)msg.o.raw; + /* Get mountpoint */ msg.type = mtMountPoint; - msg.i.data = &dev; - msg.i.size = sizeof(dev); + msg.oid = dev; if (msgSend(dev.port, &msg) < 0) { return SET_ERRNO(-EIO); } - if (omnt->err < 0) { + if (msg.o.err < 0) { /* Check for rootfs */ - if (omnt->err == -ENOENT) { + if (msg.o.err == -ENOENT) { rootfs = 1; } /* No mountpoint */ else { - return SET_ERRNO(omnt->err); + return SET_ERRNO(msg.o.err); } } else { @@ -179,22 +185,21 @@ int umount(const char *target) /* Unmount filesystem */ msg.type = mtUmount; - msg.i.data = &dev; - msg.i.size = sizeof(dev); + msg.oid = dev; if (msgSend(dev.port, &msg) < 0) { return SET_ERRNO(-EIO); } - if (msg.o.io.err < 0) { - return SET_ERRNO(msg.o.io.err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); } /* Remove mountpoint */ if (rootfs == 0) { msg.type = mtSetAttr; + msg.oid = oid; msg.i.attr.type = atDev; - msg.i.attr.oid = oid; msg.i.data = &oid; msg.i.size = sizeof(oid); @@ -202,7 +207,7 @@ int umount(const char *target) return SET_ERRNO(-EIO); } - return SET_ERRNO(msg.o.attr.err); + return SET_ERRNO(msg.o.err); } /* TODO: unregister root in kernel */ else { diff --git a/sys/socket.c b/sys/socket.c index b58c4d76..26b70f66 100644 --- a/sys/socket.c +++ b/sys/socket.c @@ -342,28 +342,31 @@ int getaddrinfo(const char *node, const char *service, smi->socket.flags = hints ? hints->ai_flags : (AI_V4MAPPED | AI_ADDRCONFIG); smi->socket.ai_node_sz = nodesz; + void *idata = NULL; if (nodesz + servsz) { msg.i.size = nodesz + servsz; - msg.i.data = malloc(msg.i.size); - if (!msg.i.data) + idata = malloc(msg.i.size); + if (idata == NULL) { return EAI_MEMORY; - memcpy(msg.i.data, node, nodesz); - memcpy(msg.i.data + nodesz, service, servsz); + } + memcpy(idata, node, nodesz); + memcpy(idata + nodesz, service, servsz); + msg.i.data = idata; } msg.o.size = 128; for (;;) { void *buf = realloc(msg.o.data, msg.o.size); if (!buf) { - realloc(msg.i.data, 0); - realloc(msg.o.data, 0); + free(idata); + free(msg.o.data); return EAI_MEMORY; } msg.o.data = buf; if (socksrvcall(&msg) < 0) { - realloc(msg.i.data, 0); - realloc(msg.o.data, 0); + free(idata); + free(msg.o.data); return EAI_SYSTEM; } @@ -376,7 +379,7 @@ int getaddrinfo(const char *node, const char *service, msg.o.size *= 2; } - realloc(msg.i.data, 0); + free(idata); bufsz = smo->sys.buflen; if (smo->ret || bufsz > msg.o.size) { diff --git a/sys/stat.c b/sys/stat.c index 7b2a9174..a33bcf1f 100644 --- a/sys/stat.c +++ b/sys/stat.c @@ -30,11 +30,10 @@ static int _stat_abs(const char *path, struct stat *buf) { oid_t oid, dev; - msg_t msg = {0}; - int err; - if (lookup(path, &oid, &dev) < 0) + if (lookup(path, &oid, &dev) < 0) { return -ENOENT; + } memset(buf, 0, sizeof(struct stat)); @@ -42,58 +41,82 @@ static int _stat_abs(const char *path, struct stat *buf) buf->st_ino = oid.id; buf->st_rdev = dev.port; - msg.type = mtGetAttr; - msg.i.attr.oid = oid; + struct _attrAll attrs; - msg.i.attr.type = atMTime; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_mtime = msg.o.attr.val; + msg_t msg = { + .type = mtGetAttrAll, + .oid = oid, + .o.data = &attrs, + .o.size = sizeof(attrs) + }; - msg.i.attr.type = atATime; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) + int err = msgSend(oid.port, &msg); + if (err < 0) { return err; - buf->st_atime = msg.o.attr.val; + } - msg.i.attr.type = atCTime; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_ctime = msg.o.attr.val; + if (msg.o.err < 0) { + return msg.o.err; + } - msg.i.attr.type = atLinks; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_nlink = msg.o.attr.val; + if (attrs.mTime.err < 0) { + return attrs.mTime.err; + } + buf->st_mtime = attrs.mTime.val; - msg.i.attr.type = atMode; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_mode = msg.o.attr.val; + if (attrs.aTime.err < 0) { + return attrs.aTime.err; + } - msg.i.attr.type = atUid; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_uid = msg.o.attr.val; + buf->st_atime = attrs.aTime.val; - msg.i.attr.type = atGid; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_gid = msg.o.attr.val; + if (attrs.cTime.err < 0) { + return attrs.cTime.err; + } - msg.i.attr.type = atSize; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_size = msg.o.attr.val; + buf->st_ctime = attrs.cTime.val; - msg.i.attr.type = atBlocks; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_blocks = msg.o.attr.val; + if (attrs.links.err < 0) { + return attrs.links.err; + } - msg.i.attr.type = atIOBlock; - if (((err = msgSend(oid.port, &msg)) < 0) || ((err = msg.o.attr.err) < 0)) - return err; - buf->st_blksize = msg.o.attr.val; + buf->st_nlink = attrs.links.val; + + if (attrs.mode.err < 0) { + return attrs.mode.err; + } + + buf->st_mode = attrs.mode.val; + + if (attrs.uid.err < 0) { + return attrs.uid.err; + } + + buf->st_uid = attrs.uid.val; + + if (attrs.gid.err < 0) { + return attrs.gid.err; + } + + buf->st_gid = attrs.gid.val; + + if (attrs.size.err < 0) { + return attrs.size.err; + } + + buf->st_size = attrs.size.val; + + if (attrs.blocks.err < 0) { + return attrs.blocks.err; + } + + buf->st_blocks = attrs.blocks.val; + + if (attrs.ioblock.err < 0) { + return attrs.ioblock.err; + } + + buf->st_blksize = attrs.ioblock.val; return EOK; } @@ -146,19 +169,18 @@ int creat(const char *pathname, int mode) int mkdir(const char *path, mode_t mode) { - msg_t msg = { 0 }; - oid_t dir; - char *canonical_name, *name, *parent; - - if (path == NULL) + if (path == NULL) { return SET_ERRNO(-EINVAL); + } /* allow_missing_leaf = 1 -> we will be creating a dir */ - canonical_name = resolve_path(path, NULL, 1, 1); - if (canonical_name == NULL) + char *canonical_name = resolve_path(path, NULL, 1, 1); + if (canonical_name == NULL) { return -1; /* errno set by resolve_path */ + } - name = strrchr(canonical_name, '/'); + char *name = strrchr(canonical_name, '/'); + char *parent; if (name == canonical_name) { name++; @@ -179,17 +201,20 @@ int mkdir(const char *path, mode_t mode) return SET_ERRNO(-ENAMETOOLONG); } + oid_t dir; if (lookup(parent, NULL, &dir) < EOK) { free(canonical_name); return SET_ERRNO(-ENOENT); } - msg.type = mtCreate; - msg.i.create.type = otDir; - msg.i.create.mode = mode | S_IFDIR; - msg.i.create.dir = dir; - msg.i.data = name; - msg.i.size = strlen(name) + 1; + msg_t msg = { + .type = mtCreate, + .oid = dir, + .i.create.type = otDir, + .i.create.mode = mode | S_IFDIR, + .i.data = name, + .i.size = strlen(name) + 1 + }; if (msgSend(dir.port, &msg) < 0) { free(canonical_name); @@ -197,7 +222,7 @@ int mkdir(const char *path, mode_t mode) } free(canonical_name); - return SET_ERRNO(msg.o.create.err); + return SET_ERRNO(msg.o.err); } diff --git a/sys/statvfs.c b/sys/statvfs.c index 2e55c717..16db7098 100644 --- a/sys/statvfs.c +++ b/sys/statvfs.c @@ -25,16 +25,13 @@ int statvfs(const char *path, struct statvfs *buf) { - msg_t msg = { 0 }; - oid_t oid, dev; - char *canonical; - - canonical = resolve_path(path, NULL, 1, 0); + char *canonical = resolve_path(path, NULL, 1, 0); if (canonical == NULL) { /* errno set by resolve_path() */ return -1; } + oid_t oid, dev; if (lookup(canonical, &oid, &dev) < 0) { free(canonical); return SET_ERRNO(-ENOENT); @@ -43,11 +40,13 @@ int statvfs(const char *path, struct statvfs *buf) /* Detect mountpoint */ if (oid.port != dev.port) { - msg.type = mtGetAttr; - msg.i.attr.type = atMode; - msg.i.attr.oid = oid; + msg_t msg = { + .type = mtGetAttr, + .oid = oid, + .i.attr.type = atMode + }; - if ((msgSend(oid.port, &msg) < 0) || (msg.o.attr.err < 0)) { + if ((msgSend(oid.port, &msg) < 0) || (msg.o.err < 0)) { return SET_ERRNO(-EIO); } @@ -57,13 +56,16 @@ int statvfs(const char *path, struct statvfs *buf) } memset(buf, 0, sizeof(struct statvfs)); - msg.type = mtStat; - msg.o.data = buf; - msg.o.size = sizeof(struct statvfs); + + msg_t msg = { + .type = mtStat, + .o.data = buf, + .o.size = sizeof(struct statvfs) + }; if (msgSend(oid.port, &msg) < 0) { return SET_ERRNO(-EIO); } - return SET_ERRNO(msg.o.io.err); + return SET_ERRNO(msg.o.err); } diff --git a/sys/time.c b/sys/time.c index eafccb8a..52c56b13 100644 --- a/sys/time.c +++ b/sys/time.c @@ -30,31 +30,34 @@ extern int sys_futimens(int fd, const struct timespec times[2]); static int utimes_internal(const char *path, const struct timeval times[2]) { oid_t oid, dev; - msg_t msg = { 0 }; - struct timeval now; - int err; - - if (lookup(path, &oid, &dev) < 0) + if (lookup(path, &oid, &dev) < 0) { return -ENOENT; + } - if (times == NULL) + struct timeval now; + if (times == NULL) { gettimeofday(&now, NULL); + } - msg.type = mtSetAttr; - msg.i.attr.oid = oid; + msg_t msg = { + .type = mtSetAttr, + .oid = oid, + .i.attr.type = atMTime, + .i.attr.val = (times == NULL) ? now.tv_sec : times[1].tv_sec + }; - msg.i.attr.type = atMTime; - msg.i.attr.val = times == NULL ? now.tv_sec : times[1].tv_sec; - err = msgSend(oid.port, &msg); - if ((err >= 0) && (msg.o.attr.err >= 0)) { + int err = msgSend(oid.port, &msg); + if ((err >= 0) && (msg.o.err >= 0)) { msg.i.attr.type = atATime; - msg.i.attr.val = times == NULL ? now.tv_sec : times[0].tv_sec; + msg.i.attr.val = (times == NULL) ? now.tv_sec : times[0].tv_sec; err = msgSend(oid.port, &msg); } - if (err >= 0) - err = msg.o.attr.err; - if (err < 0) + if (err >= 0) { + err = msg.o.err; + } + if (err < 0) { return err; + } return EOK; } diff --git a/unistd/dir.c b/unistd/dir.c index 25431794..2a0bf256 100644 --- a/unistd/dir.c +++ b/unistd/dir.c @@ -346,20 +346,18 @@ char *realpath(const char *path, char *resolved_path) struct dirent *readdir(DIR *s) { - msg_t msg; - memset(&msg, 0, sizeof(msg)); - if (s->dirent == NULL) { if ((s->dirent = calloc(1, sizeof(struct dirent) + NAME_MAX + 1)) == NULL) return NULL; } - msg.type = mtReaddir; - msg.i.readdir.offs = s->pos; - - memcpy(&msg.i.readdir.dir, &s->oid, sizeof(oid_t)); - msg.o.data = s->dirent; - msg.o.size = sizeof(struct dirent) + NAME_MAX + 1; + msg_t msg = { + .type = mtReaddir, + .oid = s->oid, + .i.readdir.offs = s->pos, + .o.data = s->dirent, + .o.size = sizeof(struct dirent) + NAME_MAX + 1 + }; if (msgSend(s->oid.port, &msg) < 0) { free(s->dirent); @@ -367,7 +365,7 @@ struct dirent *readdir(DIR *s) return NULL; /* EIO */ } - if (msg.o.io.err < 0) { + if (msg.o.err < 0) { free(s->dirent); s->dirent = NULL; return NULL; @@ -381,7 +379,6 @@ struct dirent *readdir(DIR *s) DIR *opendir(const char *dirname) { - msg_t msg = { 0 }; char *canonical_name = resolve_path(dirname, NULL, 1, 0); DIR *s = calloc(1, sizeof(DIR)); @@ -401,13 +398,13 @@ DIR *opendir(const char *dirname) free(canonical_name); s->dirent = NULL; -#if 1 - memset(&msg, 0, sizeof(msg)); - msg.type = mtGetAttr; - msg.i.attr.type = atType; - memcpy(&msg.i.attr.oid, &s->oid, sizeof(oid_t)); + msg_t msg = { + .type = mtGetAttr, + .oid = s->oid, + .i.attr.type = atType, + }; - if ((msgSend(s->oid.port, &msg) < 0) || (msg.o.attr.err < 0)) { + if ((msgSend(s->oid.port, &msg) < 0) || (msg.o.err < 0)) { free(s); errno = EIO; return NULL; /* EIO */ @@ -418,11 +415,10 @@ DIR *opendir(const char *dirname) errno = ENOTDIR; return NULL; /* ENOTDIR */ } -#endif memset(&msg, 0, sizeof(msg)); msg.type = mtOpen; - memcpy(&msg.i.openclose.oid, &s->oid, sizeof(oid_t)); + msg.oid = s->oid; msg.i.openclose.flags = 0; if (msgSend(s->oid.port, &msg) < 0) { @@ -431,7 +427,7 @@ DIR *opendir(const char *dirname) return NULL; /* EIO */ } - if (msg.o.io.err < 0) { + if (msg.o.err < 0) { free(s); errno = EIO; return NULL; @@ -449,14 +445,16 @@ void rewinddir(DIR *dirp) int closedir(DIR *dirp) { - msg_t msg = { 0 }; int ret = 0; - msg.type = mtClose; - memcpy(&msg.i.openclose.oid, &dirp->oid, sizeof(oid_t)); + msg_t msg = { + .type = mtClose, + .oid = dirp->oid + }; - if ((msgSend(dirp->oid.port, &msg) < 0) || (msg.o.io.err < 0)) + if ((msgSend(dirp->oid.port, &msg) < 0) || (msg.o.err < 0)) { ret = -1; + } free(dirp->dirent); free(dirp); @@ -469,44 +467,55 @@ int closedir(DIR *dirp) /* WARN: POSIX compliance: does not append '\0' */ static ssize_t _readlink_abs(const char *path, char *buf, size_t bufsiz) { - int ret; - msg_t msg = { 0 }; oid_t oid; assert(path && path[0] == '/'); - if ((ret = safe_lookup(path, &oid, NULL)) < 0) + int ret = safe_lookup(path, &oid, NULL); + if (ret < 0) { return SET_ERRNO(ret); + } - msg.type = mtGetAttr; - memcpy(&msg.i.attr.oid, &oid, sizeof(oid_t)); - msg.i.attr.type = atMode; + msg_t msg = { + .type = mtGetAttr, + .oid = oid, + .i.attr.type = atMode + }; - if ((ret = msgSend(oid.port, &msg)) != EOK) + ret = msgSend(oid.port, &msg); + if (ret != EOK) { return SET_ERRNO(ret); + } - if (msg.o.attr.err != EOK) - return SET_ERRNO(msg.o.attr.err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); + } - if (!S_ISLNK(msg.o.attr.val)) + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); + } + + if (!S_ISLNK(msg.o.attr.val)) { return SET_ERRNO(-EINVAL); + } memset(&msg, 0, sizeof(msg_t)); msg.type = mtRead; - - memcpy(&msg.i.io.oid, &oid, sizeof(oid_t)); + msg.oid = oid; msg.o.size = bufsiz; msg.o.data = buf; - - if ((ret = msgSend(oid.port, &msg)) != EOK) + ret = msgSend(oid.port, &msg); + if (ret != EOK) { return SET_ERRNO(ret); + } - if (msg.o.io.err < 0) - return SET_ERRNO(msg.o.io.err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); + } /* number of bytes written without terminating NULL byte */ - return msg.o.io.err; + return msg.o.err; } @@ -530,14 +539,12 @@ ssize_t readlink(const char *path, char *buf, size_t bufsiz) int rmdir(const char *path) { - msg_t msg = { 0 }; - oid_t dir, dev; - char *canonical_name, *dirname, *name; - struct stat s; - - if ((canonical_name = resolve_path(path, NULL, 1, 0)) == NULL) + char *canonical_name = resolve_path(path, NULL, 1, 0); + if (canonical_name == NULL) { return -1; /* errno set by resolve_path */ + } + struct stat s; if (stat(canonical_name, &s) < 0) { free(canonical_name); return SET_ERRNO(-ENOENT); @@ -548,6 +555,7 @@ int rmdir(const char *path) return SET_ERRNO(-ENOTDIR); } + oid_t dir, dev; if (safe_lookup(canonical_name, &dir, &dev)) { free(canonical_name); return SET_ERRNO(-ENOENT); @@ -559,6 +567,7 @@ int rmdir(const char *path) return SET_ERRNO(-EBUSY); } + char *dirname, *name; splitname(canonical_name, &name, &dirname); if (safe_lookup(dirname, NULL, &dev)) { @@ -566,10 +575,12 @@ int rmdir(const char *path) return SET_ERRNO(-ENOENT); } - msg.type = mtUnlink; - memcpy(&msg.i.ln.dir, &dev, sizeof(dev)); - msg.i.data = name; - msg.i.size = strlen(name) + 1; + msg_t msg = { + .type = mtUnlink, + .oid = dev, + .i.data = name, + .i.size = strlen(name) + 1 + }; if (msgSend(dev.port, &msg) != EOK) { free(canonical_name); @@ -578,8 +589,9 @@ int rmdir(const char *path) free(canonical_name); - if (msg.o.io.err < 0) - return SET_ERRNO(msg.o.io.err); + if (msg.o.err < 0) { + return SET_ERRNO(msg.o.err); + } return 0; } diff --git a/unistd/file.c b/unistd/file.c index 039914a1..4c132a4e 100644 --- a/unistd/file.c +++ b/unistd/file.c @@ -173,52 +173,54 @@ int mkfifo(const char *filename, mode_t mode) int symlink(const char *target, const char *linkpath) { - oid_t dir; - char *canonical_linkpath; - char *dir_name, *name; - msg_t msg; - int len1, len2; - int ret; - - if (target == NULL || linkpath == NULL) + if ((target == NULL) || (linkpath == NULL)) { return -EINVAL; + } /* allow_missing_leaf = 1 -> we will be creating a file */ - canonical_linkpath = resolve_path(linkpath, NULL, 1, 1); - if (canonical_linkpath == NULL) + char *canonical_linkpath = resolve_path(linkpath, NULL, 1, 1); + if (canonical_linkpath == NULL) { return -1; /* errno set by resolve_path */ + } + char *dir_name, *name; splitname(canonical_linkpath, &name, &dir_name); - if ((ret = lookup(dir_name, NULL, &dir)) < 0) { + oid_t dir; + int ret = lookup(dir_name, NULL, &dir); + if (ret < 0) { free(canonical_linkpath); return SET_ERRNO(ret); } - memset(&msg, 0, sizeof(msg_t)); - msg.type = mtCreate; - - memcpy(&msg.i.create.dir, &dir, sizeof(oid_t)); - msg.i.create.type = otSymlink; - /* POSIX: symlink file permissions are undefined, use sane default */ - msg.i.create.mode = S_IFLNK | 0777; + size_t len1 = strlen(name); + size_t len2 = strlen(target); - len1 = strlen(name); - len2 = strlen(target); + msg_t msg = { + .type = mtCreate, + .oid = dir, + .i.create.type = otSymlink, + /* POSIX: symlink file permissions are undefined, use sane default */ + .i.create.mode = S_IFLNK | 0777, + .i.size = len1 + len2 + 2 + }; - msg.i.size = len1 + len2 + 2; - msg.i.data = malloc(msg.i.size); - memset(msg.i.data, 0, msg.i.size); + void *idata = calloc(msg.i.size, 1); + if (idata == NULL) { + free(canonical_linkpath); + return SET_ERRNO(-ENOMEM); + } - memcpy(msg.i.data, name, len1); - memcpy(msg.i.data + len1 + 1, target, len2); + memcpy(idata, name, len1); + memcpy(idata + len1 + 1, target, len2); + msg.i.data = idata; ret = msgSend(dir.port, &msg); free(canonical_linkpath); - free(msg.i.data); + free(idata); - return ret != EOK ? SET_ERRNO(-EIO) : SET_ERRNO(msg.o.create.err); + return (ret != EOK) ? SET_ERRNO(-EIO) : SET_ERRNO(msg.o.err); } @@ -249,40 +251,39 @@ int access(const char *path, int amode) int truncate(const char *path, off_t length) { - char *canonical_name; - msg_t msg = { 0 }; - oid_t oid; - if (length < 0) { return SET_ERRNO(-EINVAL); } - canonical_name = resolve_path(path, NULL, 1, 0); + char *canonical_name = resolve_path(path, NULL, 1, 0); if (canonical_name == NULL) { return -1; /* errno set by resolve_path */ } + oid_t oid; if (lookup(canonical_name, &oid, NULL) < 0) { free(canonical_name); return SET_ERRNO(-ENOENT); } free(canonical_name); - msg.type = mtTruncate; - msg.i.io.oid = oid; - msg.i.io.len = length; + msg_t msg = { + .type = mtTruncate, + .oid = oid, + .i.io.len = length + }; + if (msgSend(oid.port, &msg) < 0) { return SET_ERRNO(-EIO); } - return SET_ERRNO(msg.o.io.err); + return SET_ERRNO(msg.o.err); } int create_dev(oid_t *oid, const char *path) { oid_t odev, odir; - msg_t msg = { 0 }; int retry = 0, err; char *canonical_path, *dir, *sep, *name, *tpathalloc = NULL; const char *tpath = path; @@ -364,56 +365,59 @@ int create_dev(oid_t *oid, const char *path) if (sep != NULL) *sep++ = 0; - msg.type = mtCreate; - msg.i.create.type = otDir; - msg.i.create.mode = DEFFILEMODE | S_IFDIR; - msg.i.create.dir = odev; - msg.i.data = dir; - msg.i.size = strlen(dir) + 1; + msg_t msg = { + .type = mtCreate, + .oid = odev, + .i.create.type = otDir, + .i.create.mode = DEFFILEMODE | S_IFDIR, + .i.data = dir, + .i.size = strlen(dir) + 1 + }; if (msgSend(odev.port, &msg) < 0) { free(canonical_path); return -ENOMEM; } - if (!msg.o.create.err) { + if (msg.o.err == 0) { odev = msg.o.create.oid; } - else if (msg.o.create.err == -EEXIST) { + else if (msg.o.err == -EEXIST) { msg.type = mtLookup; + msg.oid = odev; msg.i.size = strlen(dir) + 1; msg.i.data = dir; - msg.i.lookup.dir = odev; if (msgSend(odev.port, &msg) < 0) { free(canonical_path); return -ENOMEM; } - if (msg.o.lookup.err >= 0) { + if (msg.o.err >= 0) { odev = msg.o.lookup.dev; } else { free(canonical_path); - return msg.o.lookup.err; + return msg.o.err; } - } else { + } + else { free(canonical_path); - return msg.o.create.err; + return msg.o.err; } dir = sep; } - msg.type = mtCreate; - memcpy(&msg.i.create.dir, &odev, sizeof(oid_t)); - memcpy(&msg.i.create.dev, oid, sizeof(*oid)); - - msg.i.create.type = otDev; - /* TODO: create_dev() should take mode argument */ - msg.i.create.mode = S_IFCHR | 0666; - - msg.i.data = name; - msg.i.size = strlen(name) + 1; + msg_t msg = { + .type = mtCreate, + .oid = odev, + .i.create.dev = *oid, + .i.create.type = otDev, + /* TODO: create_dev() should take mode argument */ + .i.create.mode = S_IFCHR | 0666, + .i.data = name, + .i.size = strlen(name) + 1 + }; if (msgSend(odev.port, &msg) != EOK) { free(canonical_path); @@ -422,7 +426,7 @@ int create_dev(oid_t *oid, const char *path) free(canonical_path); - return msg.o.create.err; + return msg.o.err; } @@ -449,7 +453,7 @@ extern int sys_ioctl(int fildes, unsigned long request, void *val); int ioctl(int fildes, unsigned long request, ...) { va_list ap; - void * val; + void *val; /* FIXME: handle varargs properly */ va_start(ap, request);