Back to index

glibc  2.9
Functions
nis_ismember.c File Reference
#include <string.h>
#include <rpcsvc/nis.h>

Go to the source code of this file.

Functions

static int internal_ismember (const_nis_name principal, const_nis_name group)
bool_t nis_ismember (const_nis_name principal, const_nis_name group)

Function Documentation

static int internal_ismember ( const_nis_name  principal,
const_nis_name  group 
) [static]

Definition at line 28 of file nis_ismember.c.

{
  size_t grouplen = strlen (group);
  char buf[grouplen + 50];
  char leafbuf[grouplen + 2];
  char domainbuf[grouplen + 2];
  nis_result *res;
  char *cp, *cp2;
  u_int i;

  cp = stpcpy (buf, nis_leaf_of_r (group, leafbuf, sizeof (leafbuf) - 1));
  cp = stpcpy (cp, ".groups_dir");
  cp2 = nis_domain_of_r (group, domainbuf, sizeof (domainbuf) - 1);
  if (cp2 != NULL && cp2[0] != '\0')
    {
      *cp++ = '.';
      strcpy (cp, cp2);
    }

  res = nis_lookup (buf, EXPAND_NAME|FOLLOW_LINKS);
  if (res == NULL || NIS_RES_STATUS (res) != NIS_SUCCESS)
    {
      nis_freeresult (res);
      return 0;
    }

  if ((NIS_RES_NUMOBJ (res) != 1) ||
      (__type_of (NIS_RES_OBJECT (res)) != NIS_GROUP_OBJ))
    {
      nis_freeresult (res);
      return 0;
    }

  /* We search twice in the list, at first, if we have the name
     with a "-", then if without. "-member" has priority */
  for (i = 0; i < NIS_RES_OBJECT(res)->GR_data.gr_members.gr_members_len; ++i)
    {
      cp = NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[i];
      if (cp[0] == '-')
       {
         if (strcmp (&cp[1], principal) == 0)
           {
             nis_freeresult (res);
             return -1;
           }
         if (cp[1] == '@')
           switch (internal_ismember (principal, &cp[2]))
             {
             case -1:
              nis_freeresult (res);
              return -1;
             case 1:
              nis_freeresult (res);
              return 1;
             default:
              break;
             }
         else
           if (cp[1] == '*')
             {
              char buf1[strlen (principal) + 2];
              char buf2[strlen (cp) + 2];

              if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
                         nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
                {
                  nis_freeresult (res);
                  return -1;
                }
             }
       }
    }

  for (i = 0; i < NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_len; ++i)
    {
      cp = NIS_RES_OBJECT (res)->GR_data.gr_members.gr_members_val[i];
      if (cp[0] != '-')
       {
         if (strcmp (cp, principal) == 0)
           {
             nis_freeresult (res);
             return 1;
           }
         if (cp[0] == '@')
           switch (internal_ismember (principal, &cp[1]))
             {
             case -1:
              nis_freeresult (res);
              return -1;
             case 1:
              nis_freeresult (res);
              return 1;
             default:
              break;
             }
         else
           if (cp[0] == '*')
             {
              char buf1[strlen (principal) + 2];
              char buf2[strlen (cp) + 2];

              if (strcmp (nis_domain_of_r (principal, buf1, sizeof buf1),
                         nis_domain_of_r (cp, buf2, sizeof buf2)) == 0)
                {
                  nis_freeresult (res);
                  return 1;
                }
             }
       }
    }
  nis_freeresult (res);
  return 0;
}

Here is the call graph for this function:

Here is the caller graph for this function:

bool_t nis_ismember ( const_nis_name  principal,
const_nis_name  group 
)

Definition at line 143 of file nis_ismember.c.

{
  if (group != NULL && group[0] != '\0' && principal != NULL)
    return internal_ismember (principal, group) == 1 ? TRUE : FALSE;
  else
    return FALSE;
}

Here is the call graph for this function: