1 /* Convert between the kernel's `struct stat' format, and libc's. 2 Copyright (C) 1997-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19 #include <errno.h> 20 #include <string.h> 21 #include <sys/stat.h> 22 #include <kernel_stat.h> 23 #include <xstatconv.h> 24 #include <sys/syscall.h> 25 26 int __xstat_conv(int vers,struct kernel_stat * kbuf,void * ubuf)27__xstat_conv (int vers, struct kernel_stat *kbuf, void *ubuf) 28 { 29 switch (vers) 30 { 31 case _STAT_VER_KERNEL: 32 *(struct kernel_stat *) ubuf = *kbuf; 33 break; 34 35 case _STAT_VER_GLIBC2: 36 { 37 struct glibc2_stat *buf = ubuf; 38 39 buf->st_dev = kbuf->st_dev; 40 buf->st_ino = kbuf->st_ino; 41 buf->st_mode = kbuf->st_mode; 42 buf->st_nlink = kbuf->st_nlink; 43 buf->st_uid = kbuf->st_uid; 44 buf->st_gid = kbuf->st_gid; 45 buf->st_rdev = kbuf->st_rdev; 46 buf->st_size = kbuf->st_size; 47 buf->st_atime_sec = kbuf->st_atime_sec; 48 buf->st_mtime_sec = kbuf->st_mtime_sec; 49 buf->st_ctime_sec = kbuf->st_ctime_sec; 50 buf->st_blksize = kbuf->st_blksize; 51 buf->st_blocks = kbuf->st_blocks; 52 buf->st_flags = kbuf->st_flags; 53 buf->st_gen = kbuf->st_gen; 54 } 55 break; 56 57 case _STAT_VER_GLIBC2_1: 58 { 59 struct glibc21_stat *buf = ubuf; 60 61 buf->st_dev = kbuf->st_dev; 62 buf->st_ino = kbuf->st_ino; 63 buf->st_mode = kbuf->st_mode; 64 buf->st_nlink = kbuf->st_nlink; 65 buf->st_uid = kbuf->st_uid; 66 buf->st_gid = kbuf->st_gid; 67 buf->st_rdev = kbuf->st_rdev; 68 buf->st_size = kbuf->st_size; 69 buf->st_atime_sec = kbuf->st_atime_sec; 70 buf->st_mtime_sec = kbuf->st_mtime_sec; 71 buf->st_ctime_sec = kbuf->st_ctime_sec; 72 buf->st_blocks = kbuf->st_blocks; 73 buf->st_blksize = kbuf->st_blksize; 74 buf->st_flags = kbuf->st_flags; 75 buf->st_gen = kbuf->st_gen; 76 buf->__pad3 = 0; 77 buf->__glibc_reserved[0] = 0; 78 buf->__glibc_reserved[1] = 0; 79 buf->__glibc_reserved[2] = 0; 80 buf->__glibc_reserved[3] = 0; 81 } 82 break; 83 84 case _STAT_VER_GLIBC2_3_4: 85 { 86 struct stat64 *buf = ubuf; 87 88 buf->st_dev = kbuf->st_dev; 89 buf->st_ino = kbuf->st_ino; 90 buf->st_rdev = kbuf->st_rdev; 91 buf->st_size = kbuf->st_size; 92 buf->st_blocks = kbuf->st_blocks; 93 94 buf->st_mode = kbuf->st_mode; 95 buf->st_uid = kbuf->st_uid; 96 buf->st_gid = kbuf->st_gid; 97 buf->st_blksize = kbuf->st_blksize; 98 buf->st_nlink = kbuf->st_nlink; 99 buf->__pad0 = 0; 100 101 buf->st_atim.tv_sec = kbuf->st_atime_sec; 102 buf->st_atim.tv_nsec = 0; 103 buf->st_mtim.tv_sec = kbuf->st_mtime_sec; 104 buf->st_mtim.tv_nsec = 0; 105 buf->st_ctim.tv_sec = kbuf->st_ctime_sec; 106 buf->st_ctim.tv_nsec = 0; 107 108 buf->__glibc_reserved[0] = 0; 109 buf->__glibc_reserved[1] = 0; 110 buf->__glibc_reserved[2] = 0; 111 } 112 break; 113 114 default: 115 __set_errno (EINVAL); 116 return -1; 117 } 118 119 return 0; 120 } 121