#ifndef CMS_SERVER_HH
#define CMS_SERVER_HH
#include "cms_user.hh"
#include "cms_cfg.hh"
#include "rem_msg.hh"
extern int cms_server_count;
extern void wait_for_servers(int);
class LinkedList;
extern LinkedList *cms_server_list;
class CMS_SERVER;
class CMS_DIAG_PROC_INFO;
class CMS_SERVER_LOCAL_PORT:public virtual CMS_USER {
protected:
long buffer_number;
int list_id;
friend class CMS_SERVER;
CMS_DIAG_PROC_INFO *orig_info;
virtual REMOTE_READ_REPLY *reader(REMOTE_READ_REQUEST * req);
virtual REMOTE_READ_REPLY *blocking_read(REMOTE_READ_REQUEST * req);
virtual REMOTE_WRITE_REPLY *writer(REMOTE_WRITE_REQUEST * buf);
virtual REMOTE_SET_DIAG_INFO_REPLY
* set_diag_info(REMOTE_SET_DIAG_INFO_REQUEST * buf);
virtual REMOTE_GET_DIAG_INFO_REPLY
* get_diag_info(REMOTE_GET_DIAG_INFO_REQUEST * buf);
virtual REMOTE_GET_MSG_COUNT_REPLY
* get_msg_count(REMOTE_GET_DIAG_INFO_REQUEST * buf);
virtual void reset_diag_info();
REMOTE_READ_REPLY read_reply;
REMOTE_WRITE_REPLY write_reply;
REMOTE_GET_BUF_NAME_REPLY namereply;
REMOTE_GET_DIAG_INFO_REPLY get_diag_info_reply;
public:
CMS_SERVER_LOCAL_PORT(CMS * _cms);
virtual ~ CMS_SERVER_LOCAL_PORT();
int local_channel_reused;
};
class CMS_USER_INFO;
struct CMS_USER_CONNECT_STRUCT {
CMS_USER_CONNECT_STRUCT();
CMS_USER_INFO *user_info;
int fd;
};
class CMS_SERVER_REMOTE_PORT {
public:
CMS_SERVER_REMOTE_PORT(CMS_SERVER *);
virtual ~ CMS_SERVER_REMOTE_PORT();
virtual void run() = 0;
virtual void register_port();
virtual void unregister_port();
virtual int accept_local_port_cms(CMS * cms);
int port_registered;
CMS_USER_INFO *current_user_info;
CMS_USER_INFO *get_connected_user(int);
void add_connected_user(int);
protected:
LinkedList * connected_users;
CMS_USER_CONNECT_STRUCT *current_connected_user_struct;
CMS_SERVER *cms_server_parent;
static CMS_SERVER *find_server(long _pid, long _tid = 0);
static void print_servers();
friend class CMS_SERVER;
double min_compatible_version;
int confirm_write;
public:
int running;
int max_total_subdivisions;
int port_num;
int max_clients;
int current_clients;
};
class CMS_SERVER {
public:
REMOTE_CMS_REQUEST *request;
int server_spawned;
int server_registered;
int list_id;
LinkedList *cms_local_ports;
CMS_SERVER_LOCAL_PORT *find_local_port(long _buffer_num);
REMOTE_CHECK_IF_READ_REPLY cir_reply;
REMOTE_GET_MSG_COUNT_REPLY gmc_reply;
REMOTE_GET_QUEUE_LENGTH_REPLY gql_reply;
REMOTE_GET_SPACE_AVAILABLE_REPLY gsa_reply;
REMOTE_CLEAR_REPLY clear_reply_struct;
int using_passwd_file;
int get_access_type();
long get_message_type();
const char *get_buffer_name(int _buf_num);
int requests_processed;
public:
int get_total_subdivisions(long _buffer_num);
CMS_SERVER_REMOTE_PORT *remote_port;
void gen_random_key(char key[], int len);
int security_check(CMS_USER_INFO * user_info, int _buf_num);
int is_using_passwd_file();
CMS_USER_INFO *get_user_info(const char *name, const char *passwd);
static void clean(int);
long current_pid;
long current_tid;
long creator_pid;
long creator_tid;
long spawner_pid;
long spawner_tid;
long server_pid;
long server_tid;
long maximum_cms_size;
REMOTE_CMS_REPLY *process_request(REMOTE_CMS_REQUEST *);
void register_server(int setup_CC_signal_handler = 1);
void unregister_server();
void run(int setup_CC_signal_handler = 1);
int spawn();
void kill_server();
CMS_SERVER();
void add_local_port(CMS_SERVER_LOCAL_PORT *);
void delete_all_local_ports();
virtual void delete_from_list();
virtual ~ CMS_SERVER();
virtual void initialize_write_request_space();
virtual int accept_local_port_cms(CMS *);
REMOTE_READ_REQUEST read_req;
REMOTE_WRITE_REQUEST write_req;
REMOTE_GET_KEYS_REQUEST get_keys_req;
REMOTE_LOGIN_REQUEST login_req;
REMOTE_SET_SUBSCRIPTION_REQUEST set_subscription_req;
REMOTE_CHECK_IF_READ_REQUEST check_if_read_req;
REMOTE_GET_MSG_COUNT_REQUEST get_msg_count_req;
REMOTE_GET_QUEUE_LENGTH_REQUEST get_queue_length_req;
REMOTE_GET_SPACE_AVAILABLE_REQUEST get_space_available_req;
REMOTE_CLEAR_REQUEST clear_req;
REMOTE_SET_DIAG_INFO_REQUEST set_diag_info_req;
REMOTE_GET_DIAG_INFO_REQUEST get_diag_info_req;
REMOTE_READ_REPLY *read_reply;
REMOTE_WRITE_REPLY *write_reply;
REMOTE_GET_KEYS_REPLY *get_keys_reply;
REMOTE_GET_KEYS_REPLY perm_get_keys_reply;
REMOTE_LOGIN_REPLY *login_reply;
REMOTE_LOGIN_REPLY perm_login_reply;
REMOTE_SET_SUBSCRIPTION_REPLY *set_subscription_reply;
REMOTE_SET_SUBSCRIPTION_REPLY perm_set_subscription_reply;
REMOTE_CHECK_IF_READ_REPLY *check_if_read_reply;
REMOTE_GET_MSG_COUNT_REPLY *get_msg_count_reply;
REMOTE_GET_QUEUE_LENGTH_REPLY *get_queue_length_reply;
REMOTE_GET_SPACE_AVAILABLE_REPLY *get_space_available_reply;
REMOTE_CLEAR_REPLY *clear_reply;
REMOTE_SET_DIAG_INFO_REPLY *set_diag_info_reply;
REMOTE_GET_DIAG_INFO_REPLY *get_diag_info_reply;
CMS_SERVER_LOCAL_PORT *last_local_port_used;
int diag_enabled;
char set_diag_info_buf[0x400];
int max_total_subdivisions;
virtual void set_diag_info(REMOTE_SET_DIAG_INFO_REQUEST * _diag_info);
virtual void reset_diag_info(int buffer_number);
private:
double time_of_last_key_request;
LinkedList *known_users;
char passwd_file[256];
CMS_USER_INFO *find_user(const char *);
int guest_can_read;
int guest_can_write;
};
extern int (*detailed_security_check) (const char *user_name,
const char *buffer_name, long msg_type, int access_type);
#endif