~zulcss/samba/server-dailies-3.4

« back to all changes in this revision

Viewing changes to examples/nss/wbtest.c

  • Committer: Chuck Short
  • Date: 2010-09-28 20:38:39 UTC
  • Revision ID: zulcss@ubuntu.com-20100928203839-pgjulytsi9ue63x1
Initial version

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* 
 
2
   nss sample code for extended winbindd functionality
 
3
 
 
4
   Copyright (C) Andrew Tridgell (tridge@samba.org)   
 
5
 
 
6
   you are free to use this code in any way you see fit, including
 
7
   without restriction, using this code in your own products. You do
 
8
   not need to give any attribution.
 
9
*/
 
10
 
 
11
/*
 
12
   compile like this:
 
13
 
 
14
      cc -o wbtest wbtest.c nss_winbind.c -ldl
 
15
 
 
16
   and run like this:
 
17
 
 
18
      ./wbtest /lib/libnss_winbind.so
 
19
*/
 
20
 
 
21
#define _GNU_SOURCE
 
22
 
 
23
#include <stdio.h>
 
24
#include <stdlib.h>
 
25
#include <nss.h>
 
26
#include <dlfcn.h>
 
27
#include <pwd.h>
 
28
#include <grp.h>
 
29
#include <errno.h>
 
30
#include <string.h>
 
31
#include <sys/types.h>
 
32
 
 
33
#include "nss_winbind.h"
 
34
 
 
35
static int nss_test_users(struct nss_state *nss)
 
36
{
 
37
        struct passwd pwd;
 
38
 
 
39
        if (nss_setpwent(nss) != 0) {
 
40
                perror("setpwent");
 
41
                return -1;
 
42
        }
 
43
 
 
44
        /* loop over all users */
 
45
        while ((nss_getpwent(nss, &pwd) == 0)) {
 
46
                char *sid, **group_sids, *name2;
 
47
                int i;
 
48
 
 
49
                printf("User %s\n", pwd.pw_name);
 
50
                if (nss_nametosid(nss, pwd.pw_name, &sid) != 0) {
 
51
                        perror("nametosid");
 
52
                        return -1;
 
53
                }
 
54
                printf("\tSID %s\n", sid);
 
55
 
 
56
                if (nss_sidtoname(nss, sid, &name2) != 0) {
 
57
                        perror("sidtoname");
 
58
                        return -1;
 
59
                }
 
60
                printf("\tSID->name %s\n", name2);
 
61
 
 
62
                if (nss_getusersids(nss, sid, &group_sids) != 0) {
 
63
                        perror("getusersids");
 
64
                        return -1;
 
65
                }
 
66
 
 
67
                printf("\tGroups:\n");
 
68
                for (i=0; group_sids[i]; i++) {
 
69
                        printf("\t\t%s\n", group_sids[i]);
 
70
                        free(group_sids[i]);
 
71
                }
 
72
 
 
73
                free(sid);
 
74
                free(name2);
 
75
                free(group_sids);
 
76
        }
 
77
 
 
78
 
 
79
        if (nss_endpwent(nss) != 0) {
 
80
                perror("endpwent");
 
81
                return -1;
 
82
        }
 
83
 
 
84
        return 0;
 
85
}
 
86
 
 
87
 
 
88
/*
 
89
  main program. It lists all users, listing user SIDs for each user
 
90
 */
 
91
int main(int argc, char *argv[])
 
92
{       
 
93
        struct nss_state nss;
 
94
        const char *so_path = "/lib/libnss_winbind.so";
 
95
        int ret;
 
96
 
 
97
        if (argc > 1) {
 
98
                so_path = argv[1];
 
99
        }
 
100
 
 
101
        if (nss_open(&nss, so_path) != 0) {
 
102
                perror("nss_open");
 
103
                exit(1);
 
104
        }
 
105
 
 
106
        ret = nss_test_users(&nss);
 
107
 
 
108
        nss_close(&nss);
 
109
 
 
110
        return ret;
 
111
}