Back to index

glibc  2.9
Functions
getnssent_r.c File Reference
#include <errno.h>
#include <netdb.h>
#include "nsswitch.h"

Go to the source code of this file.

Functions

static int setup (const char *func_name, db_lookup_function lookup_fct, void **fctp, service_user **nip, service_user **startp, int all)
void __nss_setent (const char *func_name, db_lookup_function lookup_fct, service_user **nip, service_user **startp, service_user **last_nip, int stayopen, int *stayopen_tmp, int res)
void __nss_endent (const char *func_name, db_lookup_function lookup_fct, service_user **nip, service_user **startp, service_user **last_nip, int res)
int __nss_getent_r (const char *getent_func_name, const char *setent_func_name, db_lookup_function lookup_fct, service_user **nip, service_user **startp, service_user **last_nip, int *stayopen_tmp, int res, void *resbuf, char *buffer, size_t buflen, void **result, int *h_errnop)

Function Documentation

void __nss_endent ( const char *  func_name,
db_lookup_function  lookup_fct,
service_user **  nip,
service_user **  startp,
service_user **  last_nip,
int  res 
)

Definition at line 94 of file getnssent_r.c.

{
  union
  {
    endent_function f;
    void *ptr;
  } fct;
  int no_more;

  if (res && __res_maybe_init (&_res, 0) == -1)
    {
      __set_h_errno (NETDB_INTERNAL);
      return;
    }

  /* Cycle through all the services and run their endXXent functions.  */
  no_more = setup (func_name, lookup_fct, &fct.ptr, nip, startp, 1);
  while (! no_more)
    {
      /* Ignore status, we force check in __NSS_NEXT.  */
      DL_CALL_FCT (fct.f, ());

      if (*nip == *last_nip)
       /* We have processed all services which were used.  */
       break;

      no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, 0, 1);
    }
  *last_nip = *nip = NULL;
}

Here is the call graph for this function:

Here is the caller graph for this function:

int __nss_getent_r ( const char *  getent_func_name,
const char *  setent_func_name,
db_lookup_function  lookup_fct,
service_user **  nip,
service_user **  startp,
service_user **  last_nip,
int stayopen_tmp,
int  res,
void *  resbuf,
char *  buffer,
size_t  buflen,
void **  result,
int h_errnop 
)

Definition at line 129 of file getnssent_r.c.

{
  union
  {
    getent_function f;
    void *ptr;
  } fct;
  int no_more;
  enum nss_status status;

  if (res && __res_maybe_init (&_res, 0) == -1)
    {
      *h_errnop = NETDB_INTERNAL;
      *result = NULL;
      return errno;
    }

  /* Initialize status to return if no more functions are found.  */
  status = NSS_STATUS_NOTFOUND;

  /* Run through available functions, starting with the same function last
     run.  We will repeat each function as long as it succeeds, and then go
     on to the next service action.  */
  no_more = setup (getent_func_name, lookup_fct, &fct.ptr, nip,
                 startp, 0);
  while (! no_more)
    {
      int is_last_nip = *nip == *last_nip;

      status = DL_CALL_FCT (fct.f,
                         (resbuf, buffer, buflen, &errno, &h_errno));

      /* The the status is NSS_STATUS_TRYAGAIN and errno is ERANGE the
        provided buffer is too small.  In this case we should give
        the user the possibility to enlarge the buffer and we should
        not simply go on with the next service (even if the TRYAGAIN
        action tells us so).  */
      if (status == NSS_STATUS_TRYAGAIN
         && (h_errnop == NULL || *h_errnop == NETDB_INTERNAL)
         && errno == ERANGE)
       break;

      do
       {
         no_more = __nss_next2 (nip, getent_func_name, NULL, &fct.ptr,
                             status, 0);

         if (is_last_nip)
           *last_nip = *nip;

         if (! no_more)
           {
             /* Call the `setXXent' function.  This wasn't done before.  */
             union
             {
              setent_function f;
              void *ptr;
             } sfct;

             no_more = __nss_lookup (nip, setent_func_name, NULL, &sfct.ptr);

             if (! no_more)
               {
                if (stayopen_tmp)
                  status = DL_CALL_FCT (sfct.f, (*stayopen_tmp));
                else
                  status = DL_CALL_FCT (sfct.f, (0));
              }
             else
              status = NSS_STATUS_NOTFOUND;
           }
       }
      while (! no_more && status != NSS_STATUS_SUCCESS);
    }

  *result = status == NSS_STATUS_SUCCESS ? resbuf : NULL;
  return (status == NSS_STATUS_SUCCESS ? 0
         : status != NSS_STATUS_TRYAGAIN ? ENOENT
         /* h_errno functions only set errno if h_errno is NETDB_INTERNAL.  */
         : (h_errnop == NULL || *h_errnop == NETDB_INTERNAL) ? errno
         : EAGAIN);
}

Here is the call graph for this function:

Here is the caller graph for this function:

void __nss_setent ( const char *  func_name,
db_lookup_function  lookup_fct,
service_user **  nip,
service_user **  startp,
service_user **  last_nip,
int  stayopen,
int stayopen_tmp,
int  res 
)

Definition at line 51 of file getnssent_r.c.

{
  union
  {
    setent_function f;
    void *ptr;
  } fct;
  int no_more;

  if (res && __res_maybe_init (&_res, 0) == -1)
    {
      __set_h_errno (NETDB_INTERNAL);
      return;
    }

  /* Cycle through the services and run their `setXXent' functions until
     we find an available service.  */
  no_more = setup (func_name, lookup_fct, &fct.ptr, nip,
                 startp, 1);
  while (! no_more)
    {
      int is_last_nip = *nip == *last_nip;
      enum nss_status status;

      if (stayopen_tmp)
       status = DL_CALL_FCT (fct.f, (*stayopen_tmp));
      else
       status = DL_CALL_FCT (fct.f, (0));

      no_more = __nss_next2 (nip, func_name, NULL, &fct.ptr, status, 0);
      if (is_last_nip)
       *last_nip = *nip;
    }

  if (stayopen_tmp)
    *stayopen_tmp = stayopen;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static int setup ( const char *  func_name,
db_lookup_function  lookup_fct,
void **  fctp,
service_user **  nip,
service_user **  startp,
int  all 
) [static]

Definition at line 27 of file getnssent_r.c.

{
  int no_more;
  if (*startp == NULL)
    {
      no_more = lookup_fct (nip, func_name, NULL, fctp);
      *startp = no_more ? (service_user *) -1l : *nip;
    }
  else if (*startp == (service_user *) -1l)
    /* No services at all.  */
    return 1;
  else
    {
      if (all || !*nip)
       /* Reset to the beginning of the service list.  */
       *nip = *startp;
      /* Look up the first function.  */
      no_more = __nss_lookup (nip, func_name, NULL, fctp);
    }
  return no_more;
}

Here is the caller graph for this function: