Blame elf/dl-writev.h

Packit 6c4009
/* Message-writing for the dynamic linker.  Generic version.
Packit 6c4009
   Copyright (C) 2013-2018 Free Software Foundation, Inc.
Packit 6c4009
   This file is part of the GNU C Library.
Packit 6c4009
Packit 6c4009
   The GNU C Library is free software; you can redistribute it and/or
Packit 6c4009
   modify it under the terms of the GNU Lesser General Public
Packit 6c4009
   License as published by the Free Software Foundation; either
Packit 6c4009
   version 2.1 of the License, or (at your option) any later version.
Packit 6c4009
Packit 6c4009
   The GNU C Library is distributed in the hope that it will be useful,
Packit 6c4009
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6c4009
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6c4009
   Lesser General Public License for more details.
Packit 6c4009
Packit 6c4009
   You should have received a copy of the GNU Lesser General Public
Packit 6c4009
   License along with the GNU C Library; if not, see
Packit 6c4009
   <http://www.gnu.org/licenses/>.  */
Packit 6c4009
Packit 6c4009
#include <sys/uio.h>
Packit 6c4009
#include <ldsodefs.h>
Packit 6c4009
#include <libc-lock.h>
Packit 6c4009
Packit 6c4009
/* This is used from only one place: dl-misc.c:_dl_debug_vdprintf.
Packit 6c4009
   Hence it's in a header with the expectation it will be inlined.
Packit 6c4009
Packit 6c4009
   This is writev, but with a constraint added and others loosened:
Packit 6c4009
Packit 6c4009
   1. Under RTLD_PRIVATE_ERRNO, it must not clobber the private errno
Packit 6c4009
      when another thread holds the dl_load_lock.
Packit 6c4009
   2. It is not obliged to detect and report errors at all.
Packit 6c4009
   3. It's not really obliged to deliver a single atomic write
Packit 6c4009
      (though it may be preferable).  */
Packit 6c4009
Packit 6c4009
static inline void
Packit 6c4009
_dl_writev (int fd, const struct iovec *iov, size_t niov)
Packit 6c4009
{
Packit 6c4009
  /* Note that if __writev is an implementation that calls malloc,
Packit 6c4009
     this will cause linking problems building the dynamic linker.  */
Packit 6c4009
Packit 6c4009
#if RTLD_PRIVATE_ERRNO
Packit 6c4009
  /* We have to take this lock just to be sure we don't clobber the private
Packit 6c4009
     errno when it's being used by another thread that cares about it.
Packit 6c4009
     Yet we must be sure not to try calling the lock functions before
Packit 6c4009
     the thread library is fully initialized.  */
Packit 6c4009
  if (__glibc_unlikely (_dl_starting_up))
Packit 6c4009
    __writev (fd, iov, niov);
Packit 6c4009
  else
Packit 6c4009
    {
Packit 6c4009
      __rtld_lock_lock_recursive (GL(dl_load_lock));
Packit 6c4009
      __writev (fd, iov, niov);
Packit 6c4009
      __rtld_lock_unlock_recursive (GL(dl_load_lock));
Packit 6c4009
    }
Packit 6c4009
#else
Packit 6c4009
  __writev (fd, iov, niov);
Packit 6c4009
#endif
Packit 6c4009
}