From ab654573e5e3b627839cd4a11ab7e7ce8eef3c44 Mon Sep 17 00:00:00 2001 From: Martin Lenders <mail@martin-lenders.de> Date: Mon, 30 Sep 2013 15:12:40 +0200 Subject: [PATCH] Implementation of close() --- sys/posix/include/unistd.h | 49 ++++++++++++++++++++++++++++++++++++++ sys/posix/unistd.c | 30 +++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 sys/posix/include/unistd.h create mode 100644 sys/posix/unistd.c diff --git a/sys/posix/include/unistd.h b/sys/posix/include/unistd.h new file mode 100644 index 0000000000..a051e8a144 --- /dev/null +++ b/sys/posix/include/unistd.h @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2013 Freie Universität Berlin + * + * This file subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @addtogroup posix + * @{ + */ + +/** + * @file unistd.h + * @brief standard symbolic constants and types + * @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html"> + * The Open Group Base Specifications Issue 7, <unistd.h> + * </a> + * + * @author Freie Universität Berlin + * @author Martin Lenders <mlenders@inf.fu-berlin.de> + */ +#ifndef _UNISTD_H +#define _UNISTD_H + +/** + * @brief Close a file descriptor. + * @details shall deallocate the file descriptor indicated by *fildes*. To + * deallocate means to make the file descriptor available for return + * by subsequent calls to open() or other functions that allocate file + * descriptors. All outstanding record locks owned by the process on + * the file associated with the file descriptor shall be removed (that + * is, unlocked). + * + * @see <a href="http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html"> + * The Open Group Base Specification Issue 7, close + * </a> + * + * @param[in] fildes The file descriptor to the file which is to close. + * @return Upon successful completion, 0 shall be returned; otherwise, -1 + * shall be returned and errno set to indicate the error. + */ +int close(int fildes); + +/** + * @} + */ +#endif /* _UNISTD_H */ diff --git a/sys/posix/unistd.c b/sys/posix/unistd.c new file mode 100644 index 0000000000..0030a0d446 --- /dev/null +++ b/sys/posix/unistd.c @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2013 Freie Universität Berlin + * + * This file subject to the terms and conditions of the GNU Lesser General + * Public License. See the file LICENSE in the top level directory for more + * details. + */ +#include <errno.h> + +#include "fd.h" +#include "unistd.h" + +int close(int fildes) +{ + fd_t *fd_obj = fd_get(fildes); + + if (!fd_obj) { + errno = EBADF; + return -1; + } + + if (fd_obj->close(fd_obj->fd) < 0) { + errno = EIO; // EINTR may not occur since RIOT has no signals yet. + return -1; + } + + fd_destroy(fd_obj->fd); + + return 0; +} -- GitLab