Back to index

glibc  2.9
perror.c File Reference
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <wchar.h>
#include "libioP.h"

Go to the source code of this file.


static void perror_internal (FILE *fp, const char *s, int errnum)
void perror (const char *s)

Function Documentation

void perror ( const char *  s)

Definition at line 48 of file perror.c.

  int errnum = errno;
  FILE *fp;
  int fd = -1;

  /* The standard says that 'perror' must not change the orientation
     of the stream.  What is supposed to happen when the stream isn't
     oriented yet?  In this case we'll create a new stream which is
     using the same underlying file descriptor.  */
  if (__builtin_expect (_IO_fwide (stderr, 0) != 0, 1)
      || (fd = fileno (stderr)) == -1
      || (fd = __dup (fd)) == -1
      || (fp = fdopen (fd, "w+")) == NULL)
      if (__builtin_expect (fd != -1, 0))
       __close (fd);

      /* Use standard error as is.  */
      perror_internal (stderr, s, errnum);
      /* We don't have to do any special hacks regarding the file
        position.  Since the stderr stream wasn't used so far we just
        write to the descriptor.  */
      perror_internal (fp, s, errnum);
      /* Close the stream.  */
      fclose (fp);

Here is the call graph for this function:

static void perror_internal ( FILE fp,
const char *  s,
int  errnum 
) [static]

Definition at line 27 of file perror.c.

  char buf[1024];
  const char *colon;
  const char *errstring;

  if (s == NULL || *s == '\0')
    s = colon = "";
    colon = ": ";

  errstring = __strerror_r (errnum, buf, sizeof buf);

  (void) __fxprintf (fp, "%s%s%s\n", s, colon, errstring);

Here is the caller graph for this function: