]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/alpha/bits/stat.h
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / alpha / bits / stat.h
index cc2a2eac9098cf2ed466bec85331b9bec153fb77..f768febeb169702526f2455db68459f24bc540e4 100644 (file)
-/* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1996-2019 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Library General Public License as
-   published by the Free Software Foundation; either version 2 of the
-   License, or (at your option) any later version.
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
 
    The GNU C Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Library General Public License for more details.
+   Lesser General Public License for more details.
 
-   You should have received a copy of the GNU Library General Public
-   License along with the GNU C Library; see the file COPYING.LIB.  If not,
-   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library.  If not, see
+   <https://www.gnu.org/licenses/>.  */
 
-/*
- * Never include this file directly; use <sys/stat.h> instead.
- */
+#if !defined _SYS_STAT_H && !defined _FCNTL_H
+# error "Never include <bits/stat.h> directly; use <sys/stat.h> instead."
+#endif
 
-#ifndef        _BITS_STAT_H
-#define        _BITS_STAT_H    1
+#ifndef _BITS_STAT_H
+#define _BITS_STAT_H   1
 
 /* Versions of the `struct stat' data structure.  */
-#define _STAT_VER_LINUX_OLD    0
-#define _STAT_VER_LINUX                1
+#define _STAT_VER_KERNEL       0
+#define _STAT_VER_GLIBC2       1
+#define _STAT_VER_GLIBC2_1     2
+#define _STAT_VER_KERNEL64     3
+#define _STAT_VER_GLIBC2_3_4   3
+#define _STAT_VER_LINUX                3
 #define _STAT_VER              _STAT_VER_LINUX
 
 /* Versions of the `xmknod' interface.  */
 #define _MKNOD_VER_LINUX       0
 
+
+/* Nanosecond resolution timestamps are stored in a format equivalent to
+   'struct timespec'.  This is the type used whenever possible but the
+   Unix namespace rules do not allow the identifier 'timespec' to appear
+   in the <sys/stat.h> header.  Therefore we have to handle the use of
+   this header in strictly standard-compliant sources special.
+
+   Use neat tidy anonymous unions and structures when possible.  */
+
+#ifdef __USE_XOPEN2K8
+# if __GNUC_PREREQ(3,3)
+#  define __ST_TIME(X)                         \
+       __extension__ union {                   \
+           struct timespec st_##X##tim;        \
+           struct {                            \
+               __time_t st_##X##time;          \
+               unsigned long st_##X##timensec; \
+           };                                  \
+       }
+# else
+#  define __ST_TIME(X) struct timespec st_##X##tim
+#  define st_atime st_atim.tv_sec
+#  define st_mtime st_mtim.tv_sec
+#  define st_ctime st_ctim.tv_sec
+# endif
+#else
+# define __ST_TIME(X)                          \
+       __time_t st_##X##time;                  \
+       unsigned long st_##X##timensec
+#endif
+
+
 struct stat
   {
     __dev_t st_dev;            /* Device.  */
+#ifdef __USE_FILE_OFFSET64
+    __ino64_t st_ino;          /* File serial number.  */
+#else
     __ino_t st_ino;            /* File serial number.  */
+    int __pad0;                        /* 64-bit st_ino.  */
+#endif
+    __dev_t st_rdev;           /* Device number, if device.  */
+    __off_t st_size;           /* Size of file, in bytes.  */
+#ifdef __USE_FILE_OFFSET64
+    __blkcnt64_t st_blocks;    /* Nr. 512-byte blocks allocated.  */
+#else
+    __blkcnt_t st_blocks;      /* Nr. 512-byte blocks allocated.  */
+    int __pad1;                        /* 64-bit st_blocks.  */
+#endif
     __mode_t st_mode;          /* File mode.  */
-    __nlink_t st_nlink;                /* Link count.  */
     __uid_t st_uid;            /* User ID of the file's owner. */
     __gid_t st_gid;            /* Group ID of the file's group.*/
+    __blksize_t st_blksize;    /* Optimal block size for I/O.  */
+    __nlink_t st_nlink;                /* Link count.  */
+    int __pad2;                        /* Real padding.  */
+    __ST_TIME(a);              /* Time of last access.  */
+    __ST_TIME(m);              /* Time of last modification.  */
+    __ST_TIME(c);              /* Time of last status change.  */
+    long __glibc_reserved[3];
+  };
+
+#ifdef __USE_LARGEFILE64
+/* Note stat64 is the same shape as stat.  */
+struct stat64
+  {
+    __dev_t st_dev;            /* Device.  */
+    __ino64_t st_ino;          /* File serial number.  */
     __dev_t st_rdev;           /* Device number, if device.  */
     __off_t st_size;           /* Size of file, in bytes.  */
-    __time_t st_atime;         /* Time of last access.  */
-    __time_t st_mtime;         /* Time of last modification.  */
-    __time_t st_ctime;         /* Time of last status change.  */
-    unsigned int st_blksize;   /* Optimal block size for I/O.  */
-#define        _STATBUF_ST_BLKSIZE     /* Tell code we have this member.  */
-    __blkcnt_t st_blocks;      /* Nr. of 512-byte blocks allocated.  */
-    unsigned int st_flags;
-    unsigned int st_gen;
+    __blkcnt64_t st_blocks;    /* Nr. 512-byte blocks allocated.  */
+    __mode_t st_mode;          /* File mode.  */
+    __uid_t st_uid;            /* User ID of the file's owner. */
+    __gid_t st_gid;            /* Group ID of the file's group.*/
+    __blksize_t st_blksize;    /* Optimal block size for I/O.  */
+    __nlink_t st_nlink;                /* Link count.  */
+    int __pad0;                        /* Real padding.  */
+    __ST_TIME(a);              /* Time of last access.  */
+    __ST_TIME(m);              /* Time of last modification.  */
+    __ST_TIME(c);              /* Time of last status change.  */
+    long __glibc_reserved[3];
   };
+#endif
+
+#undef __ST_TIME
+
+/* Tell code we have these members.  */
+#define        _STATBUF_ST_BLKSIZE
+#define _STATBUF_ST_RDEV
+#define _STATBUF_ST_NSEC
 
 /* Encoding of the file mode.  */
 
@@ -61,11 +134,15 @@ struct stat
 #define        __S_IFBLK       0060000 /* Block device.  */
 #define        __S_IFREG       0100000 /* Regular file.  */
 #define        __S_IFIFO       0010000 /* FIFO.  */
-
-/* These don't actually exist on System V, but having them doesn't hurt.  */
 #define        __S_IFLNK       0120000 /* Symbolic link.  */
 #define        __S_IFSOCK      0140000 /* Socket.  */
 
+/* POSIX.1b objects.  Note that these macros always evaluate to zero.  But
+   they do it by enforcing the correct use of the macros.  */
+#define __S_TYPEISMQ(buf)  ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSEM(buf) ((buf)->st_mode - (buf)->st_mode)
+#define __S_TYPEISSHM(buf) ((buf)->st_mode - (buf)->st_mode)
+
 /* Protection bits.  */
 
 #define        __S_ISUID       04000   /* Set user ID on execution.  */
@@ -75,4 +152,9 @@ struct stat
 #define        __S_IWRITE      0200    /* Write by owner.  */
 #define        __S_IEXEC       0100    /* Execute by owner.  */
 
-#endif /* bits/stat.h */
+#ifdef __USE_ATFILE
+# define UTIME_NOW     ((1l << 30) - 1l)
+# define UTIME_OMIT    ((1l << 30) - 2l)
+#endif
+
+#endif /* bits/stat.h */