(root)/
glibc-2.38/
include/
unistd_ext.h
       1  /* unistd.h related helpers.
       2     Copyright (C) 2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #ifndef _UNISTD_EXT_H
      20  #define _UNISTD_EXT_H
      21  
      22  #include <error.h>
      23  #include <errno.h>
      24  #include <libintl.h>
      25  #include <unistd.h>
      26  
      27  /* Helpers used in catgets/gencat.c and malloc/memusage*.c */
      28  static inline void
      29  write_all (int fd, const void *buffer, size_t length)
      30  {
      31    const char *p = buffer;
      32    const char *end = p + length;
      33    while (p < end)
      34      {
      35        ssize_t ret = write (fd, p, end - p);
      36        if (ret < 0)
      37  	error (EXIT_FAILURE, errno,
      38  	       gettext ("write of %zu bytes failed after %td: %m"),
      39  	       length, p - (const char *) buffer);
      40  
      41        if (ret == 0)
      42  	error (EXIT_FAILURE, 0,
      43  	       gettext ("write returned 0 after writing %td bytes of %zu"),
      44  	       p - (const char *) buffer, length);
      45        p += ret;
      46      }
      47  }
      48  
      49  static inline void
      50  read_all (int fd, void *buffer, size_t length)
      51  {
      52    char *p = buffer;
      53    char *end = p + length;
      54    while (p < end)
      55      {
      56        ssize_t ret = read (fd, p, end - p);
      57        if (ret < 0)
      58  	error (EXIT_FAILURE, errno,
      59  	       gettext ("read of %zu bytes failed after %td: %m"),
      60  	       length, p - (char *) buffer);
      61  
      62        p += ret;
      63      }
      64  }
      65  
      66  #endif