From 738876a98f693575b57f65b181adcd19c0a37313 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Joakim=20Nohlg=C3=A5rd?= <joakim.nohlgard@eistec.se>
Date: Mon, 18 Jul 2016 23:22:09 +0200
Subject: [PATCH] cpu/atmega_common: Improve POSIX headers

---
 cpu/atmega_common/avr-libc-extra/time.h |  10 +-
 cpu/atmega_common/include/sys/stat.h    | 120 ++++++++++++++++++++++++
 cpu/atmega_common/include/sys/types.h   |  33 +++++--
 doc/doxygen/riot.doxyfile               |   1 +
 4 files changed, 149 insertions(+), 15 deletions(-)
 create mode 100644 cpu/atmega_common/include/sys/stat.h

diff --git a/cpu/atmega_common/avr-libc-extra/time.h b/cpu/atmega_common/avr-libc-extra/time.h
index e1bd2778b9..00a6c87bd1 100644
--- a/cpu/atmega_common/avr-libc-extra/time.h
+++ b/cpu/atmega_common/avr-libc-extra/time.h
@@ -101,8 +101,8 @@
 #ifndef TIME_H
 #define TIME_H
 
-#include <inttypes.h>
-#include <stdlib.h>
+#include <stdint.h>
+#include <sys/types.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -111,12 +111,6 @@ extern "C" {
     /** \ingroup avr_time */
     /* @{ */
 
-    /**
-        time_t represents seconds elapsed from Midnight, Jan 1 2000 UTC (the Y2K 'epoch').
-        Its range allows this implementation to represent time up to Tue Feb 7 06:28:15 2136 UTC.
-    */
-    typedef uint32_t time_t;
-
     /**
     The time function returns the systems current time stamp.
     If timer is not a null pointer, the return value is also assigned to the object it points to.
diff --git a/cpu/atmega_common/include/sys/stat.h b/cpu/atmega_common/include/sys/stat.h
new file mode 100644
index 0000000000..49e8533c65
--- /dev/null
+++ b/cpu/atmega_common/include/sys/stat.h
@@ -0,0 +1,120 @@
+/*
+ * Copyright (C) 2016 Eistec AB
+ *
+ * This file is subject to the terms and conditions of the GNU Lesser
+ * General Public License v2.1. See the file LICENSE in the top level
+ * directory for more details.
+ */
+
+/**
+ * @file
+ * @brief   POSIX compatible sys/stat.h definitions
+ * @author  Joakim Nohlgård <joakim.nohlgard@eistec.se>
+ */
+
+#ifndef SYS_STAT_H_
+#define SYS_STAT_H_
+
+#include <time.h> /* for struct timespec */
+#include <sys/types.h> /* for fsblkcnt_t, fsfilcnt_t */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @brief File information
+ */
+struct stat {
+    dev_t st_dev;            /**< Device ID of device containing file. */
+    ino_t st_ino;            /**< File serial number. */
+    mode_t st_mode;          /**< Mode of file (see below). */
+    nlink_t st_nlink;        /**< Number of hard links to the file. */
+    uid_t st_uid;            /**< User ID of file. */
+    gid_t st_gid;            /**< Group ID of file. */
+    dev_t st_rdev;           /**< Device ID (if file is character or block special). */
+    /**
+     * For regular files, the file size in bytes.
+     * For symbolic links, the length in bytes of the pathname contained in the
+     * symbolic link.
+     * For a shared memory object, the length in bytes.
+     * For a typed memory object, the length in bytes.
+     * For other file types, the use of this field is unspecified.
+     */
+    off_t st_size;
+    struct timespec st_atim; /**< Last data access timestamp. */
+    struct timespec st_mtim; /**< Last data modification timestamp. */
+    struct timespec st_ctim; /**< Last file status change timestamp. */
+    /**
+     * A file system-specific preferred I/O block size for this object. In some
+     * file system types, this may vary from file to file.
+     */
+    blksize_t st_blksize;
+    blkcnt_t st_blocks;      /**< Number of blocks allocated for this object. */
+};
+
+/* These bitmasks and numbers are the same as in newlib */
+#define     S_IFMT   0170000 /* type of file */
+#define     S_IFDIR  0040000 /* directory */
+#define     S_IFCHR  0020000 /* character special */
+#define     S_IFBLK  0060000 /* block special */
+#define     S_IFREG  0100000 /* regular */
+#define     S_IFLNK  0120000 /* symbolic link */
+#define     S_IFSOCK 0140000 /* socket */
+#define     S_IFIFO  0010000 /* fifo */
+
+/* These numbers are well-known and can be found in the manual page for sys_stat.h */
+#define S_IRWXU         0700  /**< Read, write, execute/search by owner.    */
+#define S_IRUSR         0400  /**< Read permission, owner.                  */
+#define S_IWUSR         0200  /**< Write permission, owner.                 */
+#define S_IXUSR         0100  /**< Execute/search permission, owner.        */
+#define S_IRWXG          070  /**< Read, write, execute/search by group.    */
+#define S_IRGRP          040  /**< Read permission, group.                  */
+#define S_IWGRP          020  /**< Write permission, group.                 */
+#define S_IXGRP          010  /**< Execute/search permission, group.        */
+#define S_IRWXO           07  /**< Read, write, execute/search by others.   */
+#define S_IROTH           04  /**< Read permission, others.                 */
+#define S_IWOTH           02  /**< Write permission, others.                */
+#define S_IXOTH           01  /**< Execute/search permission, others.       */
+#define S_ISUID        04000  /**< Set-user-ID on execution.                */
+#define S_ISGID        02000  /**< Set-group-ID on execution.               */
+#define S_ISVTX        01000  /**< On directories, restricted deletion flag */
+
+/* File type test macros, taken from newlib */
+#define S_ISBLK(m)  (((m) & S_IFMT) == S_IFBLK)
+#define S_ISCHR(m)  (((m) & S_IFMT) == S_IFCHR)
+#define S_ISDIR(m)  (((m) & S_IFMT) == S_IFDIR)
+#define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
+#define S_ISREG(m)  (((m) & S_IFMT) == S_IFREG)
+#define S_ISLNK(m)  (((m) & S_IFMT) == S_IFLNK)
+#define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
+
+/* These function prototypes are required by the standard */
+int    chmod(const char *, mode_t);
+int    fchmod(int, mode_t);
+int    fchmodat(int, const char *, mode_t, int);
+int    fstat(int, struct stat *);
+int    fstatat(int, const char *restrict, struct stat *restrict, int);
+int    futimens(int, const struct timespec [2]);
+int    lstat(const char *restrict, struct stat *restrict);
+int    mkdir(const char *, mode_t);
+int    mkdirat(int, const char *, mode_t);
+int    mkfifo(const char *, mode_t);
+int    mkfifoat(int, const char *, mode_t);
+int    mknod(const char *, mode_t, dev_t);
+int    mknodat(int, const char *, mode_t, dev_t);
+int    stat(const char *restrict, struct stat *restrict);
+mode_t umask(mode_t);
+int    utimensat(int, const char *, const struct timespec [2], int);
+
+/* Special tv_nsec values for futimens(2) and utimensat(2). */
+#define UTIME_NOW   (-2L)
+#define UTIME_OMIT  (-1L)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SYS_STAT_H_ */
+
+/** @} */
diff --git a/cpu/atmega_common/include/sys/types.h b/cpu/atmega_common/include/sys/types.h
index 74bf6c6ccf..7cce094a6c 100644
--- a/cpu/atmega_common/include/sys/types.h
+++ b/cpu/atmega_common/include/sys/types.h
@@ -7,22 +7,41 @@
  * directory for more details.
  */
 
- #ifndef AVR_TYPES_H
- #define AVR_TYPES_H
+#ifndef SYS_TYPES_H_
+#define SYS_TYPES_H_
 
-#include <inttypes.h>
+#include <stdint.h>
 #include <stddef.h>
 
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-typedef int16_t suseconds_t;
-typedef signed int ssize_t;
-typedef unsigned int off_t;
+typedef      int32_t blkcnt_t;    /**< Used for file block counts */
+typedef      int32_t blksize_t;   /**< Used for block sizes */
+typedef     uint32_t clock_t;     /**< Used for system times in clock ticks */
+typedef     uint32_t clockid_t;   /**< Used for clock ID type in the clock and timer functions */
+typedef      int16_t dev_t;       /**< Used for device IDs */
+typedef     uint32_t fsblkcnt_t;  /**< Used for file system block counts */
+typedef     uint32_t fsfilcnt_t;  /**< Used for file system file counts */
+typedef     uint16_t gid_t;       /**< Used for group IDs */
+typedef     uint16_t id_t;        /**< Used as a general identifier */
+typedef     uint32_t ino_t;       /**< Used for file serial numbers */
+typedef     uint32_t key_t;       /**< Used for XSI interprocess communication */
+typedef     uint32_t mode_t;      /**< Used for some file attributes */
+typedef     uint16_t nlink_t;     /**< Used for link counts */
+typedef      int32_t off_t;       /**< Used for file sizes and offsets */
+typedef          int pid_t;       /**< Used for process IDs and process group IDs */
+typedef unsigned int size_t;      /**< Used for sizes of objects */
+typedef   signed int ssize_t;     /**< Used for a count of bytes or an error indication */
+typedef      int32_t suseconds_t; /**< Used for time in microseconds */
+typedef      int32_t time_t;      /**< Used for time in seconds */
+typedef     uint32_t timer_t;     /**< Used for timer ID returned by timer_create() */
+typedef     uint16_t uid_t;       /**< Used for user IDs */
+typedef     uint32_t useconds_t;  /**< Used for time in microseconds */
 
 #ifdef __cplusplus
 }
 #endif
 
-#endif /* ifndef AVR_TYPES_H */
+#endif /* SYS_TYPES_H_ */
diff --git a/doc/doxygen/riot.doxyfile b/doc/doxygen/riot.doxyfile
index 1e3a4a7e11..5925eaa27b 100644
--- a/doc/doxygen/riot.doxyfile
+++ b/doc/doxygen/riot.doxyfile
@@ -818,6 +818,7 @@ EXCLUDE_SYMLINKS       = NO
 # exclude all test directories for example use the pattern */test/*
 
 EXCLUDE_PATTERNS       = */board/*/tools/* \
+                         */cpu/atmega_common/include/sys/*.h \
                          */cpu/msp430_common/include/stdatomic.h \
                          */cpu/msp430_common/include/sys/*.h \
                          */cpu/native/osx-libc-extra \
-- 
GitLab