version 1.1.2.2, 2007/01/02 07:47:24
|
version 1.1.2.3, 2007/01/02 17:53:21
|
|
|
| |
#if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) | #if defined(PEGASUS_ENABLE_PRIVILEGE_SEPARATION) |
| |
|
//============================================================================== |
|
// |
|
// _recv() |
|
// |
|
// Receives *size* bytes from the given socket. |
|
// |
|
//============================================================================== |
|
|
|
static ssize_t _recv(int sock, void* buffer, size_t size) |
|
{ |
|
size_t r = size; |
|
char* p = (char*)buffer; |
|
|
|
if (size == 0) |
|
return -1; |
|
|
|
while (r) |
|
{ |
|
ssize_t n; |
|
|
|
CIMSERVERA_RESTART(read(sock, p, r), n); |
|
|
|
if (n == -1) |
|
return -1; |
|
else if (n == 0) |
|
return size - r; |
|
|
|
r -= n; |
|
p += n; |
|
} |
|
|
|
return size - r; |
|
} |
|
|
|
//============================================================================== |
|
// |
|
// _send() |
|
// |
|
// Sends *size* bytes on the given socket. |
|
// |
|
//============================================================================== |
|
|
|
static ssize_t _send(int sock, void* buffer, size_t size) |
|
{ |
|
size_t r = size; |
|
char* p = (char*)buffer; |
|
|
|
while (r) |
|
{ |
|
ssize_t n; |
|
CIMSERVERA_RESTART(write(sock, p, r), n); |
|
|
|
if (n == -1) |
|
return -1; |
|
else if (n == 0) |
|
return size - r; |
|
|
|
r -= n; |
|
p += n; |
|
} |
|
|
|
return size - r; |
|
} |
|
|
static int _receiveDescriptorArray(int sock, int descriptors[], size_t count) | static int _receiveDescriptorArray(int sock, int descriptors[], size_t count) |
{ | { |
// This control data begins with a cmsghdr struct followed by the data | // This control data begins with a cmsghdr struct followed by the data |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PING_REQUEST; | header.code = EXECUTOR_PING_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
ExecutorPingResponse response; | ExecutorPingResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
if (response.magic == EXECUTOR_PING_MAGIC) | if (response.magic == EXECUTOR_PING_MAGIC) |
|
|
if (mode != 'r' && mode != 'w') | if (mode != 'r' && mode != 'w') |
return NULL; | return NULL; |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_OPEN_FILE_REQUEST; | header.code = EXECUTOR_OPEN_FILE_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return NULL; | return NULL; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorOpenFileRequest request; | ExecutorOpenFileRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.path, path, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.path, path, EXECUTOR_BUFFER_SIZE); |
request.mode = mode; | request.mode = mode; |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return NULL; | return NULL; |
| |
// Receive the response | // Receive the response |
| |
ExecutorOpenFileResponse response; | ExecutorOpenFileResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return NULL; | return NULL; |
| |
// Receive descriptor (if response successful). | // Receive descriptor (if response successful). |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_RENAME_FILE_REQUEST; | header.code = EXECUTOR_RENAME_FILE_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorRenameFileRequest request; | ExecutorRenameFileRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.oldPath, oldPath, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.oldPath, oldPath, EXECUTOR_BUFFER_SIZE); |
Strlcpy(request.newPath, newPath, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.newPath, newPath, EXECUTOR_BUFFER_SIZE); |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorRenameFileResponse response; | ExecutorRenameFileResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_REMOVE_FILE_REQUEST; | header.code = EXECUTOR_REMOVE_FILE_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorRemoveFileRequest request; | ExecutorRemoveFileRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.path, path, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.path, path, EXECUTOR_BUFFER_SIZE); |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorRemoveFileResponse response; | ExecutorRemoveFileResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
if (n >= EXECUTOR_BUFFER_SIZE) | if (n >= EXECUTOR_BUFFER_SIZE) |
return -1; | return -1; |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_START_PROVIDER_AGENT_REQUEST; | header.code = EXECUTOR_START_PROVIDER_AGENT_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorStartProviderAgentRequest request; | ExecutorStartProviderAgentRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
|
|
request.uid = uid; | request.uid = uid; |
request.gid = gid; | request.gid = gid; |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorStartProviderAgentResponse response; | ExecutorStartProviderAgentResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
// Check response status and pid. | // Check response status and pid. |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_DAEMONIZE_EXECUTOR_REQUEST; | header.code = EXECUTOR_DAEMONIZE_EXECUTOR_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorDaemonizeExecutorResponse response; | ExecutorDaemonizeExecutorResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_CHANGE_OWNER_REQUEST; | header.code = EXECUTOR_CHANGE_OWNER_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body: |
// _send request body: |
| |
ExecutorChangeOwnerRequest request; | ExecutorChangeOwnerRequest request; |
Strlcpy(request.path, path, sizeof(request.path)); | Strlcpy(request.path, path, sizeof(request.path)); |
Strlcpy(request.owner, owner, sizeof(request.owner)); | Strlcpy(request.owner, owner, sizeof(request.owner)); |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorChangeOwnerResponse response; | ExecutorChangeOwnerResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_WAIT_PID_REQUEST; | header.code = EXECUTOR_WAIT_PID_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body: |
// _send request body: |
| |
ExecutorWaitPidRequest request; | ExecutorWaitPidRequest request; |
request.pid = pid; | request.pid = pid; |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorWaitPidResponse response; | ExecutorWaitPidResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PAM_AUTHENTICATE_REQUEST; | header.code = EXECUTOR_PAM_AUTHENTICATE_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorPAMAuthenticateRequest request; | ExecutorPAMAuthenticateRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); |
Strlcpy(request.password, password, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.password, password, EXECUTOR_BUFFER_SIZE); |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorPAMAuthenticateResponse response; | ExecutorPAMAuthenticateResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |
|
|
{ | { |
AutoMutex autoMutex(_mutex); | AutoMutex autoMutex(_mutex); |
| |
// Send request header: |
// _send request header: |
| |
ExecutorRequestHeader header; | ExecutorRequestHeader header; |
header.code = EXECUTOR_PAM_VALIDATE_USER_REQUEST; | header.code = EXECUTOR_PAM_VALIDATE_USER_REQUEST; |
| |
if (Send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
if (_send(_getSock(), &header, sizeof(header)) != sizeof(header)) |
return -1; | return -1; |
| |
// Send request body. |
// _send request body. |
| |
ExecutorPAMValidateUserRequest request; | ExecutorPAMValidateUserRequest request; |
memset(&request, 0, sizeof(request)); | memset(&request, 0, sizeof(request)); |
Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); | Strlcpy(request.username, username, EXECUTOR_BUFFER_SIZE); |
| |
if (Send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
if (_send(_getSock(), &request, sizeof(request)) != sizeof(request)) |
return -1; | return -1; |
| |
// Receive the response | // Receive the response |
| |
ExecutorPAMValidateUserResponse response; | ExecutorPAMValidateUserResponse response; |
| |
if (Recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
if (_recv(_getSock(), &response, sizeof(response)) != sizeof(response)) |
return -1; | return -1; |
| |
return response.status; | return response.status; |