mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
added solaris wrapper from tng
This commit is contained in:
parent
67ccfd2826
commit
d854d01d11
279
source/nsswitch/winbind_nss_solaris.c
Normal file
279
source/nsswitch/winbind_nss_solaris.c
Normal file
@ -0,0 +1,279 @@
|
||||
/*
|
||||
Solaris NSS wrapper for winbind
|
||||
- Shirish Kalele 2000
|
||||
|
||||
Based on Luke Howard's ldap_nss module for Solaris
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <string.h>
|
||||
#include <pwd.h>
|
||||
#include <syslog.h>
|
||||
#include <sys/syslog.h>
|
||||
#include "includes.h"
|
||||
#include "winbind_nss_config.h"
|
||||
|
||||
#ifdef HAVE_NSS_COMMON_H
|
||||
|
||||
#undef NSS_DEBUG
|
||||
|
||||
#ifdef NSS_DEBUG
|
||||
#define NSS_DEBUG(str) syslog(LOG_DEBUG, "nss_winbind: %s", str);
|
||||
#else
|
||||
#define NSS_DEBUG(str) ;
|
||||
#endif
|
||||
|
||||
#define NSS_ARGS(args) ((nss_XbyY_args_t *)args)
|
||||
|
||||
#define make_pwent_str(dest, src) \
|
||||
{ \
|
||||
if((dest = get_static(buffer, buflen, strlen(src)+1)) == NULL) \
|
||||
{ \
|
||||
*errnop = ERANGE; \
|
||||
NSS_DEBUG("ERANGE error"); \
|
||||
return NSS_STATUS_TRYAGAIN; \
|
||||
} \
|
||||
strcpy(dest, src); \
|
||||
}
|
||||
|
||||
static NSS_STATUS _nss_winbind_setpwent_solwrap (nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_DEBUG("_nss_winbind_setpwent_solwrap");
|
||||
return _nss_winbind_setpwent();
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_endpwent_solwrap (nss_backend_t * be, void *args)
|
||||
{
|
||||
NSS_DEBUG("_nss_winbind_endpwent_solwrap");
|
||||
return _nss_winbind_endpwent();
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getpwent_solwrap (nss_backend_t* be, void *args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
char* buffer = NSS_ARGS(args)->buf.buffer;
|
||||
int buflen = NSS_ARGS(args)->buf.buflen;
|
||||
struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
|
||||
int* errnop = &NSS_ARGS(args)->erange;
|
||||
char logmsg[80];
|
||||
|
||||
ret = _nss_winbind_getpwent_r(result, buffer,
|
||||
buflen, errnop);
|
||||
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
{
|
||||
snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning user: %s\n",
|
||||
result->pw_name);
|
||||
NSS_DEBUG(logmsg);
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
} else {
|
||||
snprintf(logmsg, 79, "_nss_winbind_getpwent_solwrap: Returning error: %d.\n",ret);
|
||||
NSS_DEBUG(logmsg);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getpwnam_solwrap (nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
|
||||
|
||||
NSS_DEBUG("_nss_winbind_getpwnam_solwrap");
|
||||
|
||||
ret = _nss_winbind_getpwnam_r (NSS_ARGS(args)->key.name,
|
||||
result,
|
||||
NSS_ARGS(args)->buf.buffer,
|
||||
NSS_ARGS(args)->buf.buflen,
|
||||
&NSS_ARGS(args)->erange);
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getpwuid_solwrap(nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
struct passwd* result = (struct passwd*) NSS_ARGS(args)->buf.result;
|
||||
|
||||
NSS_DEBUG("_nss_winbind_getpwuid_solwrap");
|
||||
ret = _nss_winbind_getpwuid_r (NSS_ARGS(args)->key.uid,
|
||||
result,
|
||||
NSS_ARGS(args)->buf.buffer,
|
||||
NSS_ARGS(args)->buf.buflen,
|
||||
&NSS_ARGS(args)->erange);
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSS_STATUS _nss_winbind_passwd_destr (nss_backend_t * be, void *args)
|
||||
{
|
||||
free(be);
|
||||
NSS_DEBUG("_nss_winbind_passwd_destr");
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static nss_backend_op_t passwd_ops[] =
|
||||
{
|
||||
_nss_winbind_passwd_destr,
|
||||
_nss_winbind_endpwent_solwrap, /* NSS_DBOP_ENDENT */
|
||||
_nss_winbind_setpwent_solwrap, /* NSS_DBOP_SETENT */
|
||||
_nss_winbind_getpwent_solwrap, /* NSS_DBOP_GETENT */
|
||||
_nss_winbind_getpwnam_solwrap, /* NSS_DBOP_PASSWD_BYNAME */
|
||||
_nss_winbind_getpwuid_solwrap /* NSS_DBOP_PASSWD_BYUID */
|
||||
};
|
||||
|
||||
nss_backend_t*
|
||||
_nss_winbind_passwd_constr (const char* db_name,
|
||||
const char* src_name,
|
||||
const char* cfg_args)
|
||||
{
|
||||
nss_backend_t *be;
|
||||
|
||||
if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
|
||||
return NULL;
|
||||
|
||||
be->ops = passwd_ops;
|
||||
be->n_ops = sizeof(passwd_ops) / sizeof(nss_backend_op_t);
|
||||
|
||||
NSS_DEBUG("Initialized nss_winbind passwd backend");
|
||||
return be;
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
GROUP database backend
|
||||
*****************************************************************/
|
||||
|
||||
static NSS_STATUS _nss_winbind_setgrent_solwrap (nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_DEBUG("_nss_winbind_setgrent_solwrap");
|
||||
return _nss_winbind_setgrent();
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_endgrent_solwrap (nss_backend_t * be, void *args)
|
||||
{
|
||||
NSS_DEBUG("_nss_winbind_endgrent_solwrap");
|
||||
return _nss_winbind_endgrent();
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getgrent_solwrap(nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
char* buffer = NSS_ARGS(args)->buf.buffer;
|
||||
int buflen = NSS_ARGS(args)->buf.buflen;
|
||||
struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
|
||||
int* errnop = &NSS_ARGS(args)->erange;
|
||||
char logmsg[80];
|
||||
|
||||
ret = _nss_winbind_getgrent_r(result, buffer,
|
||||
buflen, errnop);
|
||||
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
{
|
||||
snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning group: %s\n", result->gr_name);
|
||||
NSS_DEBUG(logmsg);
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
} else {
|
||||
snprintf(logmsg, 79, "_nss_winbind_getgrent_solwrap: Returning error: %d.\n", ret);
|
||||
NSS_DEBUG(logmsg);
|
||||
}
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getgrnam_solwrap(nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
|
||||
|
||||
NSS_DEBUG("_nss_winbind_getgrnam_solwrap");
|
||||
ret = _nss_winbind_getgrnam_r(NSS_ARGS(args)->key.name,
|
||||
result,
|
||||
NSS_ARGS(args)->buf.buffer,
|
||||
NSS_ARGS(args)->buf.buflen,
|
||||
&NSS_ARGS(args)->erange);
|
||||
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getgrgid_solwrap(nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_STATUS ret;
|
||||
struct group* result = (struct group*) NSS_ARGS(args)->buf.result;
|
||||
|
||||
NSS_DEBUG("_nss_winbind_getgrgid_solwrap");
|
||||
ret = _nss_winbind_getgrgid_r (NSS_ARGS(args)->key.gid,
|
||||
result,
|
||||
NSS_ARGS(args)->buf.buffer,
|
||||
NSS_ARGS(args)->buf.buflen,
|
||||
&NSS_ARGS(args)->erange);
|
||||
|
||||
if(ret == NSS_STATUS_SUCCESS)
|
||||
NSS_ARGS(args)->returnval = (void*) result;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_getgroupsbymember_solwrap(nss_backend_t* be, void* args)
|
||||
{
|
||||
NSS_DEBUG("_nss_winbind_getgroupsbymember");
|
||||
return NSS_STATUS_NOTFOUND;
|
||||
}
|
||||
|
||||
static NSS_STATUS
|
||||
_nss_winbind_group_destr (nss_backend_t* be, void* args)
|
||||
{
|
||||
free(be);
|
||||
NSS_DEBUG("_nss_winbind_group_destr");
|
||||
return NSS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
static nss_backend_op_t group_ops[] =
|
||||
{
|
||||
_nss_winbind_group_destr,
|
||||
_nss_winbind_endgrent_solwrap,
|
||||
_nss_winbind_setgrent_solwrap,
|
||||
_nss_winbind_getgrent_solwrap,
|
||||
_nss_winbind_getgrnam_solwrap,
|
||||
_nss_winbind_getgrgid_solwrap,
|
||||
_nss_winbind_getgroupsbymember_solwrap
|
||||
};
|
||||
|
||||
nss_backend_t*
|
||||
_nss_winbind_group_constr (const char* db_name,
|
||||
const char* src_name,
|
||||
const char* cfg_args)
|
||||
{
|
||||
nss_backend_t* be;
|
||||
|
||||
if(!(be = (nss_backend_t*) malloc(sizeof(nss_backend_t))) )
|
||||
return NULL;
|
||||
|
||||
be->ops = group_ops;
|
||||
be->n_ops = sizeof(group_ops) / sizeof(nss_backend_op_t);
|
||||
|
||||
NSS_DEBUG("Initialized nss_winbind group backend");
|
||||
return be;
|
||||
}
|
||||
|
||||
#endif /* SUN_NSS */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user