Back to index

glibc  2.9
Defines | Functions
nisplus-netgrp.c File Reference
#include <nss.h>
#include <errno.h>
#include <ctype.h>
#include <netdb.h>
#include <string.h>
#include <netgroup.h>
#include <rpcsvc/nis.h>
#include "nss-nisplus.h"

Go to the source code of this file.

Defines

#define NISENTRYVAL(idx, col, res)   (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val)
#define NISENTRYLEN(idx, col, res)   (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len)

Functions

enum nss_status _nss_nisplus_getnetgrent_r (struct __netgrent *result, char *buffer, size_t buflen, int *errnop)
static void internal_endnetgrent (struct __netgrent *netgrp)
enum nss_status _nss_nisplus_setnetgrent (const char *group, struct __netgrent *netgrp)
enum nss_status _nss_nisplus_endnetgrent (struct __netgrent *netgrp)

Define Documentation

#define NISENTRYLEN (   idx,
  col,
  res 
)    (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_len)

Definition at line 33 of file nisplus-netgrp.c.

#define NISENTRYVAL (   idx,
  col,
  res 
)    (NIS_RES_OBJECT (res)[idx].EN_data.en_cols.en_cols_val[col].ec_value.ec_value_val)

Definition at line 30 of file nisplus-netgrp.c.


Function Documentation

enum nss_status _nss_nisplus_endnetgrent ( struct __netgrent netgrp)

Definition at line 187 of file nisplus-netgrp.c.

Here is the call graph for this function:

enum nss_status _nss_nisplus_getnetgrent_r ( struct __netgrent result,
char *  buffer,
size_t  buflen,
int errnop 
)

Definition at line 37 of file nisplus-netgrp.c.

{
  enum nss_status status;

  /* Some sanity checks.  */
  if (result->data == NULL || result->data_size == 0)
    return NSS_STATUS_NOTFOUND;

  if (result->position == result->data_size)
    return result->first ? NSS_STATUS_NOTFOUND : NSS_STATUS_RETURN;

  unsigned int entrylen
    = NISENTRYLEN (result->position, 1, (nis_result *) result->data);
  if (entrylen > 0)
    {
      /* We have a list of other netgroups.  */

      result->type = group_val;
      if (entrylen >= buflen)
       {
         *errnop = ERANGE;
         return NSS_STATUS_TRYAGAIN;
       }
      strncpy (buffer, NISENTRYVAL (result->position, 1,
                                (nis_result *) result->data),
              entrylen);
      buffer[entrylen] = '\0';
      result->val.group = buffer;
      ++result->position;
      result->first = 0;

      return NSS_STATUS_SUCCESS;
    }

  /* Before we can copy the entry to the private buffer we have to make
     sure it is big enough.  */
  unsigned int hostlen
    = NISENTRYLEN (result->position, 2, (nis_result *) result->data);
  unsigned int userlen
    = NISENTRYLEN (result->position, 3, (nis_result *) result->data);
  unsigned int domainlen
    = NISENTRYLEN (result->position, 4, (nis_result *) result->data);
  if (hostlen + userlen + domainlen + 6 > buflen)
    {
      *errnop = ERANGE;
      status = NSS_STATUS_TRYAGAIN;
    }
  else
    {
      char *cp = buffer;

      result->type = triple_val;

      if (hostlen == 0 ||
         NISENTRYVAL (result->position, 2,
                     (nis_result *) result->data)[0] == '\0')
       result->val.triple.host = NULL;
      else
       {
         result->val.triple.host = cp;
         cp = __stpncpy (cp, NISENTRYVAL (result->position, 2,
                                      (nis_result *) result->data),
                       hostlen);
         *cp++ = '\0';
       }

      if (userlen == 0 ||
         NISENTRYVAL (result->position, 3,
                     (nis_result *) result->data)[0] == '\0')
       result->val.triple.user = NULL;
      else
       {
         result->val.triple.user = cp;
         cp = __stpncpy (cp, NISENTRYVAL (result->position, 3,
                                      (nis_result *) result->data),
                       userlen);
         *cp++ = '\0';
       }

      if (domainlen == 0 ||
         NISENTRYVAL (result->position, 4,
                     (nis_result *) result->data)[0] == '\0')
       result->val.triple.domain = NULL;
      else
       {
         result->val.triple.domain = cp;
         cp = __stpncpy (cp, NISENTRYVAL (result->position, 4,
                                      (nis_result *) result->data),
                       domainlen);
         *cp = '\0';
       }

      status = NSS_STATUS_SUCCESS;

      /* Remember where we stopped reading.  */
      ++result->position;

      result->first = 0;
    }

  return status;
}

Here is the call graph for this function:

enum nss_status _nss_nisplus_setnetgrent ( const char *  group,
struct __netgrent netgrp 
)

Definition at line 151 of file nisplus-netgrp.c.

{
  char buf[strlen (group) + 25];

  if (group == NULL || group[0] == '\0')
    return NSS_STATUS_UNAVAIL;

  enum nss_status status = NSS_STATUS_SUCCESS;

  snprintf (buf, sizeof (buf), "[name=%s],netgroup.org_dir", group);

  netgrp->data = (char *) nis_list (buf, EXPAND_NAME, NULL, NULL);

  if (netgrp->data == NULL)
    {
      __set_errno (ENOMEM);
      status = NSS_STATUS_TRYAGAIN;
    }
  else if (niserr2nss (((nis_result *) netgrp->data)->status)
          != NSS_STATUS_SUCCESS)
    {
      status = niserr2nss (((nis_result *) netgrp->data)->status);

      internal_endnetgrent (netgrp);
    }
  else
    {
      netgrp->data_size = ((nis_result *) netgrp->data)->objects.objects_len;
      netgrp->position = 0;
      netgrp->first = 1;
    }

  return status;
}

Here is the call graph for this function:

static void internal_endnetgrent ( struct __netgrent netgrp) [static]

Definition at line 142 of file nisplus-netgrp.c.

{
  nis_freeresult ((nis_result *) netgrp->data);
  netgrp->data = NULL;
  netgrp->data_size = 0;
  netgrp->position = 0;
}

Here is the call graph for this function: