1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-08 21:18:16 +03:00

merge from 3.0

(This used to be commit 309a9a4caf)
This commit is contained in:
Gerald Carter 2004-02-09 18:48:44 +00:00
parent 5f4f500df4
commit 2e2b654820
4 changed files with 395 additions and 18 deletions

View File

@ -53,7 +53,7 @@ AC_SUBST(LDSHFLAGS)
AC_SUBST(SONAMEFLAG)
AC_SUBST(SHLD)
AC_SUBST(HOST_OS)
AC_SUBST(PICFLAG)
AC_SUBST(PICFLAGS)
AC_SUBST(PICSUFFIX)
AC_SUBST(SHLIBEXT)
AC_SUBST(INSTALLCLIENTCMD_SH)
@ -178,7 +178,7 @@ HOST_OS="$host_os"
LDSHFLAGS="-shared"
SONAMEFLAG="#"
SHLD="\${CC}"
PICFLAG=""
PICFLAGS=""
PICSUFFIX="po"
SHLIBEXT="so"
@ -195,7 +195,7 @@ if test "$enable_shared" = "yes"; then
BLDSHARED="true"
LDSHFLAGS="-shared"
DYNEXP="-Wl,--export-dynamic"
PICFLAG="-fPIC"
PICFLAGS="-fPIC"
SONAMEFLAG="-Wl,-soname="
;;
*solaris*)
@ -203,12 +203,12 @@ if test "$enable_shared" = "yes"; then
LDSHFLAGS="-G"
SONAMEFLAG="-h "
if test "${GCC}" = "yes"; then
PICFLAG="-fPIC"
PICFLAGS="-fPIC"
if test "${ac_cv_prog_gnu_ld}" = "yes"; then
DYNEXP="-Wl,-E"
fi
else
PICFLAG="-KPIC"
PICFLAGS="-KPIC"
## ${CFLAGS} added for building 64-bit shared
## libs using Sun's Compiler
LDSHFLAGS="-G \${CFLAGS}"
@ -219,19 +219,19 @@ if test "$enable_shared" = "yes"; then
BLDSHARED="true"
LDSHFLAGS="-G"
SONAMEFLAG="-Wl,-h,"
PICFLAG="-KPIC" # Is this correct for SunOS
PICFLAGS="-KPIC" # Is this correct for SunOS
;;
*netbsd* | *freebsd*) BLDSHARED="true"
LDSHFLAGS="-shared"
DYNEXP="-Wl,--export-dynamic"
SONAMEFLAG="-Wl,-soname,"
PICFLAG="-fPIC -DPIC"
PICFLAGS="-fPIC -DPIC"
;;
*openbsd*) BLDSHARED="true"
LDSHFLAGS="-shared"
DYNEXP="-Wl,-Bdynamic"
SONAMEFLAG="-Wl,-soname,"
PICFLAG="-fPIC"
PICFLAGS="-fPIC"
;;
*irix*)
case "$host_os" in
@ -244,16 +244,16 @@ if test "$enable_shared" = "yes"; then
SONAMEFLAG="-soname "
SHLD="\${LD}"
if test "${GCC}" = "yes"; then
PICFLAG="-fPIC"
PICFLAGS="-fPIC"
else
PICFLAG="-KPIC"
PICFLAGS="-KPIC"
fi
;;
*aix*)
BLDSHARED="true"
LDSHFLAGS="-Wl,-bexpall,-bM:SRE,-bnoentry,-berok"
DYNEXP="-Wl,-brtl,-bexpall"
PICFLAG="-O2"
PICFLAGS="-O2"
if test "${GCC}" != "yes"; then
## for funky AIX compiler using strncpy()
CFLAGS="$CFLAGS -D_LINUX_SOURCE_COMPAT -qmaxmem=32000"
@ -267,7 +267,7 @@ if test "$enable_shared" = "yes"; then
SHLD="/usr/bin/ld"
LDSHFLAGS="-B symbolic -b -z"
SONAMEFLAG="+h "
PICFLAG="+z"
PICFLAGS="+z"
fi
DYNEXP="-Wl,-E"
;;
@ -277,7 +277,7 @@ if test "$enable_shared" = "yes"; then
BLDSHARED="true"
LDSHFLAGS="-shared"
SONAMEFLAG="-Wl,-soname,"
PICFLAG="-fPIC"
PICFLAGS="-fPIC"
;;
*sco*)
;;
@ -285,7 +285,7 @@ if test "$enable_shared" = "yes"; then
BLDSHARED="true"
LDSHFLAGS="-shared"
SONAMEFLAG="-Wl,-soname,"
PICFLAG="-KPIC"
PICFLAGS="-KPIC"
;;
*next2*)
;;
@ -328,11 +328,11 @@ AC_CACHE_CHECK([whether building shared libraries actually works],
ac_cv_shlib_works=no
# try building a trivial shared library
if test "$PICSUFFIX" = "po"; then
$CC $CPPFLAGS $CFLAGS $PICFLAG -c -o shlib.po ${srcdir-.}/tests/shlib.c &&
$CC $CPPFLAGS $CFLAGS $PICFLAGS -c -o shlib.po ${srcdir-.}/tests/shlib.c &&
$CC $CPPFLAGS $CFLAGS `eval echo $LDSHFLAGS` -o "shlib.$SHLIBEXT" shlib.po &&
ac_cv_shlib_works=yes
else
$CC $CPPFLAGS $CFLAGS $PICFLAG -c -o shlib.$PICSUFFIX ${srcdir-.}/tests/shlib.c &&
$CC $CPPFLAGS $CFLAGS $PICFLAGS -c -o shlib.$PICSUFFIX ${srcdir-.}/tests/shlib.c &&
mv shlib.$PICSUFFIX shlib.po &&
$CC $CPPFLAGS $CFLAGS `eval echo $LDSHFLAGS` -o "shlib.$SHLIBEXT" shlib.po &&
ac_cv_shlib_works=yes

View File

@ -14,7 +14,7 @@ all: testsmbc tree testacl
testsmbc: testsmbc.o
@echo Linking testsmbc
@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lsmbclient -L/usr/local/lib
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $< -lsmbclient -L/usr/local/lib
testsmbc-static: testsmbc.o
@echo Linking testsmbc

375
examples/nss/wbtest.c Normal file
View File

@ -0,0 +1,375 @@
/*
nss sample code for extended winbindd functionality
Copyright (C) Andrew Tridgell (tridge@samba.org)
you are free to use this code in any way you see fit, including
without restriction, using this code in your own products. You do
not need to give any attribution.
*/
/*
compile like this:
cc -o wbtest wbtest.c -ldl
and run like this:
./wbtest /lib/libnss_winbind.so
*/
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <nss.h>
#include <dlfcn.h>
#include <pwd.h>
#include <grp.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
typedef enum nss_status NSS_STATUS;
struct nss_state {
void *dl_handle;
char *nss_name;
char pwnam_buf[512];
};
/*
find a function in the nss library
*/
static void *find_fn(struct nss_state *nss, const char *name)
{
void *res;
char *s = NULL;
asprintf(&s, "_nss_%s_%s", nss->nss_name, name);
if (!s) {
errno = ENOMEM;
return NULL;
}
res = dlsym(nss->dl_handle, s);
free(s);
if (!res) {
errno = ENOENT;
return NULL;
}
return res;
}
/*
establish a link to the nss library
Return 0 on success and -1 on error
*/
int nss_open(struct nss_state *nss, const char *nss_path)
{
char *p;
p = strrchr(nss_path, '_');
if (!p) {
errno = EINVAL;
return -1;
}
nss->nss_name = strdup(p+1);
p = strchr(nss->nss_name, '.');
if (p) *p = 0;
nss->dl_handle = dlopen(nss_path, RTLD_LAZY);
if (!nss->dl_handle) {
free(nss->nss_name);
return -1;
}
return 0;
}
/*
close and cleanup a nss state
*/
void nss_close(struct nss_state *nss)
{
free(nss->nss_name);
dlclose(nss->dl_handle);
}
/*
make a getpwnam call.
Return 0 on success and -1 on error
*/
int nss_getpwent(struct nss_state *nss, struct passwd *pwd)
{
NSS_STATUS (*_nss_getpwent_r)(struct passwd *, char *,
size_t , int *) = find_fn(nss, "getpwent_r");
NSS_STATUS status;
int nss_errno = 0;
if (!_nss_getpwent_r) {
return -1;
}
status = _nss_getpwent_r(pwd, nss->pwnam_buf, sizeof(nss->pwnam_buf), &nss_errno);
if (status == NSS_STATUS_NOTFOUND) {
errno = ENOENT;
return -1;
}
if (status != NSS_STATUS_SUCCESS) {
errno = nss_errno;
return -1;
}
return 0;
}
/*
make a setpwent call.
Return 0 on success and -1 on error
*/
int nss_setpwent(struct nss_state *nss)
{
NSS_STATUS (*_nss_setpwent)(void) = find_fn(nss, "setpwent");
NSS_STATUS status;
if (!_nss_setpwent) {
return -1;
}
status = _nss_setpwent();
if (status != NSS_STATUS_SUCCESS) {
errno = EINVAL;
return -1;
}
return 0;
}
/*
make a endpwent call.
Return 0 on success and -1 on error
*/
int nss_endpwent(struct nss_state *nss)
{
NSS_STATUS (*_nss_endpwent)(void) = find_fn(nss, "endpwent");
NSS_STATUS status;
if (!_nss_endpwent) {
return -1;
}
status = _nss_endpwent();
if (status != NSS_STATUS_SUCCESS) {
errno = EINVAL;
return -1;
}
return 0;
}
/*
convert a name to a SID
caller frees
Return 0 on success and -1 on error
*/
int nss_nametosid(struct nss_state *nss, const char *name, char **sid)
{
NSS_STATUS (*_nss_nametosid)(const char *, char **, char *, size_t, int *) =
find_fn(nss, "nametosid");
NSS_STATUS status;
int nss_errno = 0;
char buf[200];
if (!_nss_nametosid) {
return -1;
}
status = _nss_nametosid(name, sid, buf, sizeof(buf), &nss_errno);
if (status == NSS_STATUS_NOTFOUND) {
errno = ENOENT;
return -1;
}
if (status != NSS_STATUS_SUCCESS) {
errno = nss_errno;
return -1;
}
*sid = strdup(*sid);
return 0;
}
/*
convert a SID to a name
caller frees
Return 0 on success and -1 on error
*/
int nss_sidtoname(struct nss_state *nss, char *sid, char **name)
{
NSS_STATUS (*_nss_sidtoname)(const char *, char **, char *, size_t, int *) =
find_fn(nss, "sidtoname");
NSS_STATUS status;
int nss_errno = 0;
char buf[200];
if (!_nss_sidtoname) {
return -1;
}
status = _nss_sidtoname(sid, name, buf, sizeof(buf), &nss_errno);
if (status == NSS_STATUS_NOTFOUND) {
errno = ENOENT;
return -1;
}
if (status != NSS_STATUS_SUCCESS) {
errno = nss_errno;
return -1;
}
*name = strdup(*name);
return 0;
}
/*
return a list of group SIDs for a user SID
the returned list is NULL terminated
Return 0 on success and -1 on error
*/
int nss_getusersids(struct nss_state *nss, const char *user_sid, char ***sids)
{
NSS_STATUS (*_nss_getusersids)(const char *, char **, int *, char *, size_t, int *) =
find_fn(nss, "getusersids");
NSS_STATUS status;
int nss_errno = 0;
char *s;
int i, num_groups = 0;
unsigned bufsize = 10;
char *buf;
if (!_nss_getusersids) {
return -1;
}
again:
buf = malloc(bufsize);
if (!buf) {
errno = ENOMEM;
return -1;
}
status = _nss_getusersids(user_sid, &s, &num_groups, buf, bufsize, &nss_errno);
if (status == NSS_STATUS_NOTFOUND) {
errno = ENOENT;
free(buf);
return -1;
}
if (status == NSS_STATUS_TRYAGAIN) {
bufsize *= 2;
free(buf);
goto again;
}
if (status != NSS_STATUS_SUCCESS) {
free(buf);
errno = nss_errno;
return -1;
}
if (num_groups == 0) {
free(buf);
return 0;
}
*sids = (char **)malloc(sizeof(char *) * (num_groups+1));
if (! *sids) {
errno = ENOMEM;
free(buf);
return -1;
}
for (i=0;i<num_groups;i++) {
(*sids)[i] = strdup(s);
s += strlen(s) + 1;
}
(*sids)[i] = NULL;
free(buf);
return 0;
}
static int nss_test_users(struct nss_state *nss)
{
struct passwd pwd;
if (nss_setpwent(nss) != 0) {
perror("setpwent");
return -1;
}
/* loop over all users */
while ((nss_getpwent(nss, &pwd) == 0)) {
char *sid, **group_sids, *name2;
int i;
printf("User %s\n", pwd.pw_name);
if (nss_nametosid(nss, pwd.pw_name, &sid) != 0) {
perror("nametosid");
return -1;
}
printf("\tSID %s\n", sid);
if (nss_sidtoname(nss, sid, &name2) != 0) {
perror("sidtoname");
return -1;
}
printf("\tSID->name %s\n", name2);
if (nss_getusersids(nss, sid, &group_sids) != 0) {
perror("getusersids");
return -1;
}
printf("\tGroups:\n");
for (i=0; group_sids[i]; i++) {
printf("\t\t%s\n", group_sids[i]);
free(group_sids[i]);
}
free(sid);
free(name2);
free(group_sids);
}
if (nss_endpwent(nss) != 0) {
perror("endpwent");
return -1;
}
return 0;
}
/*
main program. It lists all users, listing user SIDs for each user
*/
int main(int argc, char *argv[])
{
struct nss_state nss;
const char *so_path = "/lib/libnss_winbind.so";
int ret;
if (argc > 1) {
so_path = argv[1];
}
if (nss_open(&nss, so_path) != 0) {
perror("nss_open");
exit(1);
}
ret = nss_test_users(&nss);
nss_close(&nss);
return ret;
}

View File

@ -31,5 +31,7 @@ CREATE TABLE user (
logon_divs int(9),
hours_len int(9),
unknown_5 int(9),
unknown_6 int(9)
unknown_6 int(9),
bad_password_count int(9),
logon_count(9)
);