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