pacemaker  2.0.1-9e909a5bdd
Scalable High-Availability cluster resource manager
ipcs.h
Go to the documentation of this file.
1 /*
2  * Copyright 2013-2018 Andrew Beekhof <andrew@beekhof.net>
3  *
4  * This source code is licensed under the GNU Lesser General Public License
5  * version 2.1 or later (LGPLv2.1+) WITHOUT ANY WARRANTY.
6  */
7 
8 #ifndef CRM_COMMON_IPCS__H
9 # define CRM_COMMON_IPCS__H
10 
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14 
15 # include <stdbool.h>
16 # include <qb/qbipcs.h>
17 # ifdef HAVE_GNUTLS_GNUTLS_H
18 # undef KEYFILE
19 # include <gnutls/gnutls.h>
20 # endif
21 
22 # include <crm/common/ipc.h>
23 # include <crm/common/mainloop.h>
24 
25 typedef struct crm_client_s crm_client_t;
26 
30 # ifdef HAVE_GNUTLS_GNUTLS_H
31  CRM_CLIENT_TLS = 3,
32 # endif
33 };
34 
35 struct crm_remote_s {
36  /* Shared */
37  char *buffer;
38  size_t buffer_size;
39  size_t buffer_offset;
43 
44  /* CIB-only */
46  char *token;
47 
48  /* TLS only */
49 # ifdef HAVE_GNUTLS_GNUTLS_H
50  gnutls_session_t *tls_session;
51  bool tls_handshake_complete;
52 # endif
53 };
54 
56 {
57  crm_client_flag_ipc_proxied = 0x00001, /* ipc_proxy code only */
58  crm_client_flag_ipc_privileged = 0x00002, /* root or cluster user */
59 };
60 
61 struct crm_client_s {
62  uint pid;
63 
64  uid_t uid;
65  gid_t gid;
66 
67  char *id;
68  char *name;
69  char *user;
70 
71  /* Provided for server use (not used by library) */
72  /* @TODO merge options, flags, and kind (reserving lower bits for server) */
73  long long options;
74 
77  void *userdata;
78 
80  GQueue *event_queue;
81 
82  /* Depending on the value of kind, only some of the following
83  * will be populated/valid
84  */
86 
87  qb_ipcs_connection_t *ipcs; /* IPC */
88 
89  struct crm_remote_s *remote; /* TCP/TLS */
90 
91  unsigned int queue_backlog; /* IPC queue length after last flush */
92  unsigned int queue_max; /* Evict client whose queue grows this big */
93 };
94 
95 extern GHashTable *client_connections;
96 
97 void crm_client_init(void);
98 void crm_client_cleanup(void);
99 
100 crm_client_t *crm_client_get(qb_ipcs_connection_t * c);
101 crm_client_t *crm_client_get_by_id(const char *id);
102 const char *crm_client_name(crm_client_t * c);
104 
105 crm_client_t *crm_client_alloc(void *key);
106 crm_client_t *crm_client_new(qb_ipcs_connection_t * c, uid_t uid, gid_t gid);
108 void crm_client_disconnect_all(qb_ipcs_service_t *s);
109 bool crm_set_client_queue_max(crm_client_t *client, const char *qmax);
110 
112  const char *tag, const char *function, int line);
113 
114 /* when max_send_size is 0, default ipc buffer size is used */
115 ssize_t crm_ipc_prepare(uint32_t request, xmlNode * message, struct iovec ** result, uint32_t max_send_size);
116 ssize_t crm_ipcs_send(crm_client_t * c, uint32_t request, xmlNode * message, enum crm_ipc_flags flags);
117 ssize_t crm_ipcs_sendv(crm_client_t * c, struct iovec *iov, enum crm_ipc_flags flags);
118 xmlNode *crm_ipcs_recv(crm_client_t * c, void *data, size_t size, uint32_t * id, uint32_t * flags);
119 
120 int crm_ipcs_client_pid(qb_ipcs_connection_t * c);
121 
122 #ifdef __cplusplus
123 }
124 #endif
125 
126 #endif
crm_client_s::ipcs
qb_ipcs_connection_t * ipcs
Definition: ipcs.h:87
crm_client_s::request_id
int request_id
Definition: ipcs.h:75
crm_client_init
void crm_client_init(void)
Definition: ipc.c:252
crm_set_client_queue_max
bool crm_set_client_queue_max(crm_client_t *client, const char *qmax)
Raise IPC eviction threshold for a client, if allowed.
Definition: ipc.c:500
crm_client_s::userdata
void * userdata
Definition: ipcs.h:77
crm_client_get_by_id
crm_client_t * crm_client_get_by_id(const char *id)
Definition: ipc.c:201
flags
uint64_t flags
Definition: remote.c:148
crm_client_s::flags
uint32_t flags
Definition: ipcs.h:76
crm_client_s::gid
gid_t gid
Definition: ipcs.h:65
data
char data[0]
Definition: internal.h:90
crm_client_flag_ipc_proxied
Definition: ipcs.h:57
crm_client_type_text
const char * crm_client_type_text(enum client_type client_type)
Definition: ipc.c:235
crm_client_s::uid
uid_t uid
Definition: ipcs.h:64
crm_ipcs_send_ack
void crm_ipcs_send_ack(crm_client_t *c, uint32_t request, uint32_t flags, const char *tag, const char *function, int line)
Definition: ipc.c:867
crm_client_cleanup
void crm_client_cleanup(void)
Definition: ipc.c:261
crm_ipc_flags
crm_ipc_flags
Definition: ipc.h:39
crm_client_s::options
long long options
Definition: ipcs.h:73
crm_client_s::kind
enum client_type kind
Definition: ipcs.h:85
crm_remote_s::buffer_offset
size_t buffer_offset
Definition: ipcs.h:39
crm_remote_s
Definition: ipcs.h:35
crm_ipcs_recv
xmlNode * crm_ipcs_recv(crm_client_t *c, void *data, size_t size, uint32_t *id, uint32_t *flags)
Definition: ipc.c:524
crm_ipcs_sendv
ssize_t crm_ipcs_sendv(crm_client_t *c, struct iovec *iov, enum crm_ipc_flags flags)
Definition: ipc.c:771
mainloop.h
Wrappers for and extensions to glib mainloop.
crm_client_flags
crm_client_flags
Definition: ipcs.h:55
client_connections
GHashTable * client_connections
Definition: ipc.c:187
crm_ipc_prepare
ssize_t crm_ipc_prepare(uint32_t request, xmlNode *message, struct iovec **result, uint32_t max_send_size)
Definition: ipc.c:697
crm_client_s::id
char * id
Definition: ipcs.h:67
crm_client_disconnect_all
void crm_client_disconnect_all(qb_ipcs_service_t *s)
Definition: ipc.c:274
uint32_t
#define uint32_t
Definition: stdint.in.h:158
crm_remote_s::tcp_socket
int tcp_socket
Definition: ipcs.h:41
crm_client_flag_ipc_privileged
Definition: ipcs.h:58
gnutls_session_t
void gnutls_session_t
Definition: cib_remote.c:42
crm_client_s::name
char * name
Definition: ipcs.h:68
crm_client_name
const char * crm_client_name(crm_client_t *c)
Definition: ipc.c:221
size
uint32_t size
Definition: internal.h:84
ipc.h
Wrappers for and extensions to libqb IPC.
crm_client_s::queue_backlog
unsigned int queue_backlog
Definition: ipcs.h:91
client_type
client_type
Definition: ipcs.h:27
crm_client_s::event_queue
GQueue * event_queue
Definition: ipcs.h:80
crm_remote_s::buffer_size
size_t buffer_size
Definition: ipcs.h:38
mainloop_io_t
struct mainloop_io_s mainloop_io_t
Definition: mainloop.h:29
crm_client_s::user
char * user
Definition: ipcs.h:69
crm_client_destroy
void crm_client_destroy(crm_client_t *c)
Definition: ipc.c:450
crm_remote_s::buffer
char * buffer
Definition: ipcs.h:37
crm_client_s::pid
uint pid
Definition: ipcs.h:62
crm_client_new
crm_client_t * crm_client_new(qb_ipcs_connection_t *c, uid_t uid, gid_t gid)
Definition: ipc.c:365
crm_remote_s::auth_timeout
int auth_timeout
Definition: ipcs.h:40
crm_client_s::event_timer
int event_timer
Definition: ipcs.h:79
CRM_CLIENT_IPC
Definition: ipcs.h:28
crm_client_s::queue_max
unsigned int queue_max
Definition: ipcs.h:92
crm_client_s::remote
struct crm_remote_s * remote
Definition: ipcs.h:89
crm_client_s
Definition: ipcs.h:61
crm_client_alloc
crm_client_t * crm_client_alloc(void *key)
Allocate a new crm_client_t object and generate its ID.
Definition: ipc.c:356
crm_remote_s::token
char * token
Definition: ipcs.h:46
crm_remote_s::authenticated
bool authenticated
Definition: ipcs.h:45
CRM_CLIENT_TCP
Definition: ipcs.h:29
crm_ipcs_send
ssize_t crm_ipcs_send(crm_client_t *c, uint32_t request, xmlNode *message, enum crm_ipc_flags flags)
Definition: ipc.c:844
crm_remote_s::source
mainloop_io_t * source
Definition: ipcs.h:42
crm_ipcs_client_pid
int crm_ipcs_client_pid(qb_ipcs_connection_t *c)
Definition: ipc.c:514
crm_client_get
crm_client_t * crm_client_get(qb_ipcs_connection_t *c)
Definition: ipc.c:190