1 /* File-I/O functions for GDB, the GNU debugger. 2 3 Copyright (C) 2003-2023 Free Software Foundation, Inc. 4 5 This file is part of GDB. 6 7 This program is free software; you can redistribute it and/or modify 8 it under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3 of the License, or 10 (at your option) any later version. 11 12 This program is distributed in the hope that it will be useful, 13 but WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 GNU General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 19 20 #ifndef COMMON_FILEIO_H 21 #define COMMON_FILEIO_H 22 23 #include <sys/stat.h> 24 25 /* The following flags are defined to be independent of the host 26 as well as the target side implementation of these constants. 27 All constants are defined with a leading FILEIO_ in the name 28 to allow the usage of these constants together with the 29 corresponding implementation dependent constants in one module. */ 30 31 /* open(2) flags */ 32 #define FILEIO_O_RDONLY 0x0 33 #define FILEIO_O_WRONLY 0x1 34 #define FILEIO_O_RDWR 0x2 35 #define FILEIO_O_APPEND 0x8 36 #define FILEIO_O_CREAT 0x200 37 #define FILEIO_O_TRUNC 0x400 38 #define FILEIO_O_EXCL 0x800 39 #define FILEIO_O_SUPPORTED (FILEIO_O_RDONLY | FILEIO_O_WRONLY| \ 40 FILEIO_O_RDWR | FILEIO_O_APPEND| \ 41 FILEIO_O_CREAT | FILEIO_O_TRUNC| \ 42 FILEIO_O_EXCL) 43 44 /* mode_t bits */ 45 #define FILEIO_S_IFREG 0100000 46 #define FILEIO_S_IFDIR 040000 47 #define FILEIO_S_IFCHR 020000 48 #define FILEIO_S_IRUSR 0400 49 #define FILEIO_S_IWUSR 0200 50 #define FILEIO_S_IXUSR 0100 51 #define FILEIO_S_IRWXU 0700 52 #define FILEIO_S_IRGRP 040 53 #define FILEIO_S_IWGRP 020 54 #define FILEIO_S_IXGRP 010 55 #define FILEIO_S_IRWXG 070 56 #define FILEIO_S_IROTH 04 57 #define FILEIO_S_IWOTH 02 58 #define FILEIO_S_IXOTH 01 59 #define FILEIO_S_IRWXO 07 60 #define FILEIO_S_SUPPORTED (FILEIO_S_IFREG|FILEIO_S_IFDIR| \ 61 FILEIO_S_IRWXU|FILEIO_S_IRWXG| \ 62 FILEIO_S_IRWXO) 63 64 /* lseek(2) flags */ 65 #define FILEIO_SEEK_SET 0 66 #define FILEIO_SEEK_CUR 1 67 #define FILEIO_SEEK_END 2 68 69 /* errno values */ 70 enum fileio_error 71 { 72 FILEIO_SUCCESS = 0, 73 FILEIO_EPERM = 1, 74 FILEIO_ENOENT = 2, 75 FILEIO_EINTR = 4, 76 FILEIO_EIO = 5, 77 FILEIO_EBADF = 9, 78 FILEIO_EACCES = 13, 79 FILEIO_EFAULT = 14, 80 FILEIO_EBUSY = 16, 81 FILEIO_EEXIST = 17, 82 FILEIO_ENODEV = 19, 83 FILEIO_ENOTDIR = 20, 84 FILEIO_EISDIR = 21, 85 FILEIO_EINVAL = 22, 86 FILEIO_ENFILE = 23, 87 FILEIO_EMFILE = 24, 88 FILEIO_EFBIG = 27, 89 FILEIO_ENOSPC = 28, 90 FILEIO_ESPIPE = 29, 91 FILEIO_EROFS = 30, 92 FILEIO_ENOSYS = 88, 93 FILEIO_ENAMETOOLONG = 91, 94 FILEIO_EUNKNOWN = 9999, 95 }; 96 97 #define FIO_INT_LEN 4 98 #define FIO_UINT_LEN 4 99 #define FIO_MODE_LEN 4 100 #define FIO_TIME_LEN 4 101 #define FIO_LONG_LEN 8 102 #define FIO_ULONG_LEN 8 103 104 typedef char fio_int_t[FIO_INT_LEN]; 105 typedef char fio_uint_t[FIO_UINT_LEN]; 106 typedef char fio_mode_t[FIO_MODE_LEN]; 107 typedef char fio_time_t[FIO_TIME_LEN]; 108 typedef char fio_long_t[FIO_LONG_LEN]; 109 typedef char fio_ulong_t[FIO_ULONG_LEN]; 110 111 /* Struct stat as used in protocol. For complete independence 112 of host/target systems, it's defined as an array with offsets 113 to the members. */ 114 115 struct fio_stat 116 { 117 fio_uint_t fst_dev; 118 fio_uint_t fst_ino; 119 fio_mode_t fst_mode; 120 fio_uint_t fst_nlink; 121 fio_uint_t fst_uid; 122 fio_uint_t fst_gid; 123 fio_uint_t fst_rdev; 124 fio_ulong_t fst_size; 125 fio_ulong_t fst_blksize; 126 fio_ulong_t fst_blocks; 127 fio_time_t fst_atime; 128 fio_time_t fst_mtime; 129 fio_time_t fst_ctime; 130 }; 131 132 struct fio_timeval 133 { 134 fio_time_t ftv_sec; 135 fio_long_t ftv_usec; 136 }; 137 138 /* Convert a host-format errno value to a File-I/O error number. */ 139 140 extern fileio_error host_to_fileio_error (int error); 141 142 /* Convert a File-I/O error number to a host-format errno value. */ 143 144 extern int fileio_error_to_host (fileio_error errnum); 145 146 /* Convert File-I/O open flags FFLAGS to host format, storing 147 the result in *FLAGS. Return 0 on success, -1 on error. */ 148 149 extern int fileio_to_host_openflags (int fflags, int *flags); 150 151 /* Convert File-I/O mode FMODE to host format, storing 152 the result in *MODE. Return 0 on success, -1 on error. */ 153 154 extern int fileio_to_host_mode (int fmode, mode_t *mode); 155 156 /* Pack a host-format integer into a byte buffer in big-endian 157 format. BYTES specifies the size of the integer to pack in 158 bytes. */ 159 160 static inline void 161 host_to_bigendian (LONGEST num, char *buf, int bytes) 162 { 163 int i; 164 165 for (i = 0; i < bytes; ++i) 166 buf[i] = (num >> (8 * (bytes - i - 1))) & 0xff; 167 } 168 169 /* Pack a host-format integer into an fio_uint_t. */ 170 171 static inline void 172 host_to_fileio_uint (long num, fio_uint_t fnum) 173 { 174 host_to_bigendian ((LONGEST) num, (char *) fnum, 4); 175 } 176 177 /* Pack a host-format time_t into an fio_time_t. */ 178 179 static inline void 180 host_to_fileio_time (time_t num, fio_time_t fnum) 181 { 182 host_to_bigendian ((LONGEST) num, (char *) fnum, 4); 183 } 184 185 /* Pack a host-format struct stat into a struct fio_stat. */ 186 187 extern void host_to_fileio_stat (struct stat *st, struct fio_stat *fst); 188 189 #endif /* COMMON_FILEIO_H */ 190