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