1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 #ifndef PCMK__IPC_INTERNAL_H
  11 #define PCMK__IPC_INTERNAL_H
  12 
  13 #ifdef __cplusplus
  14 extern "C" {
  15 #endif
  16 
  17 #include <stdbool.h>                
  18 #include <stdint.h>                 
  19 #include <sys/uio.h>                
  20 #include <sys/types.h>              
  21 
  22 #ifdef HAVE_GNUTLS_GNUTLS_H
  23 #  include <gnutls/gnutls.h>        
  24 #endif
  25 
  26 #include <glib.h>                   
  27 #include <libxml/tree.h>            
  28 #include <qb/qbipcs.h>              
  29 
  30 #include <crm_config.h>             
  31 #include <crm/common/ipc.h>
  32 #include <crm/common/mainloop.h>    
  33 
  34 
  35 
  36 
  37 
  38 
  39 
  40 
  41 #define PCMK__SPECIAL_PID  1
  42 
  43 
  44 #define PCMK__IPC_TIMEOUT 120
  45 
  46 #if defined(US_AUTH_GETPEEREID)
  47 
  48 
  49 
  50 
  51 #define PCMK__SPECIAL_PID_AS_0(p)  (((p) == PCMK__SPECIAL_PID) ? 0 : (p))
  52 #else
  53 #define PCMK__SPECIAL_PID_AS_0(p)  (p)
  54 #endif
  55 
  56 
  57 
  58 
  59 
  60 
  61 
  62 
  63 
  64 
  65 
  66 
  67 
  68 
  69 
  70 
  71 
  72 
  73 
  74 
  75 
  76 
  77 
  78 
  79 
  80 
  81 
  82 
  83 
  84 
  85 
  86 
  87 
  88 int pcmk__ipc_is_authentic_process_active(const char *name, uid_t refuid,
  89                                           gid_t refgid, pid_t *gotpid);
  90 
  91 
  92 
  93 
  94 
  95 
  96 typedef struct pcmk__client_s pcmk__client_t;
  97 
  98 struct pcmk__remote_s {
  99     
 100     char *buffer;
 101     size_t buffer_size;
 102     size_t buffer_offset;
 103     int auth_timeout;
 104     int tcp_socket;
 105     mainloop_io_t *source;
 106 
 107     
 108     bool authenticated;
 109     char *token;
 110 
 111     
 112 #  ifdef HAVE_GNUTLS_GNUTLS_H
 113     gnutls_session_t *tls_session;
 114     bool tls_handshake_complete;
 115 #  endif
 116 };
 117 
 118 enum pcmk__client_flags {
 119     
 120 
 121     
 122     pcmk__client_ipc        = (UINT64_C(1) << 32), 
 123     pcmk__client_tcp        = (UINT64_C(1) << 33), 
 124 #  ifdef HAVE_GNUTLS_GNUTLS_H
 125     pcmk__client_tls        = (UINT64_C(1) << 34), 
 126 #  endif
 127 
 128     
 129     pcmk__client_proxied    = (UINT64_C(1) << 40), 
 130     pcmk__client_privileged = (UINT64_C(1) << 41), 
 131     pcmk__client_to_proxy   = (UINT64_C(1) << 42), 
 132 };
 133 
 134 #define PCMK__CLIENT_TYPE(client) ((client)->flags & UINT64_C(0xff00000000))
 135 
 136 struct pcmk__client_s {
 137     unsigned int pid;
 138 
 139     char *id;
 140     char *name;
 141     char *user;
 142     uint64_t flags; 
 143 
 144     int request_id;
 145     void *userdata;
 146 
 147     int event_timer;
 148     GQueue *event_queue;
 149 
 150     
 151 
 152 
 153 
 154     qb_ipcs_connection_t *ipcs; 
 155 
 156     struct pcmk__remote_s *remote;        
 157 
 158     unsigned int queue_backlog; 
 159     unsigned int queue_max;     
 160 };
 161 
 162 #define pcmk__set_client_flags(client, flags_to_set) do {               \
 163         (client)->flags = pcmk__set_flags_as(__func__, __LINE__,        \
 164             LOG_TRACE,                                                  \
 165             "Client", pcmk__client_name(client),                        \
 166             (client)->flags, (flags_to_set), #flags_to_set);            \
 167     } while (0)
 168 
 169 #define pcmk__clear_client_flags(client, flags_to_clear) do {           \
 170         (client)->flags = pcmk__clear_flags_as(__func__, __LINE__,      \
 171             LOG_TRACE,                                                  \
 172             "Client", pcmk__client_name(client),                        \
 173             (client)->flags, (flags_to_clear), #flags_to_clear);        \
 174     } while (0)
 175 
 176 #define pcmk__set_ipc_flags(ipc_flags, ipc_name, flags_to_set) do {         \
 177         ipc_flags = pcmk__set_flags_as(__func__, __LINE__, LOG_TRACE,       \
 178                                        "IPC", (ipc_name),                   \
 179                                        (ipc_flags), (flags_to_set),         \
 180                                        #flags_to_set);                      \
 181     } while (0)
 182 
 183 #define pcmk__clear_ipc_flags(ipc_flags, ipc_name, flags_to_clear) do {     \
 184         ipc_flags = pcmk__clear_flags_as(__func__, __LINE__, LOG_TRACE,     \
 185                                          "IPC", (ipc_name),                 \
 186                                          (ipc_flags), (flags_to_clear),     \
 187                                          #flags_to_clear);                  \
 188     } while (0)
 189 
 190 guint pcmk__ipc_client_count(void);
 191 void pcmk__foreach_ipc_client(GHFunc func, gpointer user_data);
 192 
 193 void pcmk__client_cleanup(void);
 194 
 195 pcmk__client_t *pcmk__find_client(qb_ipcs_connection_t *c);
 196 pcmk__client_t *pcmk__find_client_by_id(const char *id);
 197 const char *pcmk__client_name(pcmk__client_t *c);
 198 const char *pcmk__client_type_str(uint64_t client_type);
 199 
 200 pcmk__client_t *pcmk__new_unauth_client(void *key);
 201 pcmk__client_t *pcmk__new_client(qb_ipcs_connection_t *c, uid_t uid, gid_t gid);
 202 void pcmk__free_client(pcmk__client_t *c);
 203 void pcmk__drop_all_clients(qb_ipcs_service_t *s);
 204 bool pcmk__set_client_queue_max(pcmk__client_t *client, const char *qmax);
 205 
 206 int pcmk__ipc_send_ack_as(const char *function, int line, pcmk__client_t *c,
 207                           uint32_t request, uint32_t flags, const char *tag,
 208                           crm_exit_t status);
 209 #define pcmk__ipc_send_ack(c, req, flags, tag, st) \
 210     pcmk__ipc_send_ack_as(__func__, __LINE__, (c), (req), (flags), (tag), (st))
 211 
 212 int pcmk__ipc_prepare_iov(uint32_t request, xmlNode *message,
 213                           uint32_t max_send_size,
 214                           struct iovec **result, ssize_t *bytes);
 215 int pcmk__ipc_send_xml(pcmk__client_t *c, uint32_t request, xmlNode *message,
 216                        uint32_t flags);
 217 int pcmk__ipc_send_iov(pcmk__client_t *c, struct iovec *iov, uint32_t flags);
 218 xmlNode *pcmk__client_data2xml(pcmk__client_t *c, void *data,
 219                                uint32_t *id, uint32_t *flags);
 220 
 221 int pcmk__client_pid(qb_ipcs_connection_t *c);
 222 
 223 void pcmk__serve_attrd_ipc(qb_ipcs_service_t **ipcs,
 224                            struct qb_ipcs_service_handlers *cb);
 225 void pcmk__serve_fenced_ipc(qb_ipcs_service_t **ipcs,
 226                             struct qb_ipcs_service_handlers *cb);
 227 void pcmk__serve_pacemakerd_ipc(qb_ipcs_service_t **ipcs,
 228                                 struct qb_ipcs_service_handlers *cb);
 229 qb_ipcs_service_t *pcmk__serve_controld_ipc(struct qb_ipcs_service_handlers *cb);
 230 
 231 void pcmk__serve_based_ipc(qb_ipcs_service_t **ipcs_ro,
 232                            qb_ipcs_service_t **ipcs_rw,
 233                            qb_ipcs_service_t **ipcs_shm,
 234                            struct qb_ipcs_service_handlers *ro_cb,
 235                            struct qb_ipcs_service_handlers *rw_cb);
 236 
 237 void pcmk__stop_based_ipc(qb_ipcs_service_t *ipcs_ro,
 238         qb_ipcs_service_t *ipcs_rw,
 239         qb_ipcs_service_t *ipcs_shm);
 240 
 241 #ifdef __cplusplus
 242 }
 243 #endif
 244 
 245 #endif