LCOV - code coverage report
Current view: top level - glib - gstdio.h (source / functions) Coverage Total Hit
Test: unnamed Lines: 100.0 % 11 11
Test Date: 2024-11-26 05:23:01 Functions: 100.0 % 2 2
Branches: - 0 0

             Branch data     Line data    Source code
       1                 :             : /* gstdio.h - GFilename wrappers for C library functions
       2                 :             :  *
       3                 :             :  * Copyright 2004 Tor Lillqvist
       4                 :             :  *
       5                 :             :  * SPDX-License-Identifier: LGPL-2.1-or-later
       6                 :             :  *
       7                 :             :  * This library is free software; you can redistribute it and/or
       8                 :             :  * modify it under the terms of the GNU Lesser General Public
       9                 :             :  * License as published by the Free Software Foundation; either
      10                 :             :  * version 2.1 of the License, or (at your option) any later version.
      11                 :             :  *
      12                 :             :  * This library 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 GNU
      15                 :             :  * Lesser General Public License for more details.
      16                 :             :  *
      17                 :             :  * You should have received a copy of the GNU Lesser General Public License
      18                 :             :  * along with this library; if not, see <http://www.gnu.org/licenses/>.
      19                 :             :  */
      20                 :             : 
      21                 :             : #ifndef __G_STDIO_H__
      22                 :             : #define __G_STDIO_H__
      23                 :             : 
      24                 :             : #include <glib/gprintf.h>
      25                 :             : 
      26                 :             : #include <errno.h>
      27                 :             : #include <sys/stat.h>
      28                 :             : 
      29                 :             : G_BEGIN_DECLS
      30                 :             : 
      31                 :             : #if (defined (__MINGW64_VERSION_MAJOR) || defined (_MSC_VER)) && !defined(_WIN64)
      32                 :             : 
      33                 :             : /* Make it clear that we mean the struct with 32-bit st_size and
      34                 :             :  * 32-bit st_*time fields as that is how the 32-bit GLib DLL normally
      35                 :             :  * has been compiled. If you get a compiler warning when calling
      36                 :             :  * g_stat(), do take it seriously and make sure that the type of
      37                 :             :  * struct stat the code in GLib fills in matches the struct the type
      38                 :             :  * of struct stat you pass to g_stat(). To avoid hassle, to get file
      39                 :             :  * attributes just use the GIO API instead which doesn't use struct
      40                 :             :  * stat.
      41                 :             :  *
      42                 :             :  * Sure, it would be nicer to use a struct with 64-bit st_size and
      43                 :             :  * 64-bit st_*time fields, but changing that now would break ABI. And
      44                 :             :  * in MinGW, a plain "struct stat" is the one with 32-bit st_size and
      45                 :             :  * st_*time fields.
      46                 :             :  */
      47                 :             : 
      48                 :             : typedef struct _stat32 GStatBuf;
      49                 :             : 
      50                 :             : #elif defined(__MINGW64_VERSION_MAJOR) && defined(_WIN64)
      51                 :             : 
      52                 :             : typedef struct _stat64 GStatBuf;
      53                 :             : 
      54                 :             : #else
      55                 :             : 
      56                 :             : typedef struct stat GStatBuf;
      57                 :             : 
      58                 :             : #endif
      59                 :             : 
      60                 :             : #if defined(G_OS_UNIX) && !defined(G_STDIO_WRAP_ON_UNIX) && !defined(__GI_SCANNER__)
      61                 :             : 
      62                 :             : /* Just pass on to the system functions, so there's no potential for data
      63                 :             :  * format mismatches, especially with large file interfaces. 
      64                 :             :  * A few functions can't be handled in this way, since they are not defined
      65                 :             :  * in a portable system header that we could include here.
      66                 :             :  *
      67                 :             :  * G_STDIO_WRAP_ON_UNIX is not public API and its behaviour is not guaranteed
      68                 :             :  * in future.
      69                 :             :  */
      70                 :             : 
      71                 :             : #ifndef __GTK_DOC_IGNORE__
      72                 :             : #define g_chmod   chmod
      73                 :             : #define g_open    open
      74                 :             : #define g_creat   creat
      75                 :             : #define g_rename  rename
      76                 :             : #define g_mkdir   mkdir
      77                 :             : #define g_stat    stat
      78                 :             : #define g_lstat   lstat
      79                 :             : #define g_remove  remove
      80                 :             : #define g_fopen   fopen
      81                 :             : #define g_freopen freopen
      82                 :             : #define g_fsync   fsync
      83                 :             : #define g_utime   utime
      84                 :             : #endif
      85                 :             : 
      86                 :             : GLIB_AVAILABLE_IN_ALL
      87                 :             : int g_access (const gchar *filename,
      88                 :             :               int          mode);
      89                 :             : 
      90                 :             : GLIB_AVAILABLE_IN_ALL
      91                 :             : int g_chdir  (const gchar *path);
      92                 :             : 
      93                 :             : GLIB_AVAILABLE_IN_ALL
      94                 :             : int g_unlink (const gchar *filename);
      95                 :             : 
      96                 :             : GLIB_AVAILABLE_IN_ALL
      97                 :             : int g_rmdir  (const gchar *filename);
      98                 :             : 
      99                 :             : #else /* ! G_OS_UNIX */
     100                 :             : 
     101                 :             : /* Wrappers for C library functions that take pathname arguments. On
     102                 :             :  * Unix, the pathname is a file name as it literally is in the file
     103                 :             :  * system. On well-maintained systems with consistent users who know
     104                 :             :  * what they are doing and no exchange of files with others this would
     105                 :             :  * be a well-defined encoding, preferably UTF-8. On Windows, the
     106                 :             :  * pathname is always in UTF-8, even if that is not the on-disk
     107                 :             :  * encoding, and not the encoding accepted by the C library or Win32
     108                 :             :  * API.
     109                 :             :  */
     110                 :             : 
     111                 :             : GLIB_AVAILABLE_IN_ALL
     112                 :             : int g_access    (const gchar *filename,
     113                 :             :                  int          mode);
     114                 :             : 
     115                 :             : GLIB_AVAILABLE_IN_ALL
     116                 :             : int g_chmod     (const gchar *filename,
     117                 :             :                  int          mode);
     118                 :             : 
     119                 :             : GLIB_AVAILABLE_IN_ALL
     120                 :             : int g_open      (const gchar *filename,
     121                 :             :                  int          flags,
     122                 :             :                  int          mode);
     123                 :             : 
     124                 :             : GLIB_AVAILABLE_IN_ALL
     125                 :             : int g_creat     (const gchar *filename,
     126                 :             :                  int          mode);
     127                 :             : 
     128                 :             : GLIB_AVAILABLE_IN_ALL
     129                 :             : int g_rename    (const gchar *oldfilename,
     130                 :             :                  const gchar *newfilename);
     131                 :             : 
     132                 :             : GLIB_AVAILABLE_IN_ALL
     133                 :             : int g_mkdir     (const gchar *filename,
     134                 :             :                  int          mode);
     135                 :             : 
     136                 :             : GLIB_AVAILABLE_IN_ALL
     137                 :             : int g_chdir     (const gchar *path);
     138                 :             : 
     139                 :             : GLIB_AVAILABLE_IN_ALL
     140                 :             : int g_stat      (const gchar *filename,
     141                 :             :                  GStatBuf    *buf);
     142                 :             : 
     143                 :             : GLIB_AVAILABLE_IN_ALL
     144                 :             : int g_lstat     (const gchar *filename,
     145                 :             :                  GStatBuf    *buf);
     146                 :             : 
     147                 :             : GLIB_AVAILABLE_IN_ALL
     148                 :             : int g_unlink    (const gchar *filename);
     149                 :             : 
     150                 :             : GLIB_AVAILABLE_IN_ALL
     151                 :             : int g_remove    (const gchar *filename);
     152                 :             : 
     153                 :             : GLIB_AVAILABLE_IN_ALL
     154                 :             : int g_rmdir     (const gchar *filename);
     155                 :             : 
     156                 :             : GLIB_AVAILABLE_IN_ALL
     157                 :             : FILE *g_fopen   (const gchar *filename,
     158                 :             :                  const gchar *mode);
     159                 :             : 
     160                 :             : GLIB_AVAILABLE_IN_ALL
     161                 :             : FILE *g_freopen (const gchar *filename,
     162                 :             :                  const gchar *mode,
     163                 :             :                  FILE        *stream);
     164                 :             : 
     165                 :             : GLIB_AVAILABLE_IN_2_64
     166                 :             : gint g_fsync    (gint fd);
     167                 :             : 
     168                 :             : struct utimbuf;                 /* Don't need the real definition of struct utimbuf when just
     169                 :             :                                  * including this header.
     170                 :             :                                  */
     171                 :             : 
     172                 :             : GLIB_AVAILABLE_IN_ALL
     173                 :             : int g_utime     (const gchar    *filename,
     174                 :             :                  struct utimbuf *utb);
     175                 :             : 
     176                 :             : #endif /* G_OS_UNIX */
     177                 :             : 
     178                 :             : GLIB_AVAILABLE_IN_2_36
     179                 :             : gboolean g_close (gint       fd,
     180                 :             :                   GError   **error);
     181                 :             : 
     182                 :             : /**
     183                 :             :  * g_clear_fd: (skip)
     184                 :             :  * @fd_ptr: (not optional) (inout) (transfer full): a pointer to a file descriptor
     185                 :             :  * @error: Used to return an error on failure
     186                 :             :  *
     187                 :             :  * If @fd_ptr points to a file descriptor, close it and return
     188                 :             :  * whether closing it was successful, like g_close().
     189                 :             :  * If @fd_ptr points to a negative number, return %TRUE without closing
     190                 :             :  * anything.
     191                 :             :  * In both cases, set @fd_ptr to `-1` before returning.
     192                 :             :  *
     193                 :             :  * Like g_close(), if closing the file descriptor fails, the error is
     194                 :             :  * stored in both %errno and @error. If this function succeeds,
     195                 :             :  * %errno is undefined.
     196                 :             :  *
     197                 :             :  * On POSIX platforms, this function is async-signal safe
     198                 :             :  * if @error is %NULL and @fd_ptr points to either a negative number or a
     199                 :             :  * valid open file descriptor.
     200                 :             :  * This makes it safe to call from a signal handler or a #GSpawnChildSetupFunc
     201                 :             :  * under those conditions.
     202                 :             :  * See [`signal(7)`](man:signal(7)) and
     203                 :             :  * [`signal-safety(7)`](man:signal-safety(7)) for more details.
     204                 :             :  *
     205                 :             :  * It is a programming error for @fd_ptr to point to a non-negative
     206                 :             :  * number that is not a valid file descriptor.
     207                 :             :  *
     208                 :             :  * A typical use of this function is to clean up a file descriptor at
     209                 :             :  * the end of its scope, whether it has been set successfully or not:
     210                 :             :  *
     211                 :             :  * |[
     212                 :             :  * gboolean
     213                 :             :  * operate_on_fd (GError **error)
     214                 :             :  * {
     215                 :             :  *   gboolean ret = FALSE;
     216                 :             :  *   int fd = -1;
     217                 :             :  *
     218                 :             :  *   fd = open_a_fd (error);
     219                 :             :  *
     220                 :             :  *   if (fd < 0)
     221                 :             :  *     goto out;
     222                 :             :  *
     223                 :             :  *   if (!do_something (fd, error))
     224                 :             :  *     goto out;
     225                 :             :  *
     226                 :             :  *   if (!g_clear_fd (&fd, error))
     227                 :             :  *     goto out;
     228                 :             :  *
     229                 :             :  *   ret = TRUE;
     230                 :             :  *
     231                 :             :  * out:
     232                 :             :  *   // OK to call even if fd was never opened or was already closed
     233                 :             :  *   g_clear_fd (&fd, NULL);
     234                 :             :  *   return ret;
     235                 :             :  * }
     236                 :             :  * ]|
     237                 :             :  *
     238                 :             :  * This function is also useful in conjunction with #g_autofd.
     239                 :             :  *
     240                 :             :  * Returns: %TRUE on success
     241                 :             :  * Since: 2.76
     242                 :             :  */
     243                 :             : GLIB_AVAILABLE_STATIC_INLINE_IN_2_76
     244                 :             : static inline gboolean g_clear_fd (int     *fd_ptr,
     245                 :             :                                    GError **error);
     246                 :             : 
     247                 :             : GLIB_AVAILABLE_STATIC_INLINE_IN_2_76
     248                 :             : static inline gboolean
     249                 :       11798 : g_clear_fd (int     *fd_ptr,
     250                 :             :             GError **error)
     251                 :             : {
     252                 :       11798 :   int fd = *fd_ptr;
     253                 :             : 
     254                 :       11798 :   *fd_ptr = -1;
     255                 :             : 
     256                 :       11798 :   if (fd < 0)
     257                 :        4936 :     return TRUE;
     258                 :             : 
     259                 :             :   /* Suppress "Not available before" warning */
     260                 :             :   G_GNUC_BEGIN_IGNORE_DEPRECATIONS
     261                 :        6862 :   return g_close (fd, error);
     262                 :             :   G_GNUC_END_IGNORE_DEPRECATIONS
     263                 :             : }
     264                 :             : 
     265                 :             : /* g_autofd should be defined on the same compilers where g_autofree is
     266                 :             :  * This avoids duplicating the feature-detection here. */
     267                 :             : #ifdef g_autofree
     268                 :             : #ifndef __GTK_DOC_IGNORE__
     269                 :             : /* Not public API */
     270                 :             : static inline void
     271                 :           3 : _g_clear_fd_ignore_error (int *fd_ptr)
     272                 :             : {
     273                 :             :   /* Don't overwrite thread-local errno if closing the fd fails */
     274                 :           3 :   int errsv = errno;
     275                 :             : 
     276                 :             :   /* Suppress "Not available before" warning */
     277                 :             :   G_GNUC_BEGIN_IGNORE_DEPRECATIONS
     278                 :             : 
     279                 :           3 :   if (!g_clear_fd (fd_ptr, NULL))
     280                 :             :     {
     281                 :             :       /* Do nothing: we ignore all errors, except for EBADF which
     282                 :             :        * is a programming error, checked for by g_close(). */
     283                 :             :     }
     284                 :             : 
     285                 :             :   G_GNUC_END_IGNORE_DEPRECATIONS
     286                 :             : 
     287                 :           3 :   errno = errsv;
     288                 :           3 : }
     289                 :             : #endif
     290                 :             : 
     291                 :             : #define g_autofd _GLIB_CLEANUP(_g_clear_fd_ignore_error) GLIB_AVAILABLE_MACRO_IN_2_76
     292                 :             : #endif
     293                 :             : 
     294                 :             : G_END_DECLS
     295                 :             : 
     296                 :             : #endif /* __G_STDIO_H__ */
        

Generated by: LCOV version 2.0-1