struct winbindd_response *response)
{
/* Fill in request and send down pipe */
- init_request(request, req_type);
+ winbindd_init_request(request, req_type);
- if (write_sock(request, sizeof(*request), 0, 0) == -1) {
+ if (winbind_write_sock(request, sizeof(*request), 0, 0) == -1) {
_pam_log(pamh, ctrl, LOG_ERR, "pam_winbind_request: write to socket failed!");
- close_sock();
+ winbind_close_sock();
return PAM_SERVICE_ERR;
}
/* Wait for reply */
- if (read_reply(response) == -1) {
+ if (winbindd_read_reply(response) == -1) {
_pam_log(pamh, ctrl, LOG_ERR, "pam_winbind_request: read from socket failed!");
- close_sock();
+ winbind_close_sock();
return PAM_SERVICE_ERR;
}
/* We are done with the socket - close it and avoid mischeif */
- close_sock();
+ winbind_close_sock();
/* Copy reply data from socket */
if (response->result == WINBINDD_OK) {
/* Free a response structure */
-void free_response(struct winbindd_response *response)
+void winbindd_free_response(struct winbindd_response *response)
{
/* Free any allocated extra_data */
/* Initialise a request structure */
-void init_request(struct winbindd_request *request, int request_type)
+void winbindd_init_request(struct winbindd_request *request, int request_type)
{
request->length = sizeof(struct winbindd_request);
/* Close established socket */
-void close_sock(void)
+void winbind_close_sock(void)
{
if (winbindd_fd != -1) {
close(winbindd_fd);
ZERO_STRUCT(response);
if (our_pid != getpid()) {
- close_sock();
+ winbind_close_sock();
our_pid = getpid();
}
if ((need_priv != 0) && (is_privileged == 0)) {
- close_sock();
+ winbind_close_sock();
}
if (winbindd_fd != -1) {
request.wb_flags = WBFLAG_RECURSE;
if ((winbindd_request_response(WINBINDD_INTERFACE_VERSION, &request, &response) != NSS_STATUS_SUCCESS) || (response.data.interface_version != WINBIND_INTERFACE_VERSION)) {
- close_sock();
+ winbind_close_sock();
return -1;
}
/* Write data to winbindd socket */
-int write_sock(void *buffer, int count, int recursing, int need_priv)
+int winbind_write_sock(void *buffer, int count, int recursing, int need_priv)
{
int result, nwritten;
ZERO_STRUCT(tv);
if (select(winbindd_fd + 1, &r_fds, NULL, NULL, &tv) == -1) {
- close_sock();
+ winbind_close_sock();
return -1; /* Select error */
}
/* Write failed */
- close_sock();
+ winbind_close_sock();
return -1;
}
/* Pipe has closed on remote end */
- close_sock();
+ winbind_close_sock();
goto restart;
}
}
/* Read data from winbindd socket */
-static int read_sock(void *buffer, int count)
+int winbind_read_sock(void *buffer, int count)
{
int nread = 0;
int total_time = 0, selret;
tv.tv_sec = 5;
if ((selret = select(winbindd_fd + 1, &r_fds, NULL, NULL, &tv)) == -1) {
- close_sock();
+ winbind_close_sock();
return -1; /* Select error */
}
/* Not ready for read yet... */
if (total_time >= 30) {
/* Timeout */
- close_sock();
+ winbind_close_sock();
return -1;
}
total_time += 5;
can do here is just return -1 and fail since the
transaction has failed half way through. */
- close_sock();
+ winbind_close_sock();
return -1;
}
/* Read reply */
-int read_reply(struct winbindd_response *response)
+int winbindd_read_reply(struct winbindd_response *response)
{
int result1, result2 = 0;
/* Read fixed length response */
- if ((result1 = read_sock(response, sizeof(struct winbindd_response)))
- == -1) {
-
+ result1 = winbind_read_sock(response,
+ sizeof(struct winbindd_response));
+ if (result1 == -1) {
return -1;
}
return -1;
}
- if ((result2 = read_sock(response->extra_data.data, extra_data_len))
- == -1) {
- free_response(response);
+ result2 = winbind_read_sock(response->extra_data.data,
+ extra_data_len);
+ if (result2 == -1) {
+ winbindd_free_response(response);
return -1;
}
}
/* Fill in request and send down pipe */
- init_request(request, req_type);
+ winbindd_init_request(request, req_type);
- if (write_sock(request, sizeof(*request),
- request->wb_flags & WBFLAG_RECURSE, need_priv) == -1) {
+ if (winbind_write_sock(request, sizeof(*request),
+ request->wb_flags & WBFLAG_RECURSE,
+ need_priv) == -1) {
return NSS_STATUS_UNAVAIL;
}
if ((request->extra_len != 0) &&
- (write_sock(request->extra_data.data, request->extra_len,
- request->wb_flags & WBFLAG_RECURSE, need_priv) == -1)) {
+ (winbind_write_sock(request->extra_data.data,
+ request->extra_len,
+ request->wb_flags & WBFLAG_RECURSE,
+ need_priv) == -1)) {
return NSS_STATUS_UNAVAIL;
}
init_response(response);
/* Wait for reply */
- if (read_reply(response) == -1) {
+ if (winbindd_read_reply(response) == -1) {
return NSS_STATUS_UNAVAIL;
}
/* Throw away extra data if client didn't request it */
if (response == &lresponse) {
- free_response(response);
+ winbindd_free_response(response);
}
/* Copy reply data from socket */
#include "winbind_nss_config.h"
#include "winbindd_nss.h"
-void init_request(struct winbindd_request *req,int rq_type);
+void winbindd_init_request(struct winbindd_request *req,int rq_type);
+void winbindd_free_response(struct winbindd_response *response);
NSS_STATUS winbindd_send_request(int req_type, int need_priv,
struct winbindd_request *request);
NSS_STATUS winbindd_get_response(struct winbindd_response *response);
NSS_STATUS winbindd_priv_request_response(int req_type,
struct winbindd_request *request,
struct winbindd_response *response);
-int write_sock(void *buffer, int count, int recursing, int need_priv);
-int read_reply(struct winbindd_response *response);
-void close_sock(void);
-void free_response(struct winbindd_response *response);
-const char *nss_err_str(NSS_STATUS ret);
+int winbindd_read_reply(struct winbindd_response *response);
+
bool winbind_env_set(void);
bool winbind_off(void);
bool winbind_on(void);
+int winbind_write_sock(void *buffer, int count, int recursing, int need_priv);
+int winbind_read_sock(void *buffer, int count);
+void winbind_close_sock(void);
+
+const char *nss_err_str(NSS_STATUS ret);
grp = fill_grent(&response.data.gr, response.extra_data.data);
- free_response(&response);
+ winbindd_free_response(&response);
return grp;
}
grp = fill_grent(&response.data.gr, response.extra_data.data);
- free_response(&response);
+ winbindd_free_response(&response);
return grp;
}
}
idx += sprintf(tmpbuf+idx, "%u", gid_list[i]);
- free_response(&response);
+ winbindd_free_response(&response);
return tmpbuf;
}
pwd = fill_pwent(&response.data.pw);
- free_response(&response);
+ winbindd_free_response(&response);
logit("getpwuid gave ptr %p\n", pwd);
pwd = fill_pwent(&response.data.pw);
- free_response(&response);
+ winbindd_free_response(&response);
logit("getpwnam gave ptr %p\n", pwd);
s = malloc(len+2);
if (!s) {
- free_response(&response);
+ winbindd_free_response(&response);
errno = ENOMEM;
return -1;
}
results[0].attr_un.au_char = s;
results[0].attr_flag = 0;
- free_response(&response);
+ winbindd_free_response(&response);
return 0;
}
s = malloc(len+2);
if (!s) {
- free_response(&response);
+ winbindd_free_response(&response);
errno = ENOMEM;
return -1;
}
results[0].attr_un.au_char = s;
results[0].attr_flag = 0;
- free_response(&response);
+ winbindd_free_response(&response);
return 0;
}
result = winbindd_request_response(WINBINDD_PAM_AUTH, &request, &response);
- free_response(&response);
+ winbindd_free_response(&response);
logit("auth result %d for '%s'\n", result, user);
result = winbindd_request_response(WINBINDD_PAM_CHAUTHTOK, &request, &response);
- free_response(&response);
+ winbindd_free_response(&response);
if (result == NSS_STATUS_SUCCESS) {
errno = 0;
if (status != NSS_STATUS_SUCCESS) {
/* free any extra data area in response structure */
- free_response(&response);
+ winbindd_free_response(&response);
nsd_logprintf(NSD_LOG_MIN,
"callback (winbind) returning not found, status = %d\n",
status);
return NSD_ERROR;
}
- free_response(&response);
+ winbindd_free_response(&response);
nsd_logprintf(NSD_LOG_MIN, " %s\n", result);
nsd_set_result(rq, NS_SUCCESS, result, rlen, DYNAMIC);
if (rlen == 0 || result == NULL)
return NSD_ERROR;
- free_response(&response);
+ winbindd_free_response(&response);
nsd_logprintf(NSD_LOG_MIN, " %s\n", result);
nsd_set_result(rq, NS_SUCCESS, result, rlen, DYNAMIC);
if (rlen == 0 || result == NULL)
return NSD_ERROR;
- free_response(&response);
+ winbindd_free_response(&response);
nsd_logprintf(NSD_LOG_MIN, " %s\n", result);
nsd_set_result(rq, NS_SUCCESS, result, rlen, DYNAMIC);
case WINBINDD_SETPWENT:
nsd_logprintf(NSD_LOG_MIN,
"callback (winbind) SETGRENT | SETPWENT\n");
- free_response(&response);
+ winbindd_free_response(&response);
return(do_list(1,rq));
case WINBINDD_GETGRENT:
gr = (struct winbindd_gr *)response.extra_data.data;
if (! gr ) {
nsd_logprintf(NSD_LOG_MIN, " no extra_data\n");
- free_response(&response);
+ winbindd_free_response(&response);
return NSD_ERROR;
}
}
entries = response.data.num_entries;
- free_response(&response);
+ winbindd_free_response(&response);
if (entries < MAX_GETPWENT_USERS)
return(do_list(2,rq));
else
pw = (struct winbindd_pw *)response.extra_data.data;
if (! pw ) {
nsd_logprintf(NSD_LOG_MIN, " no extra_data\n");
- free_response(&response);
+ winbindd_free_response(&response);
return NSD_ERROR;
}
for (i = 0; i < response.data.num_entries; i++) {
}
entries = response.data.num_entries;
- free_response(&response);
+ winbindd_free_response(&response);
if (entries < MAX_GETPWENT_USERS)
return(do_list(2,rq));
else
case WINBINDD_ENDPWENT:
nsd_logprintf(NSD_LOG_MIN, "callback (winbind) ENDGRENT | ENDPWENT\n");
nsd_append_element(rq, NS_SUCCESS, "\n", 1);
- free_response(&response);
+ winbindd_free_response(&response);
return NSD_NEXT;
default:
- free_response(&response);
+ winbindd_free_response(&response);
nsd_logprintf(NSD_LOG_MIN, "callback (winbind) invalid command %d\n", (int)rq->f_cmd_data);
return NSD_NEXT;
}
if (num_pw_cache > 0) {
ndx_pw_cache = num_pw_cache = 0;
- free_response(&getpwent_response);
+ winbindd_free_response(&getpwent_response);
}
ret = winbindd_request_response(WINBINDD_SETPWENT, NULL, NULL);
if (num_pw_cache > 0) {
ndx_pw_cache = num_pw_cache = 0;
- free_response(&getpwent_response);
+ winbindd_free_response(&getpwent_response);
}
ret = winbindd_request_response(WINBINDD_ENDPWENT, NULL, NULL);
/* Else call winbindd to get a bunch of entries */
if (num_pw_cache > 0) {
- free_response(&getpwent_response);
+ winbindd_free_response(&getpwent_response);
}
ZERO_STRUCT(request);
if (ndx_pw_cache == num_pw_cache) {
ndx_pw_cache = num_pw_cache = 0;
- free_response(&getpwent_response);
+ winbindd_free_response(&getpwent_response);
}
}
done:
*errnop = errno = 0;
}
- free_response(&response);
+ winbindd_free_response(&response);
done:
#ifdef DEBUG_NSS
*errnop = errno = 0;
}
- free_response(&response);
+ winbindd_free_response(&response);
done:
#ifdef DEBUG_NSS
fprintf(stderr, "[%5d]: getpwnam %s returns %s (%d)\n", getpid(),
if (num_gr_cache > 0) {
ndx_gr_cache = num_gr_cache = 0;
- free_response(&getgrent_response);
+ winbindd_free_response(&getgrent_response);
}
ret = winbindd_request_response(WINBINDD_SETGRENT, NULL, NULL);
if (num_gr_cache > 0) {
ndx_gr_cache = num_gr_cache = 0;
- free_response(&getgrent_response);
+ winbindd_free_response(&getgrent_response);
}
ret = winbindd_request_response(WINBINDD_ENDGRENT, NULL, NULL);
/* Else call winbindd to get a bunch of entries */
if (num_gr_cache > 0) {
- free_response(&getgrent_response);
+ winbindd_free_response(&getgrent_response);
}
ZERO_STRUCT(request);
if (ndx_gr_cache == num_gr_cache) {
ndx_gr_cache = num_gr_cache = 0;
- free_response(&getgrent_response);
+ winbindd_free_response(&getgrent_response);
}
}
done:
*errnop = 0;
}
- free_response(&response);
+ winbindd_free_response(&response);
done:
#ifdef DEBUG_NSS
fprintf(stderr, "[%5d]: getgrnam %s returns %s (%d)\n", getpid(),
*errnop = 0;
}
- free_response(&response);
+ winbindd_free_response(&response);
done:
#ifdef DEBUG_NSS
fprintf(stderr, "[%5d]: getgrgid %d returns %s (%d)\n", getpid(),
errno = *errnop = 0;
done:
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
strcpy(*sid, response.data.sid.sid);
failed:
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
}
sep_char = response.data.info.winbind_separator;
- free_response(&response);
+ winbindd_free_response(&response);
}
*errnop = errno = 0;
failed:
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
strcpy(*sid, response.data.sid.sid);
failed:
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
strcpy(*sid, response.data.sid.sid);
failed:
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
ret = parse_response(af, argp, &response);
}
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
ret = parse_response(AF_INET, argp, &response);
}
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
if( ret == NSS_STATUS_SUCCESS) {
parse_response(argp->key.hostaddr.type, argp, &response);
}
- free_response(&response);
+ winbindd_free_response(&response);
return ret;
}
nt_status = NT_STATUS_UNSUCCESSFUL;
if (error_string)
*error_string = smb_xstrdup("Reading winbind reply failed!");
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
if (!NT_STATUS_IS_OK(nt_status)) {
if (error_string)
*error_string = smb_xstrdup(response.data.auth.error_string);
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
if (flags & WBFLAG_PAM_UNIX_NAME) {
*unix_name = SMB_STRDUP((char *)response.extra_data.data);
if (!*unix_name) {
- free_response(&response);
+ winbindd_free_response(&response);
return NT_STATUS_NO_MEMORY;
}
}
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
nt_status = NT_STATUS_UNSUCCESSFUL;
if (error_string)
*error_string = smb_xstrdup("Reading winbind reply failed!");
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
{
if (error_string)
*error_string = smb_xstrdup(response.data.auth.error_string);
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
- free_response(&response);
+ winbindd_free_response(&response);
return nt_status;
}
SAFE_FREE(wb_request.extra_data.data);
if (result != NSS_STATUS_SUCCESS) {
- free_response(&wb_response);
+ winbindd_free_response(&wb_response);
return NT_STATUS_UNSUCCESSFUL;
}
wb_response.data.ccache_ntlm_auth.auth_blob_len);
if (wb_response.data.ccache_ntlm_auth.auth_blob_len > 0 &&
reply->data == NULL) {
- free_response(&wb_response);
+ winbindd_free_response(&wb_response);
return NT_STATUS_NO_MEMORY;
}
}
- free_response(&wb_response);
+ winbindd_free_response(&wb_response);
return NT_STATUS_MORE_PROCESSING_REQUIRED;
}