- fix: extra newline in many error messages (#23947).
[platform/upstream/rpm.git] / rpmio / rpmio.h
1 #ifndef H_RPMIO
2 #define H_RPMIO
3
4 /** \ingroup rpmio
5  * \file rpmio/rpmio.h
6  *
7  */
8
9 #include <sys/types.h>
10 #include <sys/stat.h>
11 #include <dirent.h>
12 #include <glob.h>
13 #include <stdio.h>
14 #include <stdlib.h>
15 #include <unistd.h>
16
17 /** \ingroup rpmio
18  * Hide libio API lossage.
19  * The libio interface changed after glibc-2.1.3 to pass the seek offset
20  * argument as a pointer rather than as an off_t. The snarl below defines
21  * typedefs to isolate the lossage.
22  * API unchanged.
23  */
24 /*@{*/
25 #if !defined(__LCLINT__) && defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 2
26 #define USE_COOKIE_SEEK_POINTER 1
27 typedef _IO_off64_t     _libio_off_t;
28 typedef _libio_off_t *  _libio_pos_t;
29 #else
30 typedef off_t           _libio_off_t;
31 typedef off_t           _libio_pos_t;
32 #endif
33 /*@}*/
34
35 /** \ingroup rpmio
36  */
37 typedef /*@abstract@*/ /*@refcounted@*/ struct _FD_s * FD_t;
38
39 /** \ingroup rpmio
40  */
41 typedef /*@observer@*/ struct FDIO_s * FDIO_t;
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 /** \ingroup rpmio
48  * \name RPMIO Vectors.
49  */
50 /*@{*/
51
52 /** \ingroup rpmio
53  */
54 typedef ssize_t fdio_read_function_t (void *cookie, char *buf, size_t nbytes);
55
56 /** \ingroup rpmio
57  */
58 typedef ssize_t fdio_write_function_t (void *cookie, const char *buf, size_t nbytes);
59
60 /** \ingroup rpmio
61  */
62 typedef int fdio_seek_function_t (void *cookie, _libio_pos_t pos, int whence);
63
64 /** \ingroup rpmio
65  */
66 typedef int fdio_close_function_t (void *cookie);
67
68
69 /** \ingroup rpmio
70  */
71 typedef /*@only@*/ /*@null@*/ FD_t fdio_ref_function_t ( /*@only@*/ void * cookie,
72                 const char * msg, const char * file, unsigned line);
73
74 /** \ingroup rpmio
75  */
76 typedef /*@only@*/ /*@null@*/ FD_t fdio_deref_function_t ( /*@only@*/ FD_t fd,
77                 const char * msg, const char * file, unsigned line);
78
79
80 /** \ingroup rpmio
81  */
82 typedef /*@only@*/ /*@null@*/ FD_t fdio_new_function_t (const char * msg,
83                 const char * file, unsigned line);
84
85
86 /** \ingroup rpmio
87  */
88 typedef int fdio_fileno_function_t (void * cookie);
89
90
91 /** \ingroup rpmio
92  */
93 typedef FD_t fdio_open_function_t (const char * path, int flags, mode_t mode);
94
95 /** \ingroup rpmio
96  */
97 typedef FD_t fdio_fopen_function_t (const char * path, const char * fmode);
98
99 /** \ingroup rpmio
100  */
101 typedef void * fdio_ffileno_function_t (FD_t fd);
102
103 /** \ingroup rpmio
104  */
105 typedef int fdio_fflush_function_t (FD_t fd);
106 /*@}*/
107
108
109 /** \ingroup rpmrpc
110  * \name RPMRPC Vectors.
111  */
112 /*@{*/
113 typedef int fdio_mkdir_function_t (const char * path, mode_t mode);
114 typedef int fdio_chdir_function_t (const char * path);
115 typedef int fdio_rmdir_function_t (const char * path);
116 typedef int fdio_rename_function_t (const char * oldpath, const char * newpath);
117 typedef int fdio_unlink_function_t (const char * path);
118 typedef int fdio_stat_function_t (const char * path, struct stat * st);
119 typedef int fdio_lstat_function_t (const char * path, struct stat * st);
120 typedef int fdio_access_function_t (const char * path, int amode);
121 /*@}*/
122
123
124 /** \ingroup rpmio
125  */
126 struct FDIO_s {
127   fdio_read_function_t *        read;
128   fdio_write_function_t *       write;
129   fdio_seek_function_t *        seek;
130   fdio_close_function_t *       close;
131
132   fdio_ref_function_t *         _fdref;
133   fdio_deref_function_t *       _fdderef;
134   fdio_new_function_t *         _fdnew;
135   fdio_fileno_function_t *      _fileno;
136
137   fdio_open_function_t *        _open;
138   fdio_fopen_function_t *       _fopen;
139   fdio_ffileno_function_t *     _ffileno;
140   fdio_fflush_function_t *      _fflush;
141
142   fdio_mkdir_function_t *       _mkdir;
143   fdio_chdir_function_t *       _chdir;
144   fdio_rmdir_function_t *       _rmdir;
145   fdio_rename_function_t *      _rename;
146   fdio_unlink_function_t *      _unlink;
147 };
148
149
150 /** \ingroup rpmio
151  * \name RPMIO Interface.
152  */
153 /*@{*/
154
155 /** \ingroup rpmio
156  * strerror(3) clone.
157  */
158 /*@observer@*/ const char * Fstrerror(FD_t fd);
159
160 /** \ingroup rpmio
161  * fread(3) clone.
162  */
163 size_t  Fread   (/*@out@*/ void * buf, size_t size, size_t nmemb, FD_t fd);
164
165 /** \ingroup rpmio
166  * fwrite(3) clone.
167  */
168 size_t  Fwrite  (const void *buf, size_t size, size_t nmemb, FD_t fd);
169
170
171 /** \ingroup rpmio
172  * fseek(3) clone.
173  */
174 int     Fseek   (FD_t fd, _libio_off_t offset, int whence);
175
176 /** \ingroup rpmio
177  * fclose(3) clone.
178  */
179 int     Fclose  ( /*@killref@*/ FD_t fd);
180
181 /** \ingroup rpmio
182  */
183 FD_t    Fdopen  (FD_t fd, const char * fmode);
184
185 /** \ingroup rpmio
186  * fopen(3) clone.
187  */
188 FD_t    Fopen   (const char * path, const char * fmode);
189
190
191 /** \ingroup rpmio
192  * fflush(3) clone.
193  */
194 int     Fflush  (FD_t fd);
195
196 /** \ingroup rpmio
197  * ferror(3) clone.
198  */
199 int     Ferror  (FD_t fd);
200
201 /** \ingroup rpmio
202  * fileno(3) clone.
203  */
204 int     Fileno  (FD_t fd);
205
206
207 /** \ingroup rpmio
208  * fcntl(2) clone.
209  */
210 int     Fcntl   (FD_t fd, int op, void *lip);
211
212 /** \ingroup rpmio
213  * pread(2) clone.
214  */
215 ssize_t Pread(FD_t fd, void * buf, size_t count, _libio_off_t offset);
216
217 /** \ingroup rpmio
218  * pwrite(2) clone.
219  */
220 ssize_t Pwrite(FD_t fd, const void * buf, size_t count, _libio_off_t offset);
221 /*@}*/
222
223 /** \ingroup rpmrpc
224  * \name RPMRPC Interface.
225  */
226 /*@{*/
227
228 /** \ingroup rpmrpc
229  * mkdir(2) clone.
230  */
231 int     Mkdir   (const char * path, mode_t mode);
232
233 /** \ingroup rpmrpc
234  * chdir(2) clone.
235  */
236 int     Chdir   (const char * path);
237
238 /** \ingroup rpmrpc
239  * rmdir(2) clone.
240  */
241 int     Rmdir   (const char * path);
242
243 /** \ingroup rpmrpc
244  * rename(2) clone.
245  */
246 int     Rename  (const char * oldpath, const char * newpath);
247
248 /** \ingroup rpmrpc
249  * link(2) clone.
250  */
251 int     Link    (const char * oldpath, const char * newpath);
252
253 /** \ingroup rpmrpc
254  * unlink(2) clone.
255  */
256 int     Unlink  (const char * path);
257
258 /** \ingroup rpmrpc
259  * readlink(2) clone.
260  */
261 int     Readlink(const char * path, char * buf, size_t bufsiz);
262
263
264 /** \ingroup rpmrpc
265  * stat(2) clone.
266  */
267 int     Stat    (const char * path, /*@out@*/ struct stat * st);
268
269 /** \ingroup rpmrpc
270  * lstat(2) clone.
271  */
272 int     Lstat   (const char * path, /*@out@*/ struct stat * st);
273
274 /** \ingroup rpmrpc
275  * access(2) clone.
276  */
277 int     Access  (const char * path, int amode);
278
279
280 /** \ingroup rpmrpc
281  * glob(3) clone.
282  */
283 int     Glob    (const char * pattern, int flags,
284                 int errfunc(const char * epath, int eerrno), /*@out@*/ glob_t * pglob);
285
286 /** \ingroup rpmrpc
287  * globfree(3) clone.
288  */
289 void    Globfree( /*@only@*/ glob_t * pglob);
290
291
292 /** \ingroup rpmrpc
293  * opendir(3) clone.
294  */
295 DIR *   Opendir (const char * name);
296
297 /** \ingroup rpmrpc
298  * readdir(3) clone.
299  */
300 struct dirent * Readdir (DIR * dir);
301
302 /** \ingroup rpmrpc
303  * closedir(3) clone.
304  */
305 int     Closedir(DIR * dir);
306 /*@}*/
307
308
309 /** \ingroup rpmio
310  * \name RPMIO Utilities.
311  */
312 /*@{*/
313
314 /** \ingroup rpmio
315  */
316 off_t   fdSize  (FD_t fd);
317
318 /** \ingroup rpmio
319  */
320 /*@null@*/ FD_t fdDup(int fdno);
321 #ifdef UNUSED
322 /*@null@*/ FILE *fdFdopen( /*@only@*/ void * cookie, const char * mode);
323 #endif
324
325 /* XXX Legacy interfaces needed by gnorpm, rpmfind et al */
326
327 /** \ingroup rpmio
328  */
329 /*@-shadow@*/
330 int     fdFileno(void * cookie);
331 /*@=shadow@*/
332
333
334 /** \ingroup rpmio
335  */
336 /*@null@*/ FD_t fdOpen(const char *path, int flags, mode_t mode);
337
338 /** \ingroup rpmio
339  */
340 ssize_t fdRead(void * cookie, /*@out@*/ char * buf, size_t count);
341
342 /** \ingroup rpmio
343  */
344 ssize_t fdWrite(void * cookie, const char * buf, size_t count);
345
346 /** \ingroup rpmio
347  */
348 int     fdClose( /*@only@*/ void * cookie);
349
350 /* XXX FD_t reference count debugging wrappers */
351 #define fdLink(_fd, _msg)       fdio->_fdref(_fd, _msg, __FILE__, __LINE__)
352 #define fdFree(_fd, _msg)       fdio->_fdderef(_fd, _msg, __FILE__, __LINE__)
353 #define fdNew(_msg)             fdio->_fdnew(_msg, __FILE__, __LINE__)
354
355
356 /** \ingroup rpmio
357  */
358 int     fdWritable(FD_t fd, int secs);
359
360 /** \ingroup rpmio
361  */
362 int     fdReadable(FD_t fd, int secs);
363
364 /** \ingroup rpmio
365  * FTP and HTTP error codes.
366  */
367 typedef enum ftperrCode_e {
368     FTPERR_BAD_SERVER_RESPONSE  = -1,   /*!< Bad server response */
369     FTPERR_SERVER_IO_ERROR      = -2,   /*!< Server I/O error */
370     FTPERR_SERVER_TIMEOUT       = -3,   /*!< Server timeout */
371     FTPERR_BAD_HOST_ADDR        = -4,   /*!< Unable to lookup server host address */
372     FTPERR_BAD_HOSTNAME         = -5,   /*!< Unable to lookup server host name */
373     FTPERR_FAILED_CONNECT       = -6,   /*!< Failed to connect to server */
374     FTPERR_FILE_IO_ERROR        = -7,   /*!< Failed to establish data connection to server */
375     FTPERR_PASSIVE_ERROR        = -8,   /*!< I/O error to local file */
376     FTPERR_FAILED_DATA_CONNECT  = -9,   /*!< Error setting remote server to passive mode */
377     FTPERR_FILE_NOT_FOUND       = -10,  /*!< File not found on server */
378     FTPERR_NIC_ABORT_IN_PROGRESS= -11,  /*!< Abort in progress */
379     FTPERR_UNKNOWN              = -100  /*!< Unknown or unexpected error */
380 } ftperrCode;
381
382 /** \ingroup rpmio
383  */
384 /*@observer@*/ const char *const ftpStrerror(int errorNumber);
385
386 /** \ingroup rpmio
387  */
388 /*@dependent@*/ /*@null@*/ void * ufdGetUrlinfo(FD_t fd);
389
390 /** \ingroup rpmio
391  */
392 /*@observer@*/ const char * urlStrerror(const char * url);
393
394 /** \ingroup rpmio
395  */
396 int     ufdCopy(FD_t sfd, FD_t tfd);
397
398 /** \ingroup rpmio
399  */
400 int     ufdGetFile( /*@killref@*/ FD_t sfd, FD_t tfd);
401
402 /** \ingroup rpmio
403  */
404 int     timedRead(FD_t fd, /*@out@*/ void * bufptr, int length);
405 #define timedRead       ufdio->read
406
407
408 /** \ingroup rpmio
409  */
410 /*@observer@*/ extern FDIO_t fdio;
411
412 /** \ingroup rpmio
413  */
414 /*@observer@*/ extern FDIO_t fpio;
415
416 /** \ingroup rpmio
417  */
418 /*@observer@*/ extern FDIO_t ufdio;
419
420 /** \ingroup rpmio
421  */
422 /*@observer@*/ extern FDIO_t gzdio;
423
424 /** \ingroup rpmio
425  */
426 /*@observer@*/ extern FDIO_t bzdio;
427
428 /** \ingroup rpmio
429  */
430 /*@observer@*/ extern FDIO_t fadio;
431 /*@}*/
432
433 /** \ingroup rpmio
434  * Locale insensitive strcasecmp(3).
435  */
436 int xstrcasecmp(const char *s1, const char * s2)                /*@*/;
437
438 /** \ingroup rpmio
439  * Locale insensitive strncasecmp(3).
440  */
441 int xstrncasecmp(const char *s1, const char * s2, size_t n)     /*@*/;
442
443 #ifdef __cplusplus
444 }
445 #endif
446
447 #endif  /* H_RPMIO */