00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00034
00035 #include "midasinc.h"
00036
00037
00038 #endif
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048 #define DRI_16 (1<<0)
00049 #define DRI_32 (1<<1)
00050 #define DRI_64 (1<<2)
00051 #define DRI_LITTLE_ENDIAN (1<<3)
00052 #define DRI_BIG_ENDIAN (1<<4)
00053 #define DRF_IEEE (1<<5)
00054 #define DRF_G_FLOAT (1<<6)
00055 #define DR_ASCII (1<<7)
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #define WORD_SWAP(x) { BYTE _tmp; \
00069 _tmp= *((BYTE *)(x)); \
00070 *((BYTE *)(x)) = *(((BYTE *)(x))+1); \
00071 *(((BYTE *)(x))+1) = _tmp; }
00072
00073
00074
00075 #define DWORD_SWAP(x) { BYTE _tmp; \
00076 _tmp= *((BYTE *)(x)); \
00077 *((BYTE *)(x)) = *(((BYTE *)(x))+3); \
00078 *(((BYTE *)(x))+3) = _tmp; \
00079 _tmp= *(((BYTE *)(x))+1); \
00080 *(((BYTE *)(x))+1) = *(((BYTE *)(x))+2); \
00081 *(((BYTE *)(x))+2) = _tmp; }
00082
00083
00084
00085 #define QWORD_SWAP(x) { BYTE _tmp; \
00086 _tmp= *((BYTE *)(x)); \
00087 *((BYTE *)(x)) = *(((BYTE *)(x))+7); \
00088 *(((BYTE *)(x))+7) = _tmp; \
00089 _tmp= *(((BYTE *)(x))+1); \
00090 *(((BYTE *)(x))+1) = *(((BYTE *)(x))+6); \
00091 *(((BYTE *)(x))+6) = _tmp; \
00092 _tmp= *(((BYTE *)(x))+2); \
00093 *(((BYTE *)(x))+2) = *(((BYTE *)(x))+5); \
00094 *(((BYTE *)(x))+5) = _tmp; \
00095 _tmp= *(((BYTE *)(x))+3); \
00096 *(((BYTE *)(x))+3) = *(((BYTE *)(x))+4); \
00097 *(((BYTE *)(x))+4) = _tmp; }
00098
00099
00100
00101
00102
00103 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00104
00105
00106
00107 #define MESSAGE_BUFFER_SIZE 100000
00108 #define MESSAGE_BUFFER_NAME "SYSMSG"
00109 #define MAX_RPC_CONNECTION 64
00110 #define MAX_STRING_LENGTH 256
00111 #define NET_BUFFER_SIZE (ALIGN8(MAX_EVENT_SIZE)+sizeof(EVENT_HEADER)+\
00112 4*8 + sizeof(NET_COMMAND_HEADER))
00113
00114
00115
00116 #undef DEBUG_MSG
00117
00118
00119 #if !defined ( OS_MSDOS ) && !defined ( OS_VXWORKS )
00120 #define LOCAL_ROUTINES
00121 #endif
00122
00123
00124 #if !defined ( OS_MSDOS )
00125 #define YBOS_SUPPORT
00126 #endif
00127
00128
00129
00130
00131
00132 #ifdef OS_MSDOS
00133
00134 #define closesocket(s) close(s)
00135 #define ioctlsocket(s,c,d) ioctl(s,c,d)
00136 #define malloc(i) farmalloc(i)
00137
00138 #undef NET_TCP_SIZE
00139 #define NET_TCP_SIZE 0x7FFF
00140
00141 #undef MAX_EVENT_SIZE
00142 #define MAX_EVENT_SIZE 4096
00143
00144 #endif
00145
00146 #ifdef OS_VMS
00147
00148 #define closesocket(s) close(s)
00149 #define ioctlsocket(s,c,d)
00150
00151 #ifndef FD_SET
00152 typedef struct {
00153 INT fds_bits;
00154 } fd_set;
00155
00156 #define FD_SET(n, p) ((p)->fds_bits |= (1 << (n)))
00157 #define FD_CLR(n, p) ((p)->fds_bits &= ~(1 << (n)))
00158 #define FD_ISSET(n, p) ((p)->fds_bits & (1 << (n)))
00159 #define FD_ZERO(p) ((p)->fds_bits = 0)
00160 #endif
00161
00162 #endif
00163
00164
00165
00166 #ifdef OS_VMS
00167
00168 #define P_WAIT 0
00169 #define P_NOWAIT 1
00170 #define P_DETACH 4
00171
00172 #endif
00173
00174
00175
00176 #ifdef OS_UNIX
00177
00178 #define closesocket(s) close(s)
00179 #define ioctlsocket(s,c,d) ioctl(s,c,d)
00180
00181 #define P_WAIT 0
00182 #define P_NOWAIT 1
00183 #define P_DETACH 4
00184
00185 extern char **environ;
00186
00187 #endif
00188
00189 #ifndef FD_SETSIZE
00190 #define FD_SETSIZE 32
00191 #endif
00192
00193
00194
00195 #ifdef OS_VXWORKS
00196
00197 #define P_NOWAIT 1
00198 #define closesocket(s) close(s)
00199 #define ioctlsocket(s,c,d) ioctl(s,c,d)
00200
00201 #endif
00202
00203
00204 #ifndef O_BINARY
00205 #define O_BINARY 0
00206 #define O_TEXT 0
00207 #endif
00208
00209
00210 #ifndef MAX
00211 #define MAX(a,b) (((a) > (b)) ? (a) : (b))
00212 #endif
00213
00214 #ifndef MIN
00215 #define MIN(a,b) (((a) < (b)) ? (a) : (b))
00216 #endif
00217
00218 #ifndef ABS
00219 #define ABS(a) (((a) < 0) ? -(a) : (a))
00220 #endif
00221
00222
00223 #define TELL(fh) lseek(fh, 0, SEEK_CUR)
00224
00225
00226 #ifdef OS_SOLARIS
00227 #define MAX_SHM_SIZE 0x20000
00228 #endif
00229
00230
00231
00232
00233
00234 typedef struct {
00235 DWORD routine_id;
00236 DWORD param_size;
00237 } NET_COMMAND_HEADER;
00238
00239 typedef struct {
00240 NET_COMMAND_HEADER header;
00241 char param[32];
00242 } NET_COMMAND;
00243
00244
00245 typedef struct {
00246 DWORD serial_number;
00247 DWORD sequence_number;
00248 } UDP_HEADER;
00249
00250 #define UDP_FIRST 0x80000000l
00251 #define TCP_FAST 0x80000000l
00252
00253 #define MSG_BM 1
00254 #define MSG_ODB 2
00255 #define MSG_CLIENT 3
00256 #define MSG_SERVER 4
00257 #define MSG_LISTEN 5
00258 #define MSG_WATCHDOG 6
00259
00260
00261
00262 struct callback_addr {
00263 char host_name[HOST_NAME_LENGTH];
00264 short host_port1;
00265 short host_port2;
00266 short host_port3;
00267 int debug;
00268 char experiment[NAME_LENGTH];
00269 char directory[MAX_STRING_LENGTH];
00270 char user[NAME_LENGTH];
00271 INT index;
00272 };
00273
00274 typedef struct {
00275 char host_name[HOST_NAME_LENGTH];
00276 INT port;
00277 char exp_name[NAME_LENGTH];
00278 int send_sock;
00279 INT remote_hw_type;
00280 char client_name[NAME_LENGTH];
00281 INT transport;
00282 INT rpc_timeout;
00283
00284 } RPC_CLIENT_CONNECTION;
00285
00286 typedef struct {
00287 char host_name[HOST_NAME_LENGTH];
00288 INT port;
00289 char exp_name[NAME_LENGTH];
00290 int send_sock;
00291 int recv_sock;
00292 int event_sock;
00293 INT remote_hw_type;
00294 INT transport;
00295 INT rpc_timeout;
00296
00297 } RPC_SERVER_CONNECTION;
00298
00299 typedef struct {
00300 INT tid;
00301 char prog_name[NAME_LENGTH];
00302 char host_name[HOST_NAME_LENGTH];
00303 int send_sock;
00304 int recv_sock;
00305 int event_sock;
00306 INT remote_hw_type;
00307 INT transport;
00308 INT watchdog_timeout;
00309 DWORD last_activity;
00310 INT convert_flags;
00311 char *net_buffer;
00312 char *ev_net_buffer;
00313 INT net_buffer_size;
00314 INT write_ptr, read_ptr, misalign;
00315 INT ev_write_ptr, ev_read_ptr, ev_misalign;
00316 HNDLE odb_handle;
00317 HNDLE client_handle;
00318
00319 } RPC_SERVER_ACCEPTION;
00320
00321
00322 #endif
00323
00324
00325
00326
00327
00328
00329 typedef struct {
00330 INT size;
00331 INT next_free;
00332 } FREE_DESCRIP;
00333
00334 typedef struct {
00335 INT handle;
00336 WORD access_mode;
00337 WORD flags;
00338
00339 } OPEN_RECORD;
00340
00341 typedef struct {
00342 char name[NAME_LENGTH];
00343 INT pid;
00344 INT tid;
00345 INT thandle;
00346 INT port;
00347 INT num_open_records;
00348 DWORD last_activity;
00349 DWORD watchdog_timeout;
00350 INT max_index;
00351
00352 OPEN_RECORD open_record[MAX_OPEN_RECORDS];
00353
00354 } DATABASE_CLIENT;
00355
00356 typedef struct {
00357 char name[NAME_LENGTH];
00358 INT version;
00359 INT num_clients;
00360 INT max_client_index;
00361 INT key_size;
00362 INT data_size;
00363 INT root_key;
00364 INT first_free_key;
00365 INT first_free_data;
00366
00367 DATABASE_CLIENT client[MAX_CLIENTS];
00368
00369 } DATABASE_HEADER;
00370
00371
00372
00373 typedef struct {
00374 char name[NAME_LENGTH];
00375 BOOL attached;
00376 INT client_index;
00377 DATABASE_HEADER *database_header;
00378 void *database_data;
00379 HNDLE mutex;
00380 INT lock_cnt;
00381 HNDLE shm_handle;
00382 INT index;
00383 BOOL protect;
00384
00385 } DATABASE;
00386
00387
00388
00389 typedef struct {
00390 HNDLE handle;
00391 HNDLE hDB;
00392 WORD access_mode;
00393 void *data;
00394 void *copy;
00395 INT buf_size;
00396 void (*dispatcher) (INT, INT, void *);
00397 void *info;
00398
00399 } RECORD_LIST;
00400
00401
00402
00403 typedef struct {
00404 INT buffer_handle;
00405 short int event_id;
00406 short int trigger_mask;
00407 void (*dispatcher) (HNDLE, HNDLE, EVENT_HEADER *, void *);
00408
00409 } REQUEST_LIST;
00410
00411
00412
00413
00414
00415 #ifndef DOXYGEN_SHOULD_SKIP_THIS
00416
00417
00418
00419 #define CHN_SETTINGS_STR(_name) char *_name[] = {\
00420 "[Settings]",\
00421 "Active = BOOL : 1",\
00422 "Type = STRING : [8] Disk",\
00423 "Filename = STRING : [256] run%05d.mid",\
00424 "Format = STRING : [8] MIDAS",\
00425 "Compression = INT : 0",\
00426 "ODB dump = BOOL : 1",\
00427 "Log messages = DWORD : 0",\
00428 "Buffer = STRING : [32] SYSTEM",\
00429 "Event ID = INT : -1",\
00430 "Trigger mask = INT : -1",\
00431 "Event limit = DWORD : 0",\
00432 "Byte limit = DOUBLE : 0",\
00433 "Tape capacity = DOUBLE : 0",\
00434 "Subdir format = STRING : [32]",\
00435 "Current filename = STRING : [256]",\
00436 "",\
00437 "[Statistics]",\
00438 "Events written = DOUBLE : 0",\
00439 "Bytes written = DOUBLE : 0",\
00440 "Bytes written total = DOUBLE : 0",\
00441 "Files written = INT : 0",\
00442 "",\
00443 NULL}
00444
00445 typedef struct {
00446 BOOL active;
00447 char type[8];
00448 char filename[256];
00449 char format[8];
00450 INT compression;
00451 BOOL odb_dump;
00452 DWORD log_messages;
00453 char buffer[32];
00454 INT event_id;
00455 INT trigger_mask;
00456 DWORD event_limit;
00457 double byte_limit;
00458 double tape_capacity;
00459 char subdir_format[32];
00460 char current_filename[256];
00461 } CHN_SETTINGS;
00462
00463 typedef struct {
00464 double events_written;
00465 double bytes_written;
00466 double bytes_written_total;
00467 INT files_written;
00468 } CHN_STATISTICS;
00469
00470 typedef struct {
00471 INT handle;
00472 char path[256];
00473 INT type;
00474 INT format;
00475 INT buffer_handle;
00476 INT msg_buffer_handle;
00477 INT request_id;
00478 INT msg_request_id;
00479 HNDLE stats_hkey;
00480 HNDLE settings_hkey;
00481 CHN_SETTINGS settings;
00482 CHN_STATISTICS statistics;
00483 void **format_info;
00484 void *ftp_con;
00485 } LOG_CHN;
00486
00487 #define LOG_TYPE_DISK 1
00488 #define LOG_TYPE_TAPE 2
00489 #define LOG_TYPE_FTP 3
00490
00491
00492
00493 typedef struct {
00494 char name[32];
00495 int priority;
00496 int options;
00497 int stackSize;
00498 int arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10;
00499 } VX_TASK_SPAWN;
00500
00501
00502
00503 #define CH_IPC 1
00504 #define CH_CLIENT 2
00505 #define CH_SERVER 3
00506 #define CH_LISTEN 4
00507
00508
00509
00510
00511 #ifdef __cplusplus
00512 extern "C" {
00513 #endif
00514
00515
00516 INT EXPRT cm_set_path(char *path);
00517 INT EXPRT cm_get_path(char *path);
00518 INT cm_dispatch_ipc(char *message, int socket);
00519 INT EXPRT cm_msg_log(INT message_type, const char *message);
00520 INT EXPRT cm_msg_log1(INT message_type, const char *message, const char *facility);
00521 void EXPRT name2c(char *str);
00522
00523
00524 INT bm_lock_buffer(INT buffer_handle);
00525 INT bm_unlock_buffer(INT buffer_handle);
00526 INT bm_notify_client(char *buffer_name, int socket);
00527 INT EXPRT bm_mark_read_waiting(BOOL flag);
00528 INT bm_push_event(char *buffer_name);
00529 INT bm_check_buffers(void);
00530 INT EXPRT bm_remove_event_request(INT buffer_handle, INT request_id);
00531 void EXPRT bm_defragment_event(HNDLE buffer_handle, HNDLE request_id,
00532 EVENT_HEADER * pevent, void *pdata,
00533 void (*dispatcher) (HNDLE, HNDLE,
00534 EVENT_HEADER *, void *));
00535
00536
00537 INT EXPRT db_lock_database(HNDLE database_handle);
00538 INT EXPRT db_unlock_database(HNDLE database_handle);
00539 INT db_update_record(INT hDB, INT hKey, int socket);
00540 INT db_close_all_records(void);
00541 INT EXPRT db_flush_database(HNDLE hDB);
00542 INT EXPRT db_notify_clients(HNDLE hDB, HNDLE hKey, BOOL bWalk);
00543 INT EXPRT db_set_client_name(HNDLE hDB, char *client_name);
00544 INT db_delete_key1(HNDLE hDB, HNDLE hKey, INT level, BOOL follow_links);
00545 INT EXPRT db_show_mem(HNDLE hDB, char *result, INT buf_size, BOOL verbose);
00546
00547
00548 RPC_LIST EXPRT *rpc_get_internal_list(INT flag);
00549 INT rpc_server_receive(INT index, int sock, BOOL check);
00550 INT rpc_server_callback(struct callback_addr *callback);
00551 INT EXPRT rpc_server_accept(int sock);
00552 INT rpc_client_accept(int sock);
00553 INT rpc_get_server_acception(void);
00554 INT rpc_set_server_acception(INT index);
00555 INT EXPRT rpc_set_server_option(INT item, POINTER_T value);
00556 POINTER_T EXPRT rpc_get_server_option(INT item);
00557 INT recv_tcp_check(int sock);
00558 INT recv_event_check(int sock);
00559 INT rpc_deregister_functions(void);
00560 INT rpc_check_channels(void);
00561 void EXPRT rpc_client_check();
00562 INT rpc_server_disconnect(void);
00563 int EXPRT rpc_get_send_sock(void);
00564 int EXPRT rpc_get_event_sock(void);
00565 INT EXPRT rpc_set_opt_tcp_size(INT tcp_size);
00566 INT EXPRT rpc_get_opt_tcp_size(void);
00567
00568
00569 INT ss_shm_open(char *name, INT size, void **adr, HNDLE *handle, BOOL get_size);
00570 INT ss_shm_close(char *name, void *adr, HNDLE handle, INT destroy_flag);
00571 INT ss_shm_flush(char *name, void *adr, INT size);
00572 INT ss_shm_protect(HNDLE handle, void *adr);
00573 INT ss_shm_unprotect(HNDLE handle, void **adr);
00574 INT ss_spawnv(INT mode, char *cmdname, char *argv[]);
00575 INT ss_shell(int sock);
00576 INT EXPRT ss_daemon_init(BOOL keep_stdout);
00577 INT EXPRT ss_system(char *command);
00578 INT EXPRT ss_exec(char *cmd, INT * child_pid);
00579 BOOL EXPRT ss_existpid(INT pid);
00580 INT EXPRT ss_getpid(void);
00581 INT EXPRT ss_gettid(void);
00582 INT ss_getthandle(void);
00583 INT ss_set_async_flag(INT flag);
00584 INT EXPRT ss_mutex_create(char *mutex_name, HNDLE * mutex_handle);
00585 INT EXPRT ss_mutex_wait_for(HNDLE mutex_handle, INT timeout);
00586 INT EXPRT ss_mutex_release(HNDLE mutex_handle);
00587 INT EXPRT ss_mutex_delete(HNDLE mutex_handle, INT destroy_flag);
00588 INT ss_wake(INT pid, INT tid, INT thandle);
00589 INT ss_alarm(INT millitime, void (*func) (int));
00590 INT ss_suspend_get_port(INT * port);
00591 INT ss_suspend_set_dispatch(INT channel, void *connection, INT(*dispatch) ());
00592 INT ss_resume(INT port, char *message);
00593 INT ss_suspend_exit(void);
00594 INT ss_exception_handler(void (*func) ());
00595 void EXPRT ss_force_single_thread();
00596 INT EXPRT ss_suspend(INT millisec, INT msg);
00597 midas_thread_t EXPRT ss_thread_create(INT(*func) (void *), void *param);
00598 INT EXPRT ss_thread_kill(midas_thread_t thread_id);
00599 INT EXPRT ss_get_struct_align(void);
00600 INT EXPRT ss_timezone(void);
00601
00602
00603 INT EXPRT send_tcp(int sock, char *buffer, DWORD buffer_size, INT flags);
00604 INT EXPRT recv_tcp(int sock, char *buffer, DWORD buffer_size, INT flags);
00605 INT send_udp(int sock, char *buffer, DWORD buffer_size, INT flags);
00606 INT recv_udp(int sock, char *buffer, DWORD buffer_size, INT flags);
00607 INT EXPRT recv_string(int sock, char *buffer, DWORD buffer_size, INT flags);
00608
00609
00610 INT EXPRT ss_syslog(const char *message);
00611
00612
00613 INT EXPRT eb_create_buffer(INT size);
00614 INT EXPRT eb_free_buffer(void);
00615 BOOL EXPRT eb_buffer_full(void);
00616 BOOL EXPRT eb_buffer_empty(void);
00617 EVENT_HEADER EXPRT *eb_get_pointer(void);
00618 INT EXPRT eb_increment_pointer(INT buffer_handle, INT event_size);
00619 INT EXPRT eb_send_events(BOOL send_all);
00620
00621
00622 INT EXPRT dm_buffer_create(INT size, INT usize);
00623 INT EXPRT dm_buffer_release(void);
00624 BOOL EXPRT dm_area_full(void);
00625 EVENT_HEADER EXPRT *dm_pointer_get(void);
00626 INT EXPRT dm_pointer_increment(INT buffer_handle, INT event_size);
00627 INT EXPRT dm_area_send(void);
00628 INT EXPRT dm_area_flush(void);
00629 INT EXPRT dm_task(void *pointer);
00630 DWORD EXPRT dm_buffer_time_get(void);
00631 INT EXPRT dm_async_area_send(void *pointer);
00632
00633
00634 int EXPRT rb_set_nonblocking();
00635 int EXPRT rb_create(int size, int max_event_size, int *ring_buffer_handle);
00636 int EXPRT rb_delete(int ring_buffer_handle);
00637 int EXPRT rb_get_wp(int handle, void **p, int millisec);
00638 int EXPRT rb_increment_wp(int handle, int size);
00639 int EXPRT rb_get_rp(int handle, void **p, int millisec);
00640 int EXPRT rb_increment_rp(int handle, int size);
00641 int EXPRT rb_get_buffer_level(int handle, int * n_bytes);
00642
00643
00644
00645 #include "mrpc.h"
00646
00647 #ifdef __cplusplus
00648 }
00649 #endif
00650
00651 #endif
00652