Blame nss/solnss.h

Packit 6bd9ab
/*
Packit 6bd9ab
   solnss.h - common functions for NSS lookups on Solaris
Packit 6bd9ab
Packit 6bd9ab
   Copyright (C) 2012 Arthur de Jong
Packit 6bd9ab
Packit 6bd9ab
   This library is free software; you can redistribute it and/or
Packit 6bd9ab
   modify it under the terms of the GNU Lesser General Public
Packit 6bd9ab
   License as published by the Free Software Foundation; either
Packit 6bd9ab
   version 2.1 of the License, or (at your option) any later version.
Packit 6bd9ab
Packit 6bd9ab
   This library is distributed in the hope that it will be useful,
Packit 6bd9ab
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 6bd9ab
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 6bd9ab
   Lesser General Public License for more details.
Packit 6bd9ab
Packit 6bd9ab
   You should have received a copy of the GNU Lesser General Public
Packit 6bd9ab
   License along with this library; if not, write to the Free Software
Packit 6bd9ab
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
Packit 6bd9ab
   02110-1301 USA
Packit 6bd9ab
*/
Packit 6bd9ab
Packit 6bd9ab
#ifndef NSS__SOLNSS_H
Packit 6bd9ab
#define NSS__SOLNSS_H 1
Packit 6bd9ab
#ifdef NSS_FLAVOUR_SOLARIS
Packit 6bd9ab
Packit 6bd9ab
/* extra definitions we need (Solaris NSS functions don't pass errno)
Packit 6bd9ab
   also clear the output values */
Packit 6bd9ab
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
Packit 6bd9ab
#define NSS_EXTRA_DEFS                                                      \
Packit 6bd9ab
  int *errnop = &(errno);                                                   \
Packit 6bd9ab
  NSS_ARGS(args)->returnval = NULL;                                         \
Packit 6bd9ab
  NSS_ARGS(args)->returnlen = 0;                                            \
Packit 6bd9ab
  NSS_ARGS(args)->erange = 0;                                               \
Packit 6bd9ab
  NSS_ARGS(args)->h_errno = 0;
Packit 6bd9ab
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
Packit 6bd9ab
#define NSS_EXTRA_DEFS                                                      \
Packit 6bd9ab
  int *errnop = &(errno);                                                   \
Packit 6bd9ab
  NSS_ARGS(args)->returnval = NULL;                                         \
Packit 6bd9ab
  NSS_ARGS(args)->erange = 0;                                               \
Packit 6bd9ab
  NSS_ARGS(args)->h_errno = 0;
Packit 6bd9ab
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
Packit 6bd9ab
Packit 6bd9ab
/* check validity of passed buffer (Solaris flavour) */
Packit 6bd9ab
#define NSS_BUFCHECK                                                        \
Packit 6bd9ab
  if ((NSS_ARGS(args)->buf.buffer == NULL) ||                               \
Packit 6bd9ab
      (NSS_ARGS(args)->buf.buflen <= 0))                                    \
Packit 6bd9ab
  {                                                                         \
Packit 6bd9ab
    NSS_ARGS(args)->erange = 1;                                             \
Packit 6bd9ab
    return NSS_STATUS_TRYAGAIN;                                             \
Packit 6bd9ab
  }
Packit 6bd9ab
Packit 6bd9ab
/* wrapper function body for read_xxxent that does the buffer handling,
Packit 6bd9ab
   return code handling and conversion to strings for nscd
Packit 6bd9ab
   (also see READ_RESULT_STRING below) */
Packit 6bd9ab
#define READ_RESULT(ent, extra...)                                          \
Packit 6bd9ab
  nss_status_t retv;                                                        \
Packit 6bd9ab
  READ_RESULT_STRING(ent, ##extra)                                          \
Packit 6bd9ab
  /* read the entry */                                                      \
Packit 6bd9ab
  retv = read_##ent(fp, args->buf.result, args->buf.buffer,                 \
Packit 6bd9ab
                    args->buf.buflen, ##extra);                             \
Packit 6bd9ab
  if (retv != NSS_STATUS_SUCCESS)                                           \
Packit 6bd9ab
    return retv;                                                            \
Packit 6bd9ab
  args->returnval = args->buf.result;                                       \
Packit 6bd9ab
  return NSS_STATUS_SUCCESS;
Packit 6bd9ab
Packit 6bd9ab
/* provide result handling for when libc (or nscd) expects the returned
Packit 6bd9ab
   values to be in string format */
Packit 6bd9ab
#ifdef HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN
Packit 6bd9ab
#define READ_RESULT_STRING(ent, extra...)                                   \
Packit 6bd9ab
  struct ent result;                                                        \
Packit 6bd9ab
  char *buffer;                                                             \
Packit 6bd9ab
  /* try to return in string format if requested */                         \
Packit 6bd9ab
  if (args->buf.result == NULL)                                             \
Packit 6bd9ab
  {                                                                         \
Packit 6bd9ab
    /* read the entry into a temporary buffer */                            \
Packit 6bd9ab
    buffer = (char *)malloc(args->buf.buflen);                              \
Packit 6bd9ab
    if (buffer == NULL)                                                     \
Packit 6bd9ab
      return NSS_STATUS_UNAVAIL;                                            \
Packit 6bd9ab
    retv = read_##ent(fp, &result, buffer, args->buf.buflen, ##extra);      \
Packit 6bd9ab
    /* format to string */                                                  \
Packit 6bd9ab
    if (retv == NSS_STATUS_SUCCESS)                                         \
Packit 6bd9ab
      if (ent##2str(&result, args->buf.buffer, args->buf.buflen) == NULL)   \
Packit 6bd9ab
      {                                                                     \
Packit 6bd9ab
        args->erange = 1;                                                   \
Packit 6bd9ab
        retv = NSS_NOTFOUND;                                                \
Packit 6bd9ab
      }                                                                     \
Packit 6bd9ab
    /* clean up and return result */                                        \
Packit 6bd9ab
    free(buffer);                                                           \
Packit 6bd9ab
    if (retv != NSS_STATUS_SUCCESS)                                         \
Packit 6bd9ab
      return retv;                                                          \
Packit 6bd9ab
    args->returnval = args->buf.buffer;                                     \
Packit 6bd9ab
    args->returnlen = strlen(args->returnval);                              \
Packit 6bd9ab
    return NSS_STATUS_SUCCESS;                                              \
Packit 6bd9ab
  }
Packit 6bd9ab
#else /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
Packit 6bd9ab
#define READ_RESULT_STRING(ent, extra...) ;
Packit 6bd9ab
#endif /* not HAVE_STRUCT_NSS_XBYY_ARGS_RETURNLEN */
Packit 6bd9ab
Packit 6bd9ab
/* this is the backend structure for Solaris */
Packit 6bd9ab
struct nss_ldap_backend {
Packit 6bd9ab
  nss_backend_op_t *ops;  /* function-pointer table */
Packit 6bd9ab
  int n_ops;              /* number of function pointers */
Packit 6bd9ab
  TFILE *fp;              /* file pointer for {set,get,end}ent() functions */
Packit 6bd9ab
};
Packit 6bd9ab
Packit 6bd9ab
/* constructor for LDAP backends */
Packit 6bd9ab
nss_backend_t *nss_ldap_constructor(nss_backend_op_t *ops, size_t sizeofops);
Packit 6bd9ab
Packit 6bd9ab
/* destructor for LDAP backends */
Packit 6bd9ab
nss_status_t nss_ldap_destructor(nss_backend_t *be, void UNUSED(*args));
Packit 6bd9ab
Packit 6bd9ab
#endif /* NSS_FLAVOUR_SOLARIS */
Packit 6bd9ab
#endif /* not NSS__COMMON_H */