xref: /netbsd-src/external/gpl3/gdb/dist/gdbsupport/fileio.cc (revision f8cf1a9151c7af1cb0bd8b09c13c66bca599c027)
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