1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
/*
passwd.c - NSS lookup functions for passwd database
Copyright (C) 2006 West Consulting
Copyright (C) 2006 Arthur de Jong
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
MA 02110-1301 USA
*/
#include "config.h"
#include <string.h>
#include <nss.h>
#include <errno.h>
#include "exports.h"
#include "nslcd-client.h"
#include "common.h"
/* Macros for expanding the LDF_PASSWD macro. */
#define LDF_STRING(field) READ_STRING_BUF(fp,field)
#define LDF_TYPE(field,type) READ_TYPE(fp,field,type)
#define PASSWD_NAME result->pw_name
#define PASSWD_PASSWD result->pw_passwd
#define PASSWD_UID result->pw_uid
#define PASSWD_GID result->pw_gid
#define PASSWD_GECOS result->pw_gecos
#define PASSWD_DIR result->pw_dir
#define PASSWD_SHELL result->pw_shell
enum nss_status _nss_ldap_getpwnam_r(const char *name,struct passwd *result,char *buffer,size_t buflen,int *errnop)
{
FILE *fp;
size_t bufptr=0;
int32_t tmpint32;
/* open socket and write request */
OPEN_SOCK(fp);
WRITE_REQUEST(fp,NSLCD_RT_GETPWBYNAME);
WRITE_STRING(fp,name);
WRITE_FLUSH(fp);
/* read response header */
READ_RESPONSEHEADER(fp,NSLCD_RT_GETPWBYNAME);
/* read response */
READ_RESPONSE(fp);
LDF_PASSWD;
/* close socket and we're done */
fclose(fp);
return NSS_STATUS_SUCCESS;
}
enum nss_status _nss_ldap_getpwuid_r(uid_t uid,struct passwd *result,char *buffer,size_t buflen,int *errnop)
{
FILE *fp;
size_t bufptr=0;
int32_t tmpint32;
/* open socket and write request */
OPEN_SOCK(fp);
WRITE_REQUEST(fp,NSLCD_RT_GETPWBYUID);
WRITE_TYPE(fp,uid,uid_t);
WRITE_FLUSH(fp);
/* read response header */
READ_RESPONSEHEADER(fp,NSLCD_RT_GETPWBYUID);
/* read response */
READ_RESPONSE(fp);
LDF_PASSWD;
/* close socket and we're done */
fclose(fp);
return NSS_STATUS_SUCCESS;
}
/* thread-local file pointer to an ongoing request */
static __thread FILE *pwentfp;
#define fp pwentfp
/* open a connection to the nslcd and write the request */
enum nss_status _nss_ldap_setpwent(void)
{
int32_t tmpint32;
/* this is to satisfy our macros */
int errnocp;
int *errnop;
errnop=&errnocp;
/* close the existing stream if it is still open */
if (fp!=NULL)
_nss_ldap_endpwent();
/* open a new stream and write the request */
OPEN_SOCK(fp);
WRITE_REQUEST(fp,NSLCD_RT_GETPWALL);
WRITE_FLUSH(fp);
/* read response header */
READ_RESPONSEHEADER(fp,NSLCD_RT_GETPWALL);
return NSS_STATUS_SUCCESS;
}
/* read password data from an opened stream */
enum nss_status _nss_ldap_getpwent_r(struct passwd *result,char *buffer,size_t buflen,int *errnop)
{
int32_t tmpint32;
size_t bufptr=0;
/* check that we have a valid file descriptor */
if (fp==NULL)
{
*errnop=ENOENT;
return NSS_STATUS_UNAVAIL;
}
/* read a response */
READ_RESPONSE(fp);
LDF_PASSWD;
return NSS_STATUS_SUCCESS;
}
/* close the stream opened with setpwent() above */
enum nss_status _nss_ldap_endpwent(void)
{
if (fp==NULL)
return NSS_STATUS_SUCCESS;
fclose(fp);
return NSS_STATUS_SUCCESS;
}
|