pacemaker  2.0.4-2deceaa
Scalable High-Availability cluster resource manager
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Macros | Functions
ipc.c File Reference
#include <crm_internal.h>
#include <sys/param.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <grp.h>
#include <errno.h>
#include <fcntl.h>
#include <bzlib.h>
#include <crm/crm.h>
#include <crm/msg_xml.h>
#include <crm/common/ipc.h>
#include <crm/common/ipcs_internal.h>
#include <crm/common/ipc_internal.h>
Include dependency graph for ipc.c:

Go to the source code of this file.

Macros

#define PCMK_IPC_VERSION   1
 
#define PCMK_IPC_DEFAULT_QUEUE_MAX   500
 
#define MIN_MSG_SIZE   12336 /* sizeof(struct qb_ipc_connection_response) */
 
#define MAX_MSG_SIZE   128*1024 /* 128k default */
 

Functions

unsigned int crm_ipc_default_buffer_size (void)
 
xmlNode * create_request_adv (const char *task, xmlNode *msg_data, const char *host_to, const char *sys_to, const char *sys_from, const char *uuid_from, const char *origin)
 
xmlNode * create_reply_adv (xmlNode *original_request, xmlNode *xml_response_data, const char *origin)
 
guint pcmk__ipc_client_count ()
 
void pcmk__foreach_ipc_client (GHFunc func, gpointer user_data)
 
void pcmk__foreach_ipc_client_remove (GHRFunc func, gpointer user_data)
 
pcmk__client_tpcmk__find_client (qb_ipcs_connection_t *c)
 
pcmk__client_tpcmk__find_client_by_id (const char *id)
 
const char * pcmk__client_name (pcmk__client_t *c)
 
const char * pcmk__client_type_str (enum pcmk__client_type client_type)
 
void pcmk__client_cleanup (void)
 
void pcmk__drop_all_clients (qb_ipcs_service_t *service)
 
pcmk__client_tpcmk__new_unauth_client (void *key)
 Allocate a new pcmk__client_t object and generate its ID. More...
 
pcmk__client_tpcmk__new_client (qb_ipcs_connection_t *c, uid_t uid_client, gid_t gid_client)
 
void pcmk_free_ipc_event (struct iovec *event)
 Free an I/O vector created by pcmk__ipc_prepare_iov() More...
 
void pcmk__free_client (pcmk__client_t *c)
 
bool pcmk__set_client_queue_max (pcmk__client_t *client, const char *qmax)
 
int pcmk__client_pid (qb_ipcs_connection_t *c)
 
xmlNode * pcmk__client_data2xml (pcmk__client_t *c, void *data, uint32_t *id, uint32_t *flags)
 
int pcmk__ipc_prepare_iov (uint32_t request, xmlNode *message, uint32_t max_send_size, struct iovec **result, ssize_t *bytes)
 
int pcmk__ipc_send_iov (pcmk__client_t *c, struct iovec *iov, uint32_t flags)
 
int pcmk__ipc_send_xml (pcmk__client_t *c, uint32_t request, xmlNode *message, uint32_t flags)
 
void pcmk__ipc_send_ack_as (const char *function, int line, pcmk__client_t *c, uint32_t request, uint32_t flags, const char *tag)
 
void pcmk__serve_based_ipc (qb_ipcs_service_t **ipcs_ro, qb_ipcs_service_t **ipcs_rw, qb_ipcs_service_t **ipcs_shm, struct qb_ipcs_service_handlers *ro_cb, struct qb_ipcs_service_handlers *rw_cb)
 
void pcmk__stop_based_ipc (qb_ipcs_service_t *ipcs_ro, qb_ipcs_service_t *ipcs_rw, qb_ipcs_service_t *ipcs_shm)
 
qb_ipcs_service_t * pcmk__serve_controld_ipc (struct qb_ipcs_service_handlers *cb)
 
void pcmk__serve_attrd_ipc (qb_ipcs_service_t **ipcs, struct qb_ipcs_service_handlers *cb)
 
void pcmk__serve_fenced_ipc (qb_ipcs_service_t **ipcs, struct qb_ipcs_service_handlers *cb)
 
crm_ipc_tcrm_ipc_new (const char *name, size_t max_size)
 
bool crm_ipc_connect (crm_ipc_t *client)
 Establish an IPC connection to a Pacemaker component. More...
 
void crm_ipc_close (crm_ipc_t *client)
 
void crm_ipc_destroy (crm_ipc_t *client)
 
int crm_ipc_get_fd (crm_ipc_t *client)
 
bool crm_ipc_connected (crm_ipc_t *client)
 
int crm_ipc_ready (crm_ipc_t *client)
 Check whether an IPC connection is ready to be read. More...
 
long crm_ipc_read (crm_ipc_t *client)
 
const char * crm_ipc_buffer (crm_ipc_t *client)
 
uint32_t crm_ipc_buffer_flags (crm_ipc_t *client)
 
const char * crm_ipc_name (crm_ipc_t *client)
 
int crm_ipc_send (crm_ipc_t *client, xmlNode *message, enum crm_ipc_flags flags, int32_t ms_timeout, xmlNode **reply)
 Send an IPC XML message. More...
 
int crm_ipc_is_authentic_process (int sock, uid_t refuid, gid_t refgid, pid_t *gotpid, uid_t *gotuid, gid_t *gotgid)
 Check the authenticity of the IPC socket peer process. More...
 
int pcmk__ipc_is_authentic_process_active (const char *name, uid_t refuid, gid_t refgid, pid_t *gotpid)
 
xmlNode * create_hello_message (const char *uuid, const char *client_name, const char *major_version, const char *minor_version)
 

Macro Definition Documentation

#define MAX_MSG_SIZE   128*1024 /* 128k default */

Definition at line 1088 of file ipc.c.

#define MIN_MSG_SIZE   12336 /* sizeof(struct qb_ipc_connection_response) */

Definition at line 1087 of file ipc.c.

#define PCMK_IPC_DEFAULT_QUEUE_MAX   500

Definition at line 45 of file ipc.c.

#define PCMK_IPC_VERSION   1

Definition at line 42 of file ipc.c.

Function Documentation

xmlNode* create_hello_message ( const char *  uuid,
const char *  client_name,
const char *  major_version,
const char *  minor_version 
)

Definition at line 1811 of file ipc.c.

xmlNode* create_reply_adv ( xmlNode *  original_request,
xmlNode *  xml_response_data,
const char *  origin 
)

Definition at line 133 of file ipc.c.

xmlNode* create_request_adv ( const char *  task,
xmlNode *  msg_data,
const char *  host_to,
const char *  sys_to,
const char *  sys_from,
const char *  uuid_from,
const char *  origin 
)

Definition at line 88 of file ipc.c.

const char* crm_ipc_buffer ( crm_ipc_t client)

Definition at line 1420 of file ipc.c.

uint32_t crm_ipc_buffer_flags ( crm_ipc_t client)

Definition at line 1427 of file ipc.c.

void crm_ipc_close ( crm_ipc_t client)

Definition at line 1225 of file ipc.c.

bool crm_ipc_connect ( crm_ipc_t client)

Establish an IPC connection to a Pacemaker component.

Parameters
[in]clientConnection instance obtained from crm_ipc_new()
Returns
TRUE on success, FALSE otherwise (in which case errno will be set; specifically, in case of discovering the remote side is not authentic, its value is set to ECONNABORTED).

Definition at line 1158 of file ipc.c.

bool crm_ipc_connected ( crm_ipc_t client)

Definition at line 1277 of file ipc.c.

unsigned int crm_ipc_default_buffer_size ( void  )

Definition at line 71 of file ipc.c.

void crm_ipc_destroy ( crm_ipc_t client)

Definition at line 1240 of file ipc.c.

int crm_ipc_get_fd ( crm_ipc_t client)

Definition at line 1263 of file ipc.c.

int crm_ipc_is_authentic_process ( int  sock,
uid_t  refuid,
gid_t  refgid,
pid_t *  gotpid,
uid_t *  gotuid,
gid_t *  gotgid 
)

Check the authenticity of the IPC socket peer process.

If everything goes well, peer's authenticity is verified by the means of comparing against provided referential UID and GID (either satisfies), and the result of this check can be deduced from the return value. As an exception, detected UID of 0 ("root") satisfies arbitrary provided referential daemon's credentials.

Parameters
[in]sockIPC related, connected Unix socket to check peer of
[in]refuidreferential UID to check against
[in]refgidreferential GID to check against
[out]gotpidto optionally store obtained PID of the peer (not available on FreeBSD, special value of 1 used instead, and the caller is required to special case this value respectively)
[out]gotuidto optionally store obtained UID of the peer
[out]gotgidto optionally store obtained GID of the peer
Returns
0 if IPC related socket's peer is not authentic given the referential credentials (see above), 1 if it is, negative value on error (generally expressing -errno unless it was zero even on nonhappy path, -pcmk_err_generic is returned then; no message is directly emitted)
Note
While this function is tolerant on what constitutes authorized IPC daemon process (its effective user matches UID=0 or refuid, or at least its group matches refgid), either or both (in case of UID=0) mismatches on the expected credentials of such peer process shall be investigated at the caller when value of 1 gets returned there, since higher-than-expected privileges in respect to the expected/intended credentials possibly violate the least privilege principle and may pose an additional risk (i.e. such accidental inconsistency shall be eventually fixed).

Definition at line 1672 of file ipc.c.

const char* crm_ipc_name ( crm_ipc_t client)

Definition at line 1441 of file ipc.c.

crm_ipc_t* crm_ipc_new ( const char *  name,
size_t  max_size 
)

Definition at line 1128 of file ipc.c.

long crm_ipc_read ( crm_ipc_t client)

Definition at line 1373 of file ipc.c.

int crm_ipc_ready ( crm_ipc_t client)

Check whether an IPC connection is ready to be read.

Parameters
[in]clientConnection to check
Returns
Positive value if ready to be read, 0 if not ready, -errno on error

Definition at line 1309 of file ipc.c.

int crm_ipc_send ( crm_ipc_t client,
xmlNode *  message,
enum crm_ipc_flags  flags,
int32_t  ms_timeout,
xmlNode **  reply 
)

Send an IPC XML message.

Parameters
[in]clientConnection to IPC server
[in]messageXML message to send
[in]flagsBitmask of crm_ipc_flags
[in]ms_timeoutGive up if not sent within this much time (5 seconds if 0, or no timeout if negative)
[out]replyReply from server (or NULL if none)
Returns
Negative errno on error, otherwise size of reply received in bytes if reply was needed, otherwise number of bytes sent

Definition at line 1515 of file ipc.c.

void pcmk__client_cleanup ( void  )

Definition at line 298 of file ipc.c.

xmlNode* pcmk__client_data2xml ( pcmk__client_t c,
void *  data,
uint32_t *  id,
uint32_t *  flags 
)

Definition at line 577 of file ipc.c.

const char* pcmk__client_name ( pcmk__client_t c)

Definition at line 267 of file ipc.c.

int pcmk__client_pid ( qb_ipcs_connection_t *  c)

Definition at line 556 of file ipc.c.

const char* pcmk__client_type_str ( enum pcmk__client_type  client_type)

Definition at line 281 of file ipc.c.

void pcmk__drop_all_clients ( qb_ipcs_service_t *  service)

Definition at line 312 of file ipc.c.

pcmk__client_t* pcmk__find_client ( qb_ipcs_connection_t *  c)

Definition at line 236 of file ipc.c.

pcmk__client_t* pcmk__find_client_by_id ( const char *  id)

Definition at line 247 of file ipc.c.

void pcmk__foreach_ipc_client ( GHFunc  func,
gpointer  user_data 
)

Definition at line 211 of file ipc.c.

void pcmk__foreach_ipc_client_remove ( GHRFunc  func,
gpointer  user_data 
)

Definition at line 228 of file ipc.c.

void pcmk__free_client ( pcmk__client_t c)

Definition at line 489 of file ipc.c.

guint pcmk__ipc_client_count ( void  )

Definition at line 196 of file ipc.c.

int pcmk__ipc_is_authentic_process_active ( const char *  name,
uid_t  refuid,
gid_t  refgid,
pid_t *  gotpid 
)

Definition at line 1734 of file ipc.c.

int pcmk__ipc_prepare_iov ( uint32_t  request,
xmlNode *  message,
uint32_t  max_send_size,
struct iovec **  result,
ssize_t *  bytes 
)

Definition at line 773 of file ipc.c.

void pcmk__ipc_send_ack_as ( const char *  function,
int  line,
pcmk__client_t c,
uint32_t  request,
uint32_t  flags,
const char *  tag 
)

Definition at line 958 of file ipc.c.

int pcmk__ipc_send_iov ( pcmk__client_t c,
struct iovec *  iov,
uint32_t  flags 
)

Definition at line 859 of file ipc.c.

int pcmk__ipc_send_xml ( pcmk__client_t c,
uint32_t  request,
xmlNode *  message,
uint32_t  flags 
)

Definition at line 936 of file ipc.c.

pcmk__client_t* pcmk__new_client ( qb_ipcs_connection_t *  c,
uid_t  uid_client,
gid_t  gid_client 
)

Definition at line 408 of file ipc.c.

pcmk__client_t* pcmk__new_unauth_client ( void *  key)

Allocate a new pcmk__client_t object and generate its ID.

Parameters
[in]keyWhat to use as connections hash table key (NULL to use ID)
Returns
Pointer to new pcmk__client_t (asserts on failure)

Definition at line 399 of file ipc.c.

void pcmk__serve_attrd_ipc ( qb_ipcs_service_t **  ipcs,
struct qb_ipcs_service_handlers *  cb 
)

Definition at line 1051 of file ipc.c.

void pcmk__serve_based_ipc ( qb_ipcs_service_t **  ipcs_ro,
qb_ipcs_service_t **  ipcs_rw,
qb_ipcs_service_t **  ipcs_shm,
struct qb_ipcs_service_handlers *  ro_cb,
struct qb_ipcs_service_handlers *  rw_cb 
)

Definition at line 985 of file ipc.c.

qb_ipcs_service_t* pcmk__serve_controld_ipc ( struct qb_ipcs_service_handlers *  cb)

Definition at line 1037 of file ipc.c.

void pcmk__serve_fenced_ipc ( qb_ipcs_service_t **  ipcs,
struct qb_ipcs_service_handlers *  cb 
)

Definition at line 1072 of file ipc.c.

bool pcmk__set_client_queue_max ( pcmk__client_t client,
const char *  qmax 
)

Definition at line 540 of file ipc.c.

void pcmk__stop_based_ipc ( qb_ipcs_service_t *  ipcs_ro,
qb_ipcs_service_t *  ipcs_rw,
qb_ipcs_service_t *  ipcs_shm 
)

Definition at line 1019 of file ipc.c.

void pcmk_free_ipc_event ( struct iovec *  event)

Free an I/O vector created by pcmk__ipc_prepare_iov()

Parameters
[in]eventI/O vector to free

Definition at line 464 of file ipc.c.