Back to index

glibc  2.9
Defines | Functions | Variables
files-XXX.c File Reference
#include <stdio.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <bits/libc-lock.h>
#include "nsswitch.h"
#include <kernel-features.h>
#include <netdb.h>
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Defines

#define ENTNAME_r   CONCAT(ENTNAME,_r)
#define DATAFILE   "/etc/" DATABASE
#define H_ERRNO_PROTO
#define H_ERRNO_ARG
#define H_ERRNO_SET(val)   ((void) 0)
#define EXTRA_ARGS
#define EXTRA_ARGS_DECL
#define EXTRA_ARGS_VALUE
#define DB_LOOKUP(name, keysize, keypattern, break_if_match, proto...)

Functions

 __libc_lock_define_initialized (static, lock)
static enum nss_status internal_setent (int stayopen)
enum nss_status CONCAT (_nss_files_set, ENTNAME)
static void internal_endent (void)
enum nss_status CONCAT (_nss_files_end, ENTNAME)
static enum nss_status internal_getent (struct STRUCTURE *result, char *buffer, size_t buflen, int *errnop H_ERRNO_PROTO EXTRA_ARGS_DECL)
enum nss_status CONCAT (_nss_files_get, ENTNAME_r)

Variables

 last_use
static int keep_stream

Define Documentation

#define DATAFILE   "/etc/" DATABASE

Definition at line 43 of file files-XXX.c.

#define DB_LOOKUP (   name,
  keysize,
  keypattern,
  break_if_match,
  proto... 
)
Value:
enum nss_status                                                             \
_nss_files_get##name##_r (proto,                                     \
                       struct STRUCTURE *result, char *buffer,       \
                       size_t buflen, int *errnop H_ERRNO_PROTO)            \
{                                                                    \
  enum nss_status status;                                            \
									      \
  __libc_lock_lock (lock);                                           \
                                                                     \
  /* Reset file pointer to beginning or open file.  */                      \
  status = internal_setent (keep_stream);                            \
                                                                     \
  if (status == NSS_STATUS_SUCCESS)                                         \
    {                                                                \
      /* Tell getent function that we have repositioned the file pointer.  */ \
      last_use = getby;                                                     \
                                                                     \
      while ((status = internal_getent (result, buffer, buflen, errnop             \
                                   H_ERRNO_ARG EXTRA_ARGS_VALUE))           \
            == NSS_STATUS_SUCCESS)                                   \
       { break_if_match }                                            \
                                                                     \
      if (! keep_stream)                                             \
       internal_endent ();                                           \
    }                                                                \
									      \
  __libc_lock_unlock (lock);                                                \
                                                                     \
  return status;                                                     \
}

Definition at line 317 of file files-XXX.c.

#define ENTNAME_r   CONCAT(ENTNAME,_r)

Definition at line 41 of file files-XXX.c.

#define EXTRA_ARGS

Definition at line 57 of file files-XXX.c.

#define EXTRA_ARGS_DECL

Definition at line 58 of file files-XXX.c.

Definition at line 59 of file files-XXX.c.

#define H_ERRNO_ARG

Definition at line 52 of file files-XXX.c.

#define H_ERRNO_PROTO

Definition at line 51 of file files-XXX.c.

#define H_ERRNO_SET (   val)    ((void) 0)

Definition at line 53 of file files-XXX.c.


Function Documentation

__libc_lock_define_initialized ( static  ,
lock   
)

Definition at line 63 of file files-XXX.c.

            { nouse, getent, getby } last_use;
enum nss_status CONCAT ( _nss_files_set  ,
ENTNAME   
)

Definition at line 133 of file files-XXX.c.

{
  enum nss_status status;

  __libc_lock_lock (lock);

  status = internal_setent (stayopen);

  if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
    {
      fclose (stream);
      stream = NULL;
      status = NSS_STATUS_UNAVAIL;
    }

  last_use = getent;

  __libc_lock_unlock (lock);

  return status;
}

Here is the call graph for this function:

enum nss_status CONCAT ( _nss_files_end  ,
ENTNAME   
)

Definition at line 170 of file files-XXX.c.

{
  __libc_lock_lock (lock);

  internal_endent ();

  /* Reset STAYOPEN flag.  */
  keep_stream = 0;

  __libc_lock_unlock (lock);

  return NSS_STATUS_SUCCESS;
}

Here is the call graph for this function:

enum nss_status CONCAT ( _nss_files_get  ,
ENTNAME_r   
)

Definition at line 247 of file files-XXX.c.

{
  /* Return next entry in host file.  */
  enum nss_status status = NSS_STATUS_SUCCESS;

  __libc_lock_lock (lock);

  /* Be prepared that the set*ent function was not called before.  */
  if (stream == NULL)
    {
      int save_errno = errno;

      status = internal_setent (0);

      __set_errno (save_errno);

      if (status == NSS_STATUS_SUCCESS && fgetpos (stream, &position) < 0)
       {
         fclose (stream);
         stream = NULL;
         status = NSS_STATUS_UNAVAIL;
       }
    }

  if (status == NSS_STATUS_SUCCESS)
    {
      /* If the last use was not by the getent function we need the
        position the stream.  */
      if (last_use != getent)
       {
         if (fsetpos (stream, &position) < 0)
           status = NSS_STATUS_UNAVAIL;
         else
           last_use = getent;
       }

      if (status == NSS_STATUS_SUCCESS)
       {
         status = internal_getent (result, buffer, buflen, errnop
                                H_ERRNO_ARG EXTRA_ARGS_VALUE);

         /* Remember this position if we were successful.  If the
            operation failed we give the user a chance to repeat the
            operation (perhaps the buffer was too small).  */
         if (status == NSS_STATUS_SUCCESS)
           fgetpos (stream, &position);
         else
           /* We must make sure we reposition the stream the next call.  */
           last_use = nouse;
       }
    }

  __libc_lock_unlock (lock);

  return status;
}

Here is the call graph for this function:

static void internal_endent ( void  ) [static]

Definition at line 158 of file files-XXX.c.

{
  if (stream != NULL)
    {
      fclose (stream);
      stream = NULL;
    }
}

Here is the call graph for this function:

static enum nss_status internal_getent ( struct STRUCTURE result,
char *  buffer,
size_t  buflen,
int *errnop H_ERRNO_PROTO  EXTRA_ARGS_DECL 
) [static]

Definition at line 187 of file files-XXX.c.

{
  char *p;
  struct parser_data *data = (void *) buffer;
  int linebuflen = buffer + buflen - data->linebuffer;
  int parse_result;

  if (buflen < sizeof *data + 2)
    {
      *errnop = ERANGE;
      H_ERRNO_SET (NETDB_INTERNAL);
      return NSS_STATUS_TRYAGAIN;
    }

  do
    {
      /* Terminate the line so that we can test for overflow.  */
      ((unsigned char *) data->linebuffer)[linebuflen - 1] = '\xff';

      p = fgets_unlocked (data->linebuffer, linebuflen, stream);
      if (p == NULL)
       {
         /* End of file or read error.  */
         H_ERRNO_SET (HOST_NOT_FOUND);
         return NSS_STATUS_NOTFOUND;
       }
      else if (((unsigned char *) data->linebuffer)[linebuflen - 1] != 0xff)
       {
         /* The line is too long.  Give the user the opportunity to
            enlarge the buffer.  */
         *errnop = ERANGE;
         H_ERRNO_SET (NETDB_INTERNAL);
         return NSS_STATUS_TRYAGAIN;
       }

      /* Skip leading blanks.  */
      while (isspace (*p))
       ++p;
    }
  while (*p == '\0' || *p == '#' /* Ignore empty and comment lines.  */
        /* Parse the line.  If it is invalid, loop to get the next
           line of the file to parse.  */
        || ! (parse_result = parse_line (p, result, data, buflen, errnop
                                     EXTRA_ARGS)));

  if (__builtin_expect (parse_result == -1, 0))
    {
      H_ERRNO_SET (NETDB_INTERNAL);
      return NSS_STATUS_TRYAGAIN;
    }

  /* Filled in RESULT with the next entry from the database file.  */
  return NSS_STATUS_SUCCESS;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static enum nss_status internal_setent ( int  stayopen) [static]

Definition at line 74 of file files-XXX.c.

{
  enum nss_status status = NSS_STATUS_SUCCESS;

  if (stream == NULL)
    {
      stream = fopen (DATAFILE, "re");

      if (stream == NULL)
       status = errno == EAGAIN ? NSS_STATUS_TRYAGAIN : NSS_STATUS_UNAVAIL;
      else
       {
#if !defined O_CLOEXEC || !defined __ASSUME_O_CLOEXEC
# ifdef O_CLOEXEC
         if (__have_o_cloexec <= 0)
# endif
           {
             /* We have to make sure the file is  `closed on exec'.  */
             int result;
             int flags;

             result = flags = fcntl (fileno (stream), F_GETFD, 0);
             if (result >= 0)
              {
# ifdef O_CLOEXEC
                if (__have_o_cloexec == 0)
                  __have_o_cloexec = (flags & FD_CLOEXEC) == 0 ? -1 : 1;
                if (__have_o_cloexec < 0)
# endif
                  {
                    flags |= FD_CLOEXEC;
                    result = fcntl (fileno (stream), F_SETFD, flags);
                  }
              }
             if (result < 0)
              {
                /* Something went wrong.  Close the stream and return a
                   failure.  */
                fclose (stream);
                stream = NULL;
                status = NSS_STATUS_UNAVAIL;
              }
           }
#endif
       }
    }
  else
    rewind (stream);

  /* Remember STAYOPEN flag.  */
  if (stream != NULL)
    keep_stream |= stayopen;

  return status;
}

Here is the call graph for this function:


Variable Documentation

int keep_stream [static]

Definition at line 70 of file files-XXX.c.

Definition at line 69 of file files-XXX.c.