1 /* File-I/O functions for GDB, the GNU debugger. 2 3 Copyright (C) 2003-2024 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 #include "fileio.h" 21 #include <sys/stat.h> 22 #include <fcntl.h> 23 24 /* See fileio.h. */ 25 26 fileio_error 27 host_to_fileio_error (int error) 28 { 29 switch (error) 30 { 31 case EPERM: 32 return FILEIO_EPERM; 33 case ENOENT: 34 return FILEIO_ENOENT; 35 case EINTR: 36 return FILEIO_EINTR; 37 case EIO: 38 return FILEIO_EIO; 39 case EBADF: 40 return FILEIO_EBADF; 41 case EACCES: 42 return FILEIO_EACCES; 43 case EFAULT: 44 return FILEIO_EFAULT; 45 case EBUSY: 46 return FILEIO_EBUSY; 47 case EEXIST: 48 return FILEIO_EEXIST; 49 case ENODEV: 50 return FILEIO_ENODEV; 51 case ENOTDIR: 52 return FILEIO_ENOTDIR; 53 case EISDIR: 54 return FILEIO_EISDIR; 55 case EINVAL: 56 return FILEIO_EINVAL; 57 case ENFILE: 58 return FILEIO_ENFILE; 59 case EMFILE: 60 return FILEIO_EMFILE; 61 case EFBIG: 62 return FILEIO_EFBIG; 63 case ENOSPC: 64 return FILEIO_ENOSPC; 65 case ESPIPE: 66 return FILEIO_ESPIPE; 67 case EROFS: 68 return FILEIO_EROFS; 69 case ENOSYS: 70 return FILEIO_ENOSYS; 71 case ENAMETOOLONG: 72 return FILEIO_ENAMETOOLONG; 73 } 74 return FILEIO_EUNKNOWN; 75 } 76 77 /* See fileio.h. */ 78 79 int 80 fileio_error_to_host (fileio_error errnum) 81 { 82 switch (errnum) 83 { 84 case FILEIO_EPERM: 85 return EPERM; 86 case FILEIO_ENOENT: 87 return ENOENT; 88 case FILEIO_EINTR: 89 return EINTR; 90 case FILEIO_EIO: 91 return EIO; 92 case FILEIO_EBADF: 93 return EBADF; 94 case FILEIO_EACCES: 95 return EACCES; 96 case FILEIO_EFAULT: 97 return EFAULT; 98 case FILEIO_EBUSY: 99 return EBUSY; 100 case FILEIO_EEXIST: 101 return EEXIST; 102 case FILEIO_ENODEV: 103 return ENODEV; 104 case FILEIO_ENOTDIR: 105 return ENOTDIR; 106 case FILEIO_EISDIR: 107 return EISDIR; 108 case FILEIO_EINVAL: 109 return EINVAL; 110 case FILEIO_ENFILE: 111 return ENFILE; 112 case FILEIO_EMFILE: 113 return EMFILE; 114 case FILEIO_EFBIG: 115 return EFBIG; 116 case FILEIO_ENOSPC: 117 return ENOSPC; 118 case FILEIO_ESPIPE: 119 return ESPIPE; 120 case FILEIO_EROFS: 121 return EROFS; 122 case FILEIO_ENOSYS: 123 return ENOSYS; 124 case FILEIO_ENAMETOOLONG: 125 return ENAMETOOLONG; 126 } 127 return -1; 128 } 129 130 /* See fileio.h. */ 131 132 int 133 fileio_to_host_openflags (int fileio_open_flags, int *open_flags_p) 134 { 135 int open_flags = 0; 136 137 if (fileio_open_flags & ~FILEIO_O_SUPPORTED) 138 return -1; 139 140 if (fileio_open_flags & FILEIO_O_CREAT) 141 open_flags |= O_CREAT; 142 if (fileio_open_flags & FILEIO_O_EXCL) 143 open_flags |= O_EXCL; 144 if (fileio_open_flags & FILEIO_O_TRUNC) 145 open_flags |= O_TRUNC; 146 if (fileio_open_flags & FILEIO_O_APPEND) 147 open_flags |= O_APPEND; 148 if (fileio_open_flags & FILEIO_O_RDONLY) 149 open_flags |= O_RDONLY; 150 if (fileio_open_flags & FILEIO_O_WRONLY) 151 open_flags |= O_WRONLY; 152 if (fileio_open_flags & FILEIO_O_RDWR) 153 open_flags |= O_RDWR; 154 /* On systems supporting binary and text mode, always open files 155 in binary mode. */ 156 #ifdef O_BINARY 157 open_flags |= O_BINARY; 158 #endif 159 160 *open_flags_p = open_flags; 161 return 0; 162 } 163 164 /* See fileio.h. */ 165 166 int 167 fileio_to_host_mode (int fileio_mode, mode_t *mode_p) 168 { 169 mode_t mode = 0; 170 171 if (fileio_mode & ~FILEIO_S_SUPPORTED) 172 return -1; 173 174 if (fileio_mode & FILEIO_S_IFREG) 175 mode |= S_IFREG; 176 if (fileio_mode & FILEIO_S_IFDIR) 177 mode |= S_IFDIR; 178 if (fileio_mode & FILEIO_S_IFCHR) 179 mode |= S_IFCHR; 180 if (fileio_mode & FILEIO_S_IRUSR) 181 mode |= S_IRUSR; 182 if (fileio_mode & FILEIO_S_IWUSR) 183 mode |= S_IWUSR; 184 if (fileio_mode & FILEIO_S_IXUSR) 185 mode |= S_IXUSR; 186 #ifdef S_IRGRP 187 if (fileio_mode & FILEIO_S_IRGRP) 188 mode |= S_IRGRP; 189 #endif 190 #ifdef S_IWGRP 191 if (fileio_mode & FILEIO_S_IWGRP) 192 mode |= S_IWGRP; 193 #endif 194 #ifdef S_IXGRP 195 if (fileio_mode & FILEIO_S_IXGRP) 196 mode |= S_IXGRP; 197 #endif 198 if (fileio_mode & FILEIO_S_IROTH) 199 mode |= S_IROTH; 200 #ifdef S_IWOTH 201 if (fileio_mode & FILEIO_S_IWOTH) 202 mode |= S_IWOTH; 203 #endif 204 #ifdef S_IXOTH 205 if (fileio_mode & FILEIO_S_IXOTH) 206 mode |= S_IXOTH; 207 #endif 208 209 *mode_p = mode; 210 return 0; 211 } 212 213 /* Convert a host-format mode_t into a bitmask of File-I/O flags. */ 214 215 static LONGEST 216 fileio_mode_pack (mode_t mode) 217 { 218 mode_t tmode = 0; 219 220 if (S_ISREG (mode)) 221 tmode |= FILEIO_S_IFREG; 222 if (S_ISDIR (mode)) 223 tmode |= FILEIO_S_IFDIR; 224 if (S_ISCHR (mode)) 225 tmode |= FILEIO_S_IFCHR; 226 if (mode & S_IRUSR) 227 tmode |= FILEIO_S_IRUSR; 228 if (mode & S_IWUSR) 229 tmode |= FILEIO_S_IWUSR; 230 if (mode & S_IXUSR) 231 tmode |= FILEIO_S_IXUSR; 232 #ifdef S_IRGRP 233 if (mode & S_IRGRP) 234 tmode |= FILEIO_S_IRGRP; 235 #endif 236 #ifdef S_IWGRP 237 if (mode & S_IWGRP) 238 tmode |= FILEIO_S_IWGRP; 239 #endif 240 #ifdef S_IXGRP 241 if (mode & S_IXGRP) 242 tmode |= FILEIO_S_IXGRP; 243 #endif 244 if (mode & S_IROTH) 245 tmode |= FILEIO_S_IROTH; 246 #ifdef S_IWOTH 247 if (mode & S_IWOTH) 248 tmode |= FILEIO_S_IWOTH; 249 #endif 250 #ifdef S_IXOTH 251 if (mode & S_IXOTH) 252 tmode |= FILEIO_S_IXOTH; 253 #endif 254 return tmode; 255 } 256 257 /* Pack a host-format mode_t into an fio_mode_t. */ 258 259 static void 260 host_to_fileio_mode (mode_t num, fio_mode_t fnum) 261 { 262 host_to_bigendian (fileio_mode_pack (num), (char *) fnum, 4); 263 } 264 265 /* Pack a host-format integer into an fio_ulong_t. */ 266 267 static void 268 host_to_fileio_ulong (LONGEST num, fio_ulong_t fnum) 269 { 270 host_to_bigendian (num, (char *) fnum, 8); 271 } 272 273 /* See fileio.h. */ 274 275 void 276 host_to_fileio_stat (struct stat *st, struct fio_stat *fst) 277 { 278 LONGEST blksize; 279 280 host_to_fileio_uint ((long) st->st_dev, fst->fst_dev); 281 host_to_fileio_uint ((long) st->st_ino, fst->fst_ino); 282 host_to_fileio_mode (st->st_mode, fst->fst_mode); 283 host_to_fileio_uint ((long) st->st_nlink, fst->fst_nlink); 284 host_to_fileio_uint ((long) st->st_uid, fst->fst_uid); 285 host_to_fileio_uint ((long) st->st_gid, fst->fst_gid); 286 host_to_fileio_uint ((long) st->st_rdev, fst->fst_rdev); 287 host_to_fileio_ulong ((LONGEST) st->st_size, fst->fst_size); 288 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE 289 blksize = st->st_blksize; 290 #else 291 blksize = 512; 292 #endif 293 host_to_fileio_ulong (blksize, fst->fst_blksize); 294 #if HAVE_STRUCT_STAT_ST_BLOCKS 295 host_to_fileio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks); 296 #else 297 /* FIXME: This is correct for DJGPP, but other systems that don't 298 have st_blocks, if any, might prefer 512 instead of st_blksize. 299 (eliz, 30-12-2003) */ 300 host_to_fileio_ulong (((LONGEST) st->st_size + blksize - 1) 301 / blksize, 302 fst->fst_blocks); 303 #endif 304 host_to_fileio_time (st->st_atime, fst->fst_atime); 305 host_to_fileio_time (st->st_mtime, fst->fst_mtime); 306 host_to_fileio_time (st->st_ctime, fst->fst_ctime); 307 } 308