|
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 */
|