Changeset View
Changeset View
Standalone View
Standalone View
head/usr.sbin/nscd/query.c
Show First 20 Lines • Show All 154 Lines • ▼ Show 20 Lines | |||||
static int | static int | ||||
on_query_startup(struct query_state *qstate) | on_query_startup(struct query_state *qstate) | ||||
{ | { | ||||
struct msghdr cred_hdr; | struct msghdr cred_hdr; | ||||
struct iovec iov; | struct iovec iov; | ||||
struct cmsgcred *cred; | struct cmsgcred *cred; | ||||
int elem_type; | int elem_type; | ||||
struct { | union { | ||||
struct cmsghdr hdr; | struct cmsghdr hdr; | ||||
char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; | char cred[CMSG_SPACE(sizeof(struct cmsgcred))]; | ||||
} cmsg; | } cmsg; | ||||
TRACE_IN(on_query_startup); | TRACE_IN(on_query_startup); | ||||
assert(qstate != NULL); | assert(qstate != NULL); | ||||
memset(&cred_hdr, 0, sizeof(struct msghdr)); | memset(&cred_hdr, 0, sizeof(struct msghdr)); | ||||
cred_hdr.msg_iov = &iov; | cred_hdr.msg_iov = &iov; | ||||
cred_hdr.msg_iovlen = 1; | cred_hdr.msg_iovlen = 1; | ||||
cred_hdr.msg_control = (caddr_t)&cmsg; | cred_hdr.msg_control = &cmsg; | ||||
cred_hdr.msg_controllen = CMSG_LEN(sizeof(struct cmsgcred)); | cred_hdr.msg_controllen = CMSG_SPACE(sizeof(struct cmsgcred)); | ||||
memset(&iov, 0, sizeof(struct iovec)); | memset(&iov, 0, sizeof(struct iovec)); | ||||
iov.iov_base = &elem_type; | iov.iov_base = &elem_type; | ||||
iov.iov_len = sizeof(int); | iov.iov_len = sizeof(int); | ||||
if (recvmsg(qstate->sockfd, &cred_hdr, 0) == -1) { | if (recvmsg(qstate->sockfd, &cred_hdr, 0) == -1) { | ||||
TRACE_OUT(on_query_startup); | TRACE_OUT(on_query_startup); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
if (cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(struct cmsgcred)) | if (cred_hdr.msg_controllen < CMSG_LEN(sizeof(struct cmsgcred)) | ||||
|| cmsg.hdr.cmsg_len < CMSG_LEN(sizeof(struct cmsgcred)) | |||||
|| cmsg.hdr.cmsg_level != SOL_SOCKET | || cmsg.hdr.cmsg_level != SOL_SOCKET | ||||
|| cmsg.hdr.cmsg_type != SCM_CREDS) { | || cmsg.hdr.cmsg_type != SCM_CREDS) { | ||||
TRACE_OUT(on_query_startup); | TRACE_OUT(on_query_startup); | ||||
return (-1); | return (-1); | ||||
} | } | ||||
cred = (struct cmsgcred *)CMSG_DATA(&cmsg); | cred = (struct cmsgcred *)CMSG_DATA(&cmsg); | ||||
qstate->uid = cred->cmcred_uid; | qstate->uid = cred->cmcred_uid; | ||||
▲ Show 20 Lines • Show All 1,088 Lines • Show Last 20 Lines |