wmem: allow wmem_destroy_list to ignore a NULL list.
[metze/wireshark/wip.git] / wsutil / file_util.h
1 /* file_util.h
2  * File utility definitions
3  *
4  * Wireshark - Network traffic analyzer
5  * By Gerald Combs <gerald@wireshark.org>
6  * Copyright 1998 Gerald Combs
7  *
8  * SPDX-License-Identifier: GPL-2.0-or-later
9  */
10
11 #ifndef __FILE_UTIL_H__
12 #define __FILE_UTIL_H__
13
14 #include "config.h"
15
16 #include "ws_symbol_export.h"
17
18 #ifdef __cplusplus
19 extern "C" {
20 #endif /* __cplusplus */
21
22 #include <glib.h>
23
24 #ifdef _WIN32
25 #include <io.h>         /* for _read(), _write(), etc. */
26 #include <gmodule.h>
27 #endif
28
29 #ifdef HAVE_FCNTL_H
30 #include <fcntl.h>      /* for open() */
31 #endif
32
33 #ifdef HAVE_UNISTD_H
34 #include <unistd.h>     /* for read(), write(), close(), etc. */
35 #endif
36
37 #include <sys/stat.h>   /* for stat() and struct stat */
38
39 /*
40  * Visual C++ on Win32 systems doesn't define these.  (Old UNIX systems don't
41  * define them either.)
42  *
43  * Visual C++ on Win32 systems doesn't define S_IFIFO, it defines _S_IFIFO.
44  */
45 #ifndef S_ISREG
46 #define S_ISREG(mode)   (((mode) & S_IFMT) == S_IFREG)
47 #endif
48 #ifndef S_IFIFO
49 #define S_IFIFO _S_IFIFO
50 #endif
51 #ifndef S_ISFIFO
52 #define S_ISFIFO(mode)  (((mode) & S_IFMT) == S_IFIFO)
53 #endif
54 #ifndef S_ISDIR
55 #define S_ISDIR(mode)   (((mode) & S_IFMT) == S_IFDIR)
56 #endif
57
58 #include <stdio.h>
59
60 #ifdef _WIN32
61
62 /*
63  * The structure to pass to ws_stat64() and ws_fstat64().
64  */
65 #define ws_statb64      struct _stat64
66
67 /*  Win32 (and Win64): we use UTF-8 for filenames and pathnames throughout
68  *  the code, so file functions must convert filenames and pathnames from
69  *  UTF-8 to UTF-16 as we use NT Unicode (Win9x - now unsupported - used
70  *  locale-based encoding here).  Microsoft's UN*X-style wrappers don't
71  *  do that - they expect locale-based encodings - so we need our own
72  *  wrappers.  (We don't use the wrappers from GLib as that would, at
73  *  least for the wrappers that return file descriptors or take them
74  *  as arguments, require that we use the version of the C runtime with
75  *  which the GLib binaries were built, and we can't guarantee to do that.)
76  *
77  *  Note also that ws_stdio_rename() uses MoveFileEx() with
78  *  MOVEFILE_REPLACE_EXISTING, so that it acts like UN*X rename(),
79  *  removing the target if necessary.
80  */
81
82 WS_DLL_PUBLIC int ws_stdio_open (const gchar *filename, int flags, int mode);
83 WS_DLL_PUBLIC int ws_stdio_rename (const gchar *oldfilename, const gchar *newfilename);
84 WS_DLL_PUBLIC int ws_stdio_mkdir (const gchar *filename, int mode);
85 WS_DLL_PUBLIC int ws_stdio_stat64 (const gchar *filename, ws_statb64 *buf);
86 WS_DLL_PUBLIC int ws_stdio_unlink (const gchar *filename);
87 WS_DLL_PUBLIC int ws_stdio_remove (const gchar *filename);
88
89 WS_DLL_PUBLIC FILE * ws_stdio_fopen (const gchar *filename, const gchar *mode);
90 WS_DLL_PUBLIC FILE * ws_stdio_freopen (const gchar *filename, const gchar *mode, FILE *stream);
91
92 #define ws_open         ws_stdio_open
93 #define ws_rename       ws_stdio_rename
94 #define ws_mkdir        ws_stdio_mkdir
95 #define ws_stat64       ws_stdio_stat64
96 #define ws_unlink       ws_stdio_unlink
97 #define ws_remove       ws_stdio_remove
98 #define ws_fopen        ws_stdio_fopen
99 #define ws_freopen      ws_stdio_freopen
100
101 /*
102  * These routines don't take pathnames, so they don't require
103  * pathname-converting wrappers on Windows.
104  */
105 #define ws_read    _read
106 #define ws_write   _write
107 #define ws_close   _close
108 #define ws_dup     _dup
109 #define ws_fseek64 _fseeki64    /* use _fseeki64 for 64-bit offset support */
110 #define ws_fstat64 _fstati64    /* use _fstati64 for 64-bit size support */
111 #define ws_ftell64 _ftelli64    /* use _ftelli64 for 64-bit offset support */
112 #define ws_lseek64 _lseeki64    /* use _lseeki64 for 64-bit offset support */
113 #define ws_fdopen  _fdopen
114 #define ws_fileno  _fileno
115 #define ws_isatty  _isatty
116 #define ws_getc_unlocked _fgetc_nolock
117
118 /*
119  * Other CRT functions. getpid probably belongs in sys_util.h or proc_util.h
120  * but neither yet exist.
121  */
122 #define ws_getpid  _getpid
123 #define ws_umask  _umask
124
125 /* DLL loading */
126
127 /** Try to remove the current directory from the DLL search path.
128  * SetDllDirectory is tried, then SetCurrentDirectory(program_dir)
129  *
130  * @return TRUE if we were able to call SetDllDirectory, FALSE otherwise.
131  */
132 WS_DLL_PUBLIC
133 gboolean ws_init_dll_search_path();
134
135 /** Load a DLL using LoadLibrary.
136  * Only the system and program directories are searched.
137  *
138  * @param library_name The name of the DLL.
139  * @return A handle to the DLL if found, NULL on failure.
140  */
141
142 WS_DLL_PUBLIC
143 void *ws_load_library(const gchar *library_name);
144
145 /** Load a DLL using g_module_open.
146  * Only the system and program directories are searched.
147  *
148  * @param module_name The name of the DLL.
149  * @param flags Flags to be passed to g_module_open.
150  * @return A handle to the DLL if found, NULL on failure.
151  */
152 WS_DLL_PUBLIC
153 GModule *ws_module_open(gchar *module_name, GModuleFlags flags);
154
155 /** Create or open a "Wireshark is running" mutex.
156  * Create or open a mutex which signals that Wireshark or its associated
157  * executables is running. Used by the installer to test for a running application.
158  */
159 WS_DLL_PUBLIC void create_app_running_mutex();
160
161 /** Close our "Wireshark is running" mutex.
162  */
163 WS_DLL_PUBLIC void close_app_running_mutex();
164
165 #else   /* _WIN32 */
166
167 /*
168  * The structure to pass to ws_fstat64().
169  */
170 #define ws_statb64      struct stat
171
172 /* Not Windows, presumed to be UN*X-compatible */
173 #define ws_open                 open
174 #define ws_rename               rename
175 #define ws_mkdir(dir,mode)      mkdir(dir,mode)
176 #define ws_stat64               stat
177 #define ws_unlink               unlink
178 #define ws_remove               remove
179 #define ws_fopen                fopen
180 #define ws_freopen              freopen
181
182 #define ws_read    read
183 #define ws_write   write
184 #ifdef __cplusplus
185 /*
186  * Just in case this is used in a class with a close method or member.
187  */
188 #define ws_close   ::close
189 #else
190 #define ws_close   close
191 #endif
192 #define ws_dup     dup
193 #ifdef HAVE_FSEEKO
194 #define ws_fseek64 fseeko       /* AC_SYS_LARGEFILE should make off_t 64-bit */
195 #define ws_ftell64 ftello       /* AC_SYS_LARGEFILE should make off_t 64-bit */
196 #else
197 #define ws_fseek64(fh,offset,whence)    fseek(fh,(long)(offset),whence)
198 #define ws_ftell64 ftell
199 #endif
200 #define ws_fstat64 fstat        /* AC_SYS_LARGEFILE should make off_t 64-bit */
201 #define ws_lseek64 lseek        /* AC_SYS_LARGEFILE should make off_t 64-bit */
202 #define ws_fdopen  fdopen
203 #define ws_fileno  fileno
204 #define ws_isatty  isatty
205 #define ws_getc_unlocked getc_unlocked
206 #define O_BINARY   0            /* Win32 needs the O_BINARY flag for open() */
207
208 /* Other CRT functions */
209 #define ws_getpid  getpid
210 #define ws_umask   umask
211
212 #endif /* _WIN32 */
213
214 /* directory handling */
215 #define WS_DIR                          GDir
216 #define WS_DIRENT                       const char
217 #define ws_dir_open                     g_dir_open
218 #define ws_dir_read_name                g_dir_read_name
219 #define ws_dir_get_name(dirent)         dirent
220 #define ws_dir_rewind                   g_dir_rewind
221 #define ws_dir_close                    g_dir_close
222
223 /* XXX - remove include "sys/stat.h" from files that include this header */
224 /* XXX - update docs (e.g. README.developer) */
225
226 #ifdef __cplusplus
227 }
228 #endif /* __cplusplus */
229
230 #endif /* __FILE_UTIL_H__ */