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 35static 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 */ 91int 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} 112