[BACK]Return to getgrent.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / gen

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/gen/getgrent.c between version 1.54 and 1.54.2.4

version 1.54, 2005/01/06 15:00:45 version 1.54.2.4, 2005/07/11 21:27:00
Line 130  __RCSID("$NetBSD$");
Line 130  __RCSID("$NetBSD$");
 #ifdef __weak_alias  #ifdef __weak_alias
 __weak_alias(endgrent,_endgrent)  __weak_alias(endgrent,_endgrent)
 __weak_alias(getgrent,_getgrent)  __weak_alias(getgrent,_getgrent)
   __weak_alias(getgrent_r,_getgrent_r)
 __weak_alias(getgrgid,_getgrgid)  __weak_alias(getgrgid,_getgrgid)
 __weak_alias(getgrgid_r,_getgrgid_r)  __weak_alias(getgrgid_r,_getgrgid_r)
 __weak_alias(getgrnam,_getgrnam)  __weak_alias(getgrnam,_getgrnam)
Line 335  __grend_files(struct __grstate_files *st
Line 336  __grend_files(struct __grstate_files *st
  *      If search is zero, return the next entry.   *      If search is zero, return the next entry.
  *      If search is non-zero, look for a specific name (if name != NULL),   *      If search is non-zero, look for a specific name (if name != NULL),
  *      or a specific gid (if name == NULL).   *      or a specific gid (if name == NULL).
  *      Sets *retval to the errno if the result is not NS_SUCCESS.   *      Sets *retval to the errno if the result is not NS_SUCCESS
    *      or NS_NOTFOUND.
  */   */
 int  int
 __grscan_files(int *retval, struct group *grp, char *buffer, size_t buflen,  __grscan_files(int *retval, struct group *grp, char *buffer, size_t buflen,
Line 363  __grscan_files(int *retval, struct group
Line 365  __grscan_files(int *retval, struct group
                                                         /* scan line by line */                                                          /* scan line by line */
         while (fgets(filebuf, sizeof(filebuf), state->fp) != NULL) {          while (fgets(filebuf, sizeof(filebuf), state->fp) != NULL) {
                 ep = strchr(filebuf, '\n');                  ep = strchr(filebuf, '\n');
                 if (ep == NULL) {       /* fail on lines that are too big */                  if (ep == NULL) {       /* skip lines that are too big */
                         int ch;                          int ch;
   
                         while ((ch = getc(state->fp)) != '\n' && ch != EOF)                          while ((ch = getc(state->fp)) != '\n' && ch != EOF)
                                 continue;                                  continue;
                         rv = NS_UNAVAIL;                          continue;
                         break;  
                 }                  }
                 *ep = '\0';                             /* clear trailing \n */                  *ep = '\0';                             /* clear trailing \n */
   
Line 378  __grscan_files(int *retval, struct group
Line 379  __grscan_files(int *retval, struct group
   
                                                         /* validate line */                                                          /* validate line */
                 if (! _gr_parse(filebuf, grp, buffer, buflen)) {                  if (! _gr_parse(filebuf, grp, buffer, buflen)) {
                         rv = NS_UNAVAIL;                          continue;                       /* skip bad lines */
                         break;  
                 }                  }
                 if (! search) {                         /* just want this one */                  if (! search) {                         /* just want this one */
                         rv = NS_SUCCESS;                          rv = NS_SUCCESS;
Line 394  __grscan_files(int *retval, struct group
Line 394  __grscan_files(int *retval, struct group
         }          }
   
  filesgrscan_out:   filesgrscan_out:
         if (rv != NS_SUCCESS)          if (rv != NS_SUCCESS && rv != NS_NOTFOUND)
                 *retval = errno;                  *retval = errno;
         return rv;          return rv;
 }  }
Line 459  _files_getgrent(void *nsrv, void *nscb, 
Line 459  _files_getgrent(void *nsrv, void *nscb, 
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
   _files_getgrent_r(void *nsrv, void *nscb, va_list ap)
   {
           int             *retval = va_arg(ap, int *);
           struct group    *grp    = va_arg(ap, struct group *);
           char            *buffer = va_arg(ap, char *);
           size_t           buflen = va_arg(ap, size_t);
           struct group   **result = va_arg(ap, struct group **);
   
           int     rv;
   
           _DIAGASSERT(retval != NULL);
           _DIAGASSERT(grp != NULL);
           _DIAGASSERT(buffer != NULL);
           _DIAGASSERT(result != NULL);
   
           rv = __grscan_files(retval, grp, buffer, buflen,
               &_files_state, 0, NULL, 0);
           if (rv == NS_SUCCESS)
                   *result = grp;
           else
                   *result = NULL;
           return rv;
   }
   
   /*ARGSUSED*/
   static int
 _files_getgrgid(void *nsrv, void *nscb, va_list ap)  _files_getgrgid(void *nsrv, void *nscb, va_list ap)
 {  {
         struct group    **retval = va_arg(ap, struct group **);          struct group    **retval = va_arg(ap, struct group **);
Line 638  __grscan_dns(int *retval, struct group *
Line 664  __grscan_dns(int *retval, struct group *
                         return rv;                          return rv;
         }          }
   
    next_dns_entry:
         hp = NULL;          hp = NULL;
         rv = NS_NOTFOUND;          rv = NS_NOTFOUND;
   
Line 680  __grscan_dns(int *retval, struct group *
Line 707  __grscan_dns(int *retval, struct group *
                     (!name && gid == grp->gr_gid)) {    /* want specific */                      (!name && gid == grp->gr_gid)) {    /* want specific */
                         rv = NS_SUCCESS;                          rv = NS_SUCCESS;
                 }                  }
         } else          } else {                                        /* dodgy entry */
                 rv = NS_UNAVAIL;                  if (!search) {                  /* try again if ! searching */
                           hesiod_free_list(state->context, hp);
                           goto next_dns_entry;
                   }
           }
   
  dnsgrscan_out:   dnsgrscan_out:
         if (rv != NS_SUCCESS)          if (rv != NS_SUCCESS && rv != NS_NOTFOUND)
                 *retval = errno;                  *retval = errno;
         if (hp)          if (hp)
                 hesiod_free_list(state->context, hp);                  hesiod_free_list(state->context, hp);
Line 749  _dns_getgrent(void *nsrv, void *nscb, va
Line 780  _dns_getgrent(void *nsrv, void *nscb, va
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
   _dns_getgrent_r(void *nsrv, void *nscb, va_list ap)
   {
           int             *retval = va_arg(ap, int *);
           struct group    *grp    = va_arg(ap, struct group *);
           char            *buffer = va_arg(ap, char *);
           size_t           buflen = va_arg(ap, size_t);
           struct group   **result = va_arg(ap, struct group **);
   
           int     rv;
   
           _DIAGASSERT(retval != NULL);
           _DIAGASSERT(grp != NULL);
           _DIAGASSERT(buffer != NULL);
           _DIAGASSERT(result != NULL);
   
           rv = __grscan_dns(retval, grp, buffer, buflen,
               &_dns_state, 0, NULL, 0);
           if (rv == NS_SUCCESS)
                   *result = grp;
           else
                   *result = NULL;
           return rv;
   }
   /*ARGSUSED*/
   static int
 _dns_getgrgid(void *nsrv, void *nscb, va_list ap)  _dns_getgrgid(void *nsrv, void *nscb, va_list ap)
 {  {
         struct group    **retval = va_arg(ap, struct group **);          struct group    **retval = va_arg(ap, struct group **);
Line 929  __grscan_nis(int *retval, struct group *
Line 985  __grscan_nis(int *retval, struct group *
                         return rv;                          return rv;
         }          }
   
    next_nis_entry:
         key = NULL;          key = NULL;
         data = NULL;          data = NULL;
         rv = NS_SUCCESS;          rv = NS_SUCCESS;
Line 995  __grscan_nis(int *retval, struct group *
Line 1052  __grscan_nis(int *retval, struct group *
                                                         /* want specific */                                                          /* want specific */
                                 rv = NS_SUCCESS;                                  rv = NS_SUCCESS;
                         }                          }
                 } else                  } else {                                /* dodgy entry */
                         rv = NS_UNAVAIL;                          if (!search) {          /* try again if ! searching */
                                   if (key)
                                           free(key);
                                   free(data);
                                   goto next_nis_entry;
                           }
                   }
         }          }
   
         if (rv != NS_SUCCESS)          if (rv != NS_SUCCESS && rv != NS_NOTFOUND)
                 *retval = errno;                  *retval = errno;
         if (key)          if (key)
                 free(key);                  free(key);
Line 1065  _nis_getgrent(void *nsrv, void *nscb, va
Line 1128  _nis_getgrent(void *nsrv, void *nscb, va
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
   _nis_getgrent_r(void *nsrv, void *nscb, va_list ap)
   {
           int             *retval = va_arg(ap, int *);
           struct group    *grp    = va_arg(ap, struct group *);
           char            *buffer = va_arg(ap, char *);
           size_t           buflen = va_arg(ap, size_t);
           struct group   **result = va_arg(ap, struct group **);
   
           int     rv;
   
           _DIAGASSERT(retval != NULL);
           _DIAGASSERT(grp != NULL);
           _DIAGASSERT(buffer != NULL);
           _DIAGASSERT(result != NULL);
   
           rv = __grscan_nis(retval, grp, buffer, buflen,
               &_nis_state, 0, NULL, 0);
           if (rv == NS_SUCCESS)
                   *result = grp;
           else
                   *result = NULL;
           return rv;
   }
   
   /*ARGSUSED*/
   static int
 _nis_getgrgid(void *nsrv, void *nscb, va_list ap)  _nis_getgrgid(void *nsrv, void *nscb, va_list ap)
 {  {
         struct group    **retval = va_arg(ap, struct group **);          struct group    **retval = va_arg(ap, struct group **);
Line 1237  __grbad_compat(void *nsrv, void *nscb, v
Line 1326  __grbad_compat(void *nsrv, void *nscb, v
  *      If search is zero, return the next entry.   *      If search is zero, return the next entry.
  *      If search is non-zero, look for a specific name (if name != NULL),   *      If search is non-zero, look for a specific name (if name != NULL),
  *      or a specific gid (if name == NULL).   *      or a specific gid (if name == NULL).
  *      Sets *retval to the errno if the result is not NS_SUCCESS.   *      Sets *retval to the errno if the result is not NS_SUCCESS or
    *      NS_NOTFOUND.
  *   *
  *      searchfunc is invoked when a compat "+" lookup is required;   *      searchfunc is invoked when a compat "+" lookup is required;
  *      searchcookie is passed as the first argument to searchfunc,   *      searchcookie is passed as the first argument to searchfunc,
Line 1256  __grscan_compat(int *retval, struct grou
Line 1346  __grscan_compat(int *retval, struct grou
   
         static const ns_dtab compatentdtab[] = {          static const ns_dtab compatentdtab[] = {
                 NS_FILES_CB(__grbad_compat, "files")                  NS_FILES_CB(__grbad_compat, "files")
                 NS_DNS_CB(_dns_getgrent, NULL)                  NS_DNS_CB(_dns_getgrent_r, NULL)
                 NS_NIS_CB(_nis_getgrent, NULL)                  NS_NIS_CB(_nis_getgrent_r, NULL)
                 NS_COMPAT_CB(__grbad_compat, "compat")                  NS_COMPAT_CB(__grbad_compat, "compat")
                 { 0 }                  { 0 }
         };          };
Line 1306  __grscan_compat(int *retval, struct grou
Line 1396  __grscan_compat(int *retval, struct grou
                                 free(state->name);      /* (only check 1 grp) */                                  free(state->name);      /* (only check 1 grp) */
                                 state->name = NULL;                                  state->name = NULL;
                         } else if (!search) {           /* any group */                          } else if (!search) {           /* any group */
         /* XXXLUKEM: need to implement and use getgrent_r() */  
                                 if (searchfunc) {                                  if (searchfunc) {
                                         crv = searchfunc(searchcookie,                                          crv = searchfunc(searchcookie,
                                             &cgrpres);                                              &cgrpres);
                                 } else {                                  } else {
                                         crv = nsdispatch(NULL, compatentdtab,                                          crv = nsdispatch(NULL, compatentdtab,
                                             NSDB_GROUP_COMPAT, "getgrent",                                              NSDB_GROUP_COMPAT, "getgrent_r",
                                             __nsdefaultnis,                                              __nsdefaultnis,
                                             &cgrpres);                                              &cretval, &cgrp, filebuf,
                                               sizeof(filebuf), &cgrpres);
                                 }                                  }
                         } else if (name) {              /* specific group */                          } else if (name) {              /* specific group */
                                 crv = nsdispatch(NULL, compatnamdtab,                                  crv = nsdispatch(NULL, compatnamdtab,
Line 1346  __grscan_compat(int *retval, struct grou
Line 1436  __grscan_compat(int *retval, struct grou
                         break;                          break;
   
                 ep = strchr(filebuf, '\n');                  ep = strchr(filebuf, '\n');
                 if (ep == NULL) {       /* fail on lines that are too big */                  if (ep == NULL) {       /* skip lines that are too big */
                         int ch;                          int ch;
   
                         while ((ch = getc(state->fp)) != '\n' && ch != EOF)                          while ((ch = getc(state->fp)) != '\n' && ch != EOF)
                                 continue;                                  continue;
                         rv = NS_UNAVAIL;                          continue;
                         break;  
                 }                  }
                 *ep = '\0';                             /* clear trailing \n */                  *ep = '\0';                             /* clear trailing \n */
   
Line 1382  __grscan_compat(int *retval, struct grou
Line 1471  __grscan_compat(int *retval, struct grou
   
                                                         /* validate line */                                                          /* validate line */
                 if (! _gr_parse(filebuf, grp, buffer, buflen)) {                  if (! _gr_parse(filebuf, grp, buffer, buflen)) {
                         rv = NS_UNAVAIL;                          continue;                       /* skip bad lines */
                         break;  
                 }                  }
   
  compatgrscan_cmpgrp:   compatgrscan_cmpgrp:
Line 1401  __grscan_compat(int *retval, struct grou
Line 1489  __grscan_compat(int *retval, struct grou
         }          }
   
  compatgrscan_out:   compatgrscan_out:
         if (rv != NS_SUCCESS)          if (rv != NS_SUCCESS && rv != NS_NOTFOUND)
                 *retval = errno;                  *retval = errno;
         return rv;          return rv;
 }  }
Line 1501  _compat_getgrent(void *nsrv, void *nscb,
Line 1589  _compat_getgrent(void *nsrv, void *nscb,
   
 /*ARGSUSED*/  /*ARGSUSED*/
 static int  static int
   _compat_getgrent_r(void *nsrv, void *nscb, va_list ap)
   {
           int             *retval = va_arg(ap, int *);
           struct group    *grp    = va_arg(ap, struct group *);
           char            *buffer = va_arg(ap, char *);
           size_t           buflen = va_arg(ap, size_t);
           struct group   **result = va_arg(ap, struct group **);
   
           int     rv;
   
           _DIAGASSERT(retval != NULL);
           _DIAGASSERT(grp != NULL);
           _DIAGASSERT(buffer != NULL);
           _DIAGASSERT(result != NULL);
   
           rv = __grscan_compat(retval, grp, buffer, buflen,
               &_compat_state, 0, NULL, 0, NULL, NULL);
           if (rv == NS_SUCCESS)
                   *result = grp;
           else
                   *result = NULL;
           return rv;
   }
   
   /*ARGSUSED*/
   static int
 _compat_getgrgid(void *nsrv, void *nscb, va_list ap)  _compat_getgrgid(void *nsrv, void *nscb, va_list ap)
 {  {
         struct group    **retval = va_arg(ap, struct group **);          struct group    **retval = va_arg(ap, struct group **);
Line 1635  getgrent(void)
Line 1749  getgrent(void)
         return (rv == NS_SUCCESS) ? retval : NULL;          return (rv == NS_SUCCESS) ? retval : NULL;
 }  }
   
   int
   getgrent_r(struct group *grp, char *buffer, size_t buflen,
       struct group **result)
   {
           int             rv, retval;
   
           static const ns_dtab dtab[] = {
                   NS_FILES_CB(_files_getgrent_r, NULL)
                   NS_DNS_CB(_dns_getgrent_r, NULL)
                   NS_NIS_CB(_nis_getgrent_r, NULL)
                   NS_COMPAT_CB(_compat_getgrent_r, NULL)
                   { 0 }
           };
   
           mutex_lock(&__grmutex);
           rv = nsdispatch(NULL, dtab, NSDB_GROUP, "getgrent_r", __nsdefaultcompat,
               &retval, grp, buffer, buflen, result);
           mutex_unlock(&__grmutex);
           switch (rv) {
           case NS_SUCCESS:
           case NS_NOTFOUND:
                   return 0;
           default:
                   return retval;
           }
   }
   
   
 struct group *  struct group *
 getgrgid(gid_t gid)  getgrgid(gid_t gid)
 {  {
Line 1680  getgrgid_r(gid_t gid, struct group *grp,
Line 1822  getgrgid_r(gid_t gid, struct group *grp,
         rv = nsdispatch(NULL, dtab, NSDB_GROUP, "getgrgid_r", __nsdefaultcompat,          rv = nsdispatch(NULL, dtab, NSDB_GROUP, "getgrgid_r", __nsdefaultcompat,
             &retval, gid, grp, buffer, buflen, result);              &retval, gid, grp, buffer, buflen, result);
         mutex_unlock(&__grmutex);          mutex_unlock(&__grmutex);
         return (rv == NS_SUCCESS) ? 0 : retval ? retval : ENOENT;          switch (rv) {
           case NS_SUCCESS:
           case NS_NOTFOUND:
                   return 0;
           default:
                   return retval;
           }
 }  }
   
 struct group *  struct group *
Line 1729  getgrnam_r(const char *name, struct grou
Line 1877  getgrnam_r(const char *name, struct grou
         rv = nsdispatch(NULL, dtab, NSDB_GROUP, "getgrnam_r", __nsdefaultcompat,          rv = nsdispatch(NULL, dtab, NSDB_GROUP, "getgrnam_r", __nsdefaultcompat,
             &retval, name, grp, buffer, buflen, result);              &retval, name, grp, buffer, buflen, result);
         mutex_unlock(&__grmutex);          mutex_unlock(&__grmutex);
         return (rv == NS_SUCCESS) ? 0 : retval ? retval : ENOENT;          switch (rv) {
           case NS_SUCCESS:
           case NS_NOTFOUND:
                   return 0;
           default:
                   return retval;
           }
 }  }
   
 void  void

Legend:
Removed from v.1.54  
changed lines
  Added in v.1.54.2.4

CVSweb <webmaster@jp.NetBSD.org>