00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "C_TransIP.hpp"
00021 #include "Utils.hpp"
00022
00023 #include <cerrno>
00024 #include <unistd.h>
00025
00026 #include <regex.h>
00027
00028 #include "iostream_t.hpp"
00029 #include "integer_t.hpp"
00030
00031 #ifdef DEBUG_MODE
00032 #define GEN_DEBUG(l,a) iostream_error << a << iostream_endl << iostream_flush ;
00033 #else
00034 #define GEN_DEBUG(l,a)
00035 #endif
00036
00037 #define GEN_ERROR(l,a) iostream_error << a << iostream_endl << iostream_flush ;
00038
00039 #define LOG_ERROR(m) { \
00040 char L_err [100] ; \
00041 snprintf(L_err, 100, (m)) ; \
00042 (*m_logError)(L_err); \
00043 }
00044
00045 #define LOG_ERROR_P1(m,P1) { \
00046 char L_err [100] ; \
00047 snprintf(L_err, 100, (m), (P1)) ; \
00048 (*m_logError)(L_err); \
00049 }
00050
00051 #define LOG_ERROR_P2(m,P1,P2) { \
00052 char L_err [100] ; \
00053 snprintf(L_err, 100, (m), (P1),(P2)) ; \
00054 (*m_logError)(L_err); \
00055 }
00056
00057
00058 #define LOG_ALL(m) { \
00059 char L_msg [100] ; \
00060 snprintf(L_msg, 100, (m)) ; \
00061 (*m_logInfo)(L_msg); \
00062 }
00063
00064 #define LOG_ALL_P1(m,P1) { \
00065 char L_msg [100] ; \
00066 snprintf(L_msg, 100, (m), (P1)) ; \
00067 (*m_logInfo)(L_msg); \
00068 }
00069
00070 #define LOG_ALL_P2(m,P1,P2) { \
00071 char L_msg [100] ; \
00072 snprintf(L_msg, 100, (m), (P1),(P2)) ; \
00073 (*m_logInfo)(L_msg); \
00074 }
00075
00076 #define DEFAULT_BUFFER_SIZE 65535
00077
00078 #define DEFAULT_DECODE_BUFFER_SIZE 4096
00079 #define DEFAULT_ENCODE_BUFFER_SIZE 4096
00080 #define DEFAULT_READ_BUFFER_SIZE 1024
00081
00082
00083 C_TransIP::C_TransIP() {
00084 GEN_DEBUG(0, "C_TransIP::C_TransIP()") ;
00085 m_socket_map.clear () ;
00086
00087 m_ip_addr_map.clear() ;
00088 m_max_fd = 0 ;
00089 m_buffer_size = DEFAULT_BUFFER_SIZE ;
00090
00091 m_encode_buffer_size = DEFAULT_ENCODE_BUFFER_SIZE ;
00092 m_decode_buffer_size = DEFAULT_DECODE_BUFFER_SIZE ;
00093 m_decode_buffer = NULL ;
00094 m_encode_buffer = NULL ;
00095
00096 m_read_buffer_size = DEFAULT_READ_BUFFER_SIZE ;
00097
00098 }
00099
00100 C_TransIP::~C_TransIP() {
00101
00102 GEN_DEBUG(0, "C_TransIP::~C_TransIP() start") ;
00103
00104 close() ;
00105 m_max_fd = 0 ;
00106
00107 FREE_TABLE(m_decode_buffer);
00108 FREE_TABLE(m_encode_buffer);
00109
00110 GEN_DEBUG(0, "C_TransIP::~C_TransIP() end") ;
00111 }
00112
00113 int C_TransIP::init (char *P_buf,
00114 T_logFunction P_logError,
00115 T_logFunction P_logInfo) {
00116
00117 int L_ret = -1 ;
00118
00119 GEN_DEBUG(1, "C_TransIP::init ("<< P_buf << ")");
00120 m_logError = P_logError ;
00121 m_logInfo = P_logInfo ;
00122
00123 if (analyze_init_string(P_buf)) {
00124 ALLOC_TABLE(m_decode_buffer,
00125 unsigned char *,
00126 sizeof(unsigned char),
00127 m_decode_buffer_size);
00128 ALLOC_TABLE(m_encode_buffer,
00129 unsigned char *,
00130 sizeof(unsigned char),
00131 m_encode_buffer_size);
00132 L_ret = 0 ;
00133 }
00134
00135 return (L_ret);
00136 }
00137
00138 int C_TransIP::config (T_pConfigValueList P_config_param_list) {
00139 GEN_DEBUG(1, "C_TransIP::config ()");
00140
00141
00142 return(0);
00143 }
00144
00145
00146 int C_TransIP::open (int P_channel_id,
00147 char *P_buf,
00148 T_pOpenStatus P_status,
00149 C_ProtocolFrame *P_protocol) {
00150
00151 int L_ret = 0 ;
00152 T_pIpAddr L_openAddr = NULL ;
00153 C_Socket *L_socket = NULL ;
00154
00155 GEN_DEBUG(1, "C_TransIP::open(protocol=" << P_protocol << ")");
00156
00157
00158 if ((P_protocol->get_type() != C_ProtocolFrame::E_PROTOCOL_BINARY) &&
00159 (P_protocol->get_type() != C_ProtocolFrame::E_PROTOCOL_TEXT) ) {
00160
00161 LOG_ALL("Protocol not compatible with transport (must be binary or text)");
00162 return (-1) ;
00163 }
00164
00165 *P_status = E_OPEN_FAILED ;
00166 L_openAddr = create_IpAddr() ;
00167
00168 if (analyze_open_string(P_buf, L_openAddr) == true) {
00169
00170 if (L_openAddr->m_open != NULL) {
00171 extract_ip_addr(L_openAddr);
00172 resolve_addr(L_openAddr);
00173
00174 L_socket =
00175 open(P_channel_id, L_openAddr, P_status,
00176 (C_ProtocolBinaryFrame*)P_protocol) ;
00177
00178 if (L_socket != NULL) {
00179 L_ret = L_socket -> get_id () ;
00180 m_socket_map.insert (T_SocketMap::value_type(L_ret,L_socket));
00181 if (L_ret > m_max_fd) { m_max_fd = L_ret; } ;
00182 }
00183
00184 } else {
00185 L_ret = -1 ;
00186 }
00187 } else {
00188 L_ret = -1 ;
00189 }
00190
00191 if (L_ret != -1) {
00192 m_ip_addr_map.insert(T_IpAddrMap::value_type(L_ret,L_openAddr));
00193 } else {
00194 delete_IpAddr(&L_openAddr);
00195 }
00196 return(L_ret) ;
00197 }
00198
00199 int C_TransIP::set_channel_id (int P_id,
00200 int P_channel_id) {
00201 int L_ret ;
00202 T_SocketMap::iterator L_it ;
00203
00204 L_it = m_socket_map.find(T_SocketMap::key_type(P_id));
00205 if (L_it != m_socket_map.end()) {
00206 (L_it->second)->set_channel_id(P_channel_id);
00207 L_ret = 0 ;
00208 } else {
00209 L_ret = -1 ;
00210 }
00211 return (L_ret);
00212 }
00213
00214 T_SelectDef C_TransIP::select_definition () {
00215 return (NULL) ;
00216 }
00217
00218 int C_TransIP::pre_select (int P_n,
00219 fd_set *P_readfds,
00220 fd_set *P_writefds,
00221 fd_set *P_exceptfds,
00222 struct timeval *P_timeout,
00223 int *P_cnx,
00224 size_t P_nb) {
00225
00226 T_SocketMap::iterator L_it ;
00227
00228 for(L_it = m_socket_map.begin();
00229 L_it != m_socket_map.end ();
00230 L_it ++) {
00231 (L_it->second) -> set_fd_set (P_readfds, P_writefds);
00232 }
00233
00234 return ((m_max_fd > P_n) ? m_max_fd : P_n) ;
00235 }
00236
00237 int C_TransIP::post_select (int P_n,
00238 fd_set *P_readfds,
00239 fd_set *P_writefds,
00240 fd_set *P_exceptfds,
00241 T_pC_TransportEvent P_eventTable,
00242 size_t *P_nb) {
00243
00244 T_SocketMap::iterator L_it ;
00245 int L_n = P_n ;
00246 C_Socket *L_newSocket, *L_socket ;
00247 C_TransportEvent L_event ;
00248 int L_id ;
00249
00250 int L_nb_event = 0 ;
00251
00252 list_t<T_SocketMap::iterator>::iterator L_del_it ;
00253 list_t<C_Socket*>::iterator L_ins_it ;
00254
00255 bool L_max_update = false ;
00256
00257 GEN_DEBUG(0, "C_TransIP::post_select()");
00258
00259 for (L_it = m_socket_map.begin();
00260 L_it != m_socket_map.end ();
00261 L_it++) {
00262
00263 if (L_n) {
00264
00265 L_socket = L_it->second ;
00266 L_event.no_event() ;
00267 L_newSocket = L_socket->process_fd_set(P_readfds,P_writefds, &L_event);
00268 switch (L_event.m_type) {
00269
00270 case C_TransportEvent::E_TRANS_NO_EVENT:
00271 GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_NO_EVENT");
00272 break ;
00273
00274 case C_TransportEvent::E_TRANS_RECEIVED:
00275 GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_RECEIVED");
00276 P_eventTable[L_nb_event] = L_event ;
00277
00278
00279 decode_from_protocol (L_socket);
00280
00281 L_nb_event++ ;
00282 L_n -- ;
00283 break ;
00284
00285 case C_TransportEvent::E_TRANS_CLOSED:
00286 GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_CLOSED");
00287 L_id = (L_socket)->get_id() ;
00288 LOG_ALL_P1("Connection closed: [%d]", L_id);
00289 (L_socket)->_close() ;
00290 m_delete_list.push_back(L_it) ;
00291 DELETE_VAR(L_socket);
00292 if (L_id == m_max_fd) { L_max_update = true ; }
00293 P_eventTable[L_nb_event] = L_event ;
00294 L_nb_event++ ;
00295 L_n-- ;
00296 break ;
00297
00298 case C_TransportEvent::E_TRANS_CONNECTION:
00299 L_id = L_event.m_id ;
00300 GEN_DEBUG(0, "C_TransIP::post_select() E_TRANS_CONNECTION id="
00301 << L_id);
00302 if (L_id > m_max_fd) { L_max_update = true ; }
00303 m_insert_list.push_back(L_newSocket);
00304 P_eventTable[L_nb_event] = L_event ;
00305 L_nb_event++ ;
00306 L_n-- ;
00307 break ;
00308
00309 case C_TransportEvent::E_TRANS_OPEN:
00310 P_eventTable[L_nb_event] = L_event ;
00311 L_nb_event++ ;
00312 L_n-- ;
00313 break ;
00314
00315 case C_TransportEvent::E_TRANS_OPEN_FAILED:
00316 L_id = (L_socket)->get_id() ;
00317 (L_socket)->_close() ;
00318 m_delete_list.push_back(L_it) ;
00319 DELETE_VAR(L_socket);
00320 if (L_id == m_max_fd) { L_max_update = true ; }
00321 P_eventTable[L_nb_event] = L_event ;
00322 L_nb_event++ ;
00323 L_n-- ;
00324 break ;
00325
00326 }
00327 }
00328 }
00329
00330 if (! m_delete_list.empty() ) {
00331 for(L_del_it = m_delete_list.begin();
00332 L_del_it != m_delete_list.end();
00333 L_del_it++) {
00334 m_socket_map.erase(*L_del_it);
00335 }
00336 m_delete_list.erase(m_delete_list.begin(), m_delete_list.end());
00337 }
00338
00339 if (! m_insert_list.empty()) {
00340 for(L_ins_it = m_insert_list.begin();
00341 L_ins_it != m_insert_list.end();
00342 L_ins_it++) {
00343 L_newSocket = *L_ins_it ;
00344 L_id = L_newSocket->get_id();
00345 m_socket_map.insert(T_SocketMap::value_type(L_id,L_newSocket));
00346 }
00347 m_insert_list.erase(m_insert_list.begin(), m_insert_list.end());
00348 }
00349
00350 if (L_max_update == true) {
00351 m_max_fd = (m_socket_map.empty()) ?
00352 0 : (m_socket_map.rbegin())->first ;
00353 GEN_DEBUG(0, "C_TransIP::post_select() max fd [" << m_max_fd << "]");
00354 }
00355
00356 *P_nb = L_nb_event ;
00357 GEN_DEBUG(0, "C_TransIP::post_select() L_nb_event = " << L_nb_event);
00358 GEN_DEBUG(0, "C_TransIP::post_select() return = " << L_n);
00359 return (L_n);
00360 }
00361
00362
00363 int C_TransIP::send_message (int P_id,
00364 C_MessageFrame *P_msg) {
00365
00366 T_SocketMap::iterator L_it ;
00367 C_Socket *L_socket ;
00368
00369
00370 size_t L_size = m_encode_buffer_size;
00371 unsigned char *L_data = m_encode_buffer ;
00372
00373 C_ProtocolBinaryFrame *L_protocol ;
00374
00375 C_ProtocolFrame::T_MsgError L_error = C_ProtocolFrame::E_MSG_OK ;
00376
00377 int L_ret = -1 ;
00378
00379 L_it = m_socket_map.find (T_SocketMap::key_type(P_id));
00380 if (L_it != m_socket_map.end()) {
00381 L_socket = L_it->second ;
00382 L_protocol = L_socket -> get_protocol() ;
00383
00384 L_error = L_protocol->encode_message(P_msg, L_data, &L_size);
00385
00386 if (L_error == C_ProtocolFrame::E_MSG_OK) {
00387 L_protocol->log_buffer((char*)"sent", L_data, L_size);
00388
00389 L_ret = L_socket
00390 ->send_buffer(L_data, L_size);
00391
00392 }
00393 }
00394 return ((L_ret>0) ? 0 : L_ret) ;
00395 }
00396
00397 int C_TransIP::close () {
00398
00399 T_SocketMap::iterator L_it ;
00400 C_Socket *L_socket ;
00401
00402
00403 T_IpAddrMap::iterator L_ip_addr_it ;
00404 T_pIpAddr L_addr ;
00405
00406 if (!m_ip_addr_map.empty()) {
00407 for (L_ip_addr_it = m_ip_addr_map.begin();
00408 L_ip_addr_it != m_ip_addr_map.end ();
00409 L_ip_addr_it++) {
00410 L_addr = (L_ip_addr_it->second) ;
00411 delete_IpAddr(&L_addr);
00412 }
00413 m_ip_addr_map.erase(m_ip_addr_map.begin(), m_ip_addr_map.end());
00414 }
00415
00416
00417 if (!m_socket_map.empty()) {
00418 for (L_it = m_socket_map.begin();
00419 L_it != m_socket_map.end ();
00420 L_it++) {
00421 L_socket = L_it->second ;
00422 L_socket -> _close();
00423 DELETE_VAR(L_socket);
00424 }
00425 m_socket_map.erase(m_socket_map.begin(), m_socket_map.end());
00426 }
00427 return (0);
00428 }
00429
00430 int C_TransIP::close (int P_id) {
00431
00432 T_SocketMap::iterator L_it ;
00433 C_Socket *L_socket ;
00434 int L_ret = 0 ;
00435
00436
00437 T_IpAddrMap::iterator L_ip_addr_it ;
00438 T_pIpAddr L_addr ;
00439
00440 if (!m_ip_addr_map.empty()) {
00441 L_ip_addr_it = m_ip_addr_map.find (T_IpAddrMap::key_type(P_id));
00442 if (L_ip_addr_it != m_ip_addr_map.end()) {
00443 L_addr = L_ip_addr_it->second ;
00444 delete_IpAddr(&L_addr);
00445 m_ip_addr_map.erase(L_ip_addr_it);
00446 } else {
00447 L_ret = -1 ;
00448 }
00449 } else {
00450 L_ret = -1 ;
00451 }
00452
00453
00454
00455 if (!m_socket_map.empty()) {
00456 L_it = m_socket_map.find (T_SocketMap::key_type(P_id));
00457 if (L_it != m_socket_map.end()) {
00458 L_socket = L_it->second ;
00459 L_socket -> _close();
00460 DELETE_VAR(L_socket);
00461 m_socket_map.erase(L_it);
00462 } else {
00463 L_ret = -1 ;
00464 }
00465 } else {
00466 L_ret = -1 ;
00467 }
00468
00469 return (L_ret);
00470 }
00471
00472
00473
00474 C_Socket* C_TransIP::open (int P_channel_id,
00475 T_pIpAddr P_Addr,
00476 T_pOpenStatus P_status,
00477 C_ProtocolBinaryFrame *P_protocol) {
00478
00479 int L_rc ;
00480 C_Socket *L_socket_created = NULL ;
00481
00482 GEN_DEBUG(1, "C_TransIP::open ()");
00483
00484 switch (P_Addr->m_umode) {
00485 case E_IP_USAGE_MODE_SERVER: {
00486
00487 if (m_trans_type == E_SOCKET_TCP_MODE) {
00488 C_SocketListen *L_Socket ;
00489
00490 NEW_VAR(L_Socket, C_SocketListen(m_trans_type,
00491 P_Addr,
00492 P_channel_id,
00493 m_read_buffer_size,
00494 m_decode_buffer_size));
00495
00496 L_rc = L_Socket->_open(m_buffer_size, P_protocol) ;
00497 if (L_rc == 0) {
00498 L_socket_created = L_Socket ;
00499 *P_status = E_OPEN_OK ;
00500 } else {
00501 DELETE_VAR(L_Socket) ;
00502 *P_status = E_OPEN_FAILED ;
00503 }
00504 } else {
00505 C_SocketServer *L_Socket ;
00506
00507 NEW_VAR(L_Socket, C_SocketServer(m_trans_type,
00508 P_Addr,
00509 P_channel_id,
00510 m_read_buffer_size,
00511 m_decode_buffer_size));
00512
00513 L_rc = L_Socket->_open_udp(m_buffer_size, P_protocol) ;
00514 if (L_rc == 0) {
00515 L_socket_created = L_Socket ;
00516 *P_status = E_OPEN_OK ;
00517 } else {
00518 DELETE_VAR(L_Socket) ;
00519 *P_status = E_OPEN_FAILED ;
00520 }
00521 }
00522 }
00523 break ;
00524
00525 case E_IP_USAGE_MODE_CLIENT: {
00526 C_SocketClient *L_Socket ;
00527
00528 NEW_VAR(L_Socket, C_SocketClient(m_trans_type,
00529 P_Addr,
00530 P_channel_id,
00531 m_read_buffer_size,
00532 m_decode_buffer_size));
00533
00534
00535 L_rc = L_Socket->_open(P_status, m_buffer_size, P_protocol) ;
00536 if (L_rc == 0) {
00537 L_socket_created = L_Socket ;
00538 } else {
00539 DELETE_VAR(L_Socket) ;
00540 *P_status = E_OPEN_FAILED ;
00541 }
00542 }
00543
00544 break ;
00545
00546 case E_IP_USAGE_MODE_UNKNOWN:
00547
00548
00549 LOG_ALL("OPEN failed: Unsupported mode");
00550 *P_status = E_OPEN_FAILED ;
00551 break ;
00552 }
00553
00554 return (L_socket_created);
00555 }
00556
00557 bool C_TransIP::analyze_ulong_value (char* P_buf,
00558 char* P_pattern,
00559 size_t* P_value) {
00560 bool L_ret = false ;
00561 char *L_ptr ;
00562 char L_tmp [255] ;
00563 char *L_buf ;
00564
00565 char *L_pattern ;
00566
00567 L_buf = P_buf ;
00568 L_ptr = strstr(L_buf, P_pattern);
00569 ALLOC_TABLE(L_pattern, char*, sizeof(char),strlen(P_pattern)+8);
00570 L_pattern[0] = '\0' ;
00571 sprintf(L_pattern, "%s", P_pattern);
00572 strcat(L_pattern, "%[^;]*s");
00573 if (L_ptr != NULL) {
00574 sscanf(L_ptr, L_pattern, L_tmp);
00575 GEN_DEBUG(1, "C_TransIP::analyze_ulong_value() buffer size ["
00576 << L_tmp << "]");
00577
00578 if (strlen(L_tmp)>0) {
00579 char *L_end_ptr ;
00580 unsigned long L_value ;
00581 L_value = strtoul_f (L_tmp, &L_end_ptr, 10);
00582 if (L_end_ptr[0] == '\0') {
00583 *P_value = L_value ;
00584 L_ret = true ;
00585 }
00586 }
00587 }
00588
00589 FREE_TABLE(L_pattern);
00590 return (L_ret);
00591 }
00592
00593 bool C_TransIP::analyze_string_value (char* P_buf,
00594 char* P_pattern,
00595 char* P_value) {
00596 bool L_ret = false ;
00597
00598 char *L_ptr ;
00599 char *L_pattern ;
00600
00601 GEN_DEBUG(1, "C_TransIP::analyze_string_value ("<< P_buf << ")");
00602 L_ptr = strstr(P_buf,P_pattern) ;
00603 ALLOC_TABLE(L_pattern, char*, sizeof(char),strlen(P_pattern)+8);
00604 L_pattern[0] = '\0' ;
00605 sprintf(L_pattern, "%s", P_pattern);
00606 strcat(L_pattern, "%[^;]*s");
00607 if (L_ptr != NULL) {
00608 sscanf(L_ptr, L_pattern, P_value);
00609 L_ret = true ;
00610 }
00611
00612 FREE_TABLE(L_pattern);
00613 return (L_ret);
00614 }
00615
00616 void C_TransIP::analyze_optional_init_string(char *P_buf) {
00617
00618 if (analyze_ulong_value (P_buf,
00619 (char*)"decode-buf-len=",
00620 &m_decode_buffer_size)) {
00621
00622 }
00623 if (analyze_ulong_value (P_buf,
00624 (char*)"encode-buf-len=",
00625 &m_encode_buffer_size)) {
00626
00627 }
00628 if (analyze_ulong_value (P_buf,
00629 (char*)"read-buf-len=",
00630 &m_read_buffer_size)) {
00631
00632 }
00633 }
00634
00635 bool C_TransIP::analyze_init_string(char *P_buf) {
00636
00637 bool L_ret = false ;
00638 char L_tmp [255] ;
00639
00640
00641 GEN_DEBUG(1, "C_TransIP::analyze_init_string ("<< P_buf << ")");
00642
00643 if (analyze_string_value (P_buf,
00644 (char*)"type=",
00645 L_tmp)) {
00646
00647 if (!strcmp(L_tmp,"tcp")) {
00648 m_trans_type = E_SOCKET_TCP_MODE ;
00649 L_ret = true ;
00650 } else if (!strcmp(L_tmp,"udp")) {
00651 m_trans_type = E_SOCKET_UDP_MODE ;
00652 L_ret = true ;
00653 }
00654 }
00655
00656 analyze_optional_init_string(P_buf);
00657
00658 return (L_ret);
00659
00660 }
00661
00662 bool C_TransIP::analyze_open_string (char *P_buf, T_pIpAddr P_addr) {
00663
00664 char L_tmp [255] ;
00665 char *L_buf, *L_ptr ;
00666
00667 GEN_DEBUG(1, "C_TransIP::analyze_open_string (args=" << P_buf << ")");
00668
00669 L_buf = P_buf ;
00670 L_ptr = strstr(L_buf, "mode=");
00671 if (L_ptr != NULL) {
00672 sscanf(L_ptr+5, "%[^;]*s", L_tmp);
00673 GEN_DEBUG(1, "m [" << L_tmp << "]");
00674 if (!strcmp(L_tmp,"server")) {
00675 P_addr->m_umode = E_IP_USAGE_MODE_SERVER ;
00676 } else if (!strcmp(L_tmp,"client")) {
00677 P_addr->m_umode = E_IP_USAGE_MODE_CLIENT ;
00678 }
00679 }
00680 L_buf = P_buf ;
00681 L_ptr = strstr(L_buf, "source=");
00682 if (L_ptr != NULL) {
00683 sscanf(L_ptr+7, "%[^;]*s", L_tmp);
00684 GEN_DEBUG(1, "C_TransIP::analyze_open_string() s [" << L_tmp << "]");
00685 if (strlen(L_tmp)>0) {
00686 ALLOC_TABLE(P_addr->m_open,
00687 char*,sizeof(char),
00688 strlen(L_tmp)+1);
00689 strcpy(P_addr->m_open, L_tmp);
00690
00691 ALLOC_TABLE(P_addr->m_open_src,
00692 char*,sizeof(char),
00693 strlen(L_tmp)+1);
00694 strcpy(P_addr->m_open_src, L_tmp);
00695 }
00696 }
00697 L_buf = P_buf ;
00698 L_ptr = strstr(L_buf, "dest=");
00699 if (L_ptr != NULL) {
00700 sscanf(L_ptr+5, "%[^;]*s", L_tmp);
00701 GEN_DEBUG(1, "C_TransIP::analyze_open_string() d [" << L_tmp << "]");
00702 if (strlen(L_tmp)>0) {
00703 ALLOC_TABLE(P_addr->m_open,
00704 char*,sizeof(char),
00705 strlen(L_tmp)+1);
00706 strcpy(P_addr->m_open, L_tmp);
00707 }
00708 }
00709
00710 L_buf = P_buf ;
00711 L_ptr = strstr(L_buf, "buffer=");
00712 if (L_ptr != NULL) {
00713 sscanf(L_ptr+7, "%[^;]*s", L_tmp);
00714 GEN_DEBUG(1, "C_TransIP::analyze_open_string() buffer size ["
00715 << L_tmp << "]");
00716 if (strlen(L_tmp)>0) {
00717 char *L_end_ptr ;
00718 unsigned long L_value ;
00719 L_value = strtoul_f (L_tmp, &L_end_ptr, 10);
00720 if (L_end_ptr[0] == '\0') {
00721 m_buffer_size = L_value ;
00722 P_addr->m_buffer_size = L_value ;
00723 }
00724 }
00725 }
00726
00727 return (true) ;
00728 }
00729
00730 int C_TransIP::extract_ip_addr(T_pIpAddr P_pIpAddr) {
00731
00732 char *L_search = NULL ;
00733
00734 regex_t L_regExpr ;
00735 regmatch_t L_pmatch ;
00736 int L_status ;
00737
00738 char L_buffer[1024] ;
00739 size_t L_matchSize ;
00740
00741 GEN_DEBUG(0, "C_TransIP::extract_ip_addr()");
00742
00743 if (P_pIpAddr == NULL) { return (-1) ; }
00744 if (P_pIpAddr->m_open == NULL) { return (0) ; }
00745
00746 L_search = P_pIpAddr->m_open ;
00747 P_pIpAddr -> m_value = NULL ;
00748 P_pIpAddr -> m_port = -1 ;
00749 memset(&(P_pIpAddr->m_addr), 0, sizeof(T_SockAddrStorage));
00750
00751
00752 L_status = regcomp (&L_regExpr, "^[:blank:]*\\[", REG_EXTENDED) ;
00753 if (L_status != 0) {
00754 regerror(L_status, &L_regExpr, L_buffer, 1024);
00755 regfree (&L_regExpr) ;
00756 LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00757
00758 return (-1);
00759 }
00760
00761 L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00762 regfree (&L_regExpr) ;
00763
00764 if (L_status == 0) {
00765
00766 L_search += L_pmatch.rm_eo ;
00767
00768
00769 L_status = regcomp(&L_regExpr, "[^]]*", REG_EXTENDED) ;
00770 if (L_status != 0) {
00771 regerror(L_status, &L_regExpr, L_buffer, 1024);
00772 regfree (&L_regExpr) ;
00773 LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00774
00775
00776 return (-1);
00777 }
00778
00779 L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00780 regfree (&L_regExpr) ;
00781 if (L_status == 0) {
00782
00783 L_matchSize = L_pmatch.rm_eo - L_pmatch.rm_so ;
00784 if (L_matchSize) { memcpy(L_buffer, L_search, L_matchSize); }
00785 L_buffer[L_matchSize] = 0 ;
00786 L_search += L_matchSize ;
00787 L_search = strstr(L_search, ":");
00788
00789 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() IPV6 addr [" << L_buffer << "]");
00790
00791 } else {
00792 LOG_ALL_P1("regexec error character: [%c] not found", ']');
00793
00794
00795 return (-1);
00796 }
00797
00798 } else {
00799
00800
00801 L_search = strstr(P_pIpAddr->m_open, ":") ;
00802
00803 L_matchSize = (L_search != NULL)
00804 ? (L_search - (P_pIpAddr->m_open)) : strlen(P_pIpAddr->m_open) ;
00805 if (L_matchSize) { memcpy(L_buffer, P_pIpAddr->m_open, L_matchSize) ; }
00806 L_buffer[L_matchSize] = 0 ;
00807
00808
00809 GEN_DEBUG(0, "C_TransIP::extract_ip_addr() IPV4 addr or hostname = ["
00810 << L_buffer << "]");
00811 }
00812
00813 if (strlen(L_buffer) != 0) {
00814 ALLOC_TABLE(P_pIpAddr -> m_value, char*,
00815 sizeof(char), strlen(L_buffer)+1) ;
00816 strcpy(P_pIpAddr->m_value, L_buffer);
00817 }
00818
00819 if (L_search != NULL) {
00820 char *L_end_ptr = NULL ;
00821 P_pIpAddr -> m_port = (long)strtoul_f(L_search+1, &L_end_ptr, 10);
00822 if (L_end_ptr[0] != '\0') {
00823 P_pIpAddr->m_port = -1 ;
00824 GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00825 }
00826 } else {
00827 GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00828 }
00829
00830 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Port [" << P_pIpAddr->m_port << "]");
00831
00832 #ifdef DEBUG_MODE
00833 {
00834 const char *L_novalue = "no value" ;
00835 char *L_value = (P_pIpAddr->m_value == NULL) ?
00836 (char*)L_novalue : P_pIpAddr->m_value ;
00837 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Addr value ["
00838 << L_value << "]") ;
00839 }
00840 #endif
00841
00842 if (P_pIpAddr->m_open_src != NULL) {
00843
00844 L_search = P_pIpAddr->m_open_src ;
00845 P_pIpAddr -> m_value_src = NULL ;
00846 P_pIpAddr -> m_port_src = -1 ;
00847 memset(&(P_pIpAddr->m_addr_src), 0, sizeof(T_SockAddrStorage));
00848
00849
00850 L_status = regcomp (&L_regExpr, "^[:blank:]*\\[", REG_EXTENDED) ;
00851 if (L_status != 0) {
00852 regerror(L_status, &L_regExpr, L_buffer, 1024);
00853 regfree (&L_regExpr) ;
00854 LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00855
00856 return (-1);
00857 }
00858
00859 L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00860 regfree (&L_regExpr) ;
00861
00862 if (L_status == 0) {
00863
00864 L_search += L_pmatch.rm_eo ;
00865
00866
00867 L_status = regcomp(&L_regExpr, "[^]]*", REG_EXTENDED) ;
00868 if (L_status != 0) {
00869 regerror(L_status, &L_regExpr, L_buffer, 1024);
00870 regfree (&L_regExpr) ;
00871 LOG_ALL_P1("regcomp error: [%s]", L_buffer);
00872
00873 return (-1);
00874 }
00875
00876 L_status = regexec (&L_regExpr, L_search, 1, &L_pmatch, 0) ;
00877 regfree (&L_regExpr) ;
00878 if (L_status == 0) {
00879
00880 L_matchSize = L_pmatch.rm_eo - L_pmatch.rm_so ;
00881 if (L_matchSize) { memcpy(L_buffer, L_search, L_matchSize); }
00882 L_buffer[L_matchSize] = 0 ;
00883 L_search += L_matchSize ;
00884 L_search = strstr(L_search, ":");
00885
00886 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() IPV6 addr [" << L_buffer << "]");
00887
00888 } else {
00889 LOG_ALL_P1("regexec error character: [%c] not found", ']');
00890
00891 return (-1);
00892 }
00893
00894 } else {
00895
00896
00897 L_search = strstr(P_pIpAddr->m_open_src, ":") ;
00898
00899 L_matchSize = (L_search != NULL)
00900 ? (L_search - (P_pIpAddr->m_open_src)) : strlen(P_pIpAddr->m_open_src) ;
00901 if (L_matchSize) { memcpy(L_buffer, P_pIpAddr->m_open_src, L_matchSize) ; }
00902 L_buffer[L_matchSize] = 0 ;
00903
00904
00905 GEN_DEBUG(0, "C_TransIP::extract_ip_addr() IPV4 addr or hostname = ["
00906 << L_buffer << "]");
00907 }
00908
00909 if (strlen(L_buffer) != 0) {
00910 ALLOC_TABLE(P_pIpAddr -> m_value_src, char*,
00911 sizeof(char), strlen(L_buffer)+1) ;
00912 strcpy(P_pIpAddr->m_value_src, L_buffer);
00913 }
00914
00915 if (L_search != NULL) {
00916 char *L_end_ptr = NULL ;
00917 P_pIpAddr -> m_port_src = (long)strtoul_f(L_search+1, &L_end_ptr, 10);
00918 if (L_end_ptr[0] != '\0') {
00919 P_pIpAddr->m_port_src = -1 ;
00920 GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00921 }
00922 } else {
00923 GEN_DEBUG (0, "C_TransIP::extract_ip_addr() port not defined");
00924 }
00925
00926 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Port [" << P_pIpAddr->m_port << "]");
00927
00928 #ifdef DEBUG_MODE
00929 {
00930 const char *L_novalue = "no value" ;
00931 char *L_value = (P_pIpAddr->m_value_src == NULL) ?
00932 (char*)L_novalue : P_pIpAddr->m_value_src ;
00933 GEN_DEBUG(1, "C_TransIP::extract_ip_addr() Addr value ["
00934 << L_value << "]") ;
00935 }
00936 #endif
00937
00938 }
00939
00940
00941 return (0);
00942 }
00943
00944 int C_TransIP::resolve_addr(T_pIpAddr P_pIpAddr) {
00945
00946 char *L_host = P_pIpAddr->m_value ;
00947 long L_port = P_pIpAddr->m_port ;
00948 T_SockAddrStorage *L_resolved_sockaddr = &P_pIpAddr->m_addr ;
00949 char L_local_host[255] ;
00950
00951 #ifndef USE_IPV4_ONLY
00952 struct addrinfo L_hints ;
00953 struct addrinfo *L_local_addr ;
00954 #else
00955 struct hostent *L_local_addr ;
00956 #endif
00957
00958 #ifdef DEBUG_MODE
00959
00960 const char *L_cNoHost = "none" ;
00961 char *L_hostDebug = (L_host == NULL) ? (char*)L_cNoHost : L_host ;
00962
00963 GEN_DEBUG(1, "C_TransIP::resolve_addr() ["
00964 << L_hostDebug
00965 << "]:[" << L_port << "]");
00966 #endif
00967
00968 #ifndef USE_IPV4_ONLY
00969 memset((char*)&L_hints, 0, sizeof(L_hints));
00970 L_hints.ai_flags = AI_PASSIVE;
00971 L_hints.ai_family = PF_UNSPEC;
00972 #endif
00973
00974 if (L_host == NULL) {
00975 if (gethostname(L_local_host, 255)) {
00976 LOG_ALL("Unable to get local IP address");
00977
00978 return(-1);
00979 } else {
00980 ALLOC_TABLE(L_host, char*, sizeof(char),
00981 strlen(L_local_host)+1);
00982 strcpy(L_host, L_local_host) ;
00983 P_pIpAddr->m_value = L_host ;
00984 }
00985 }
00986 memset(L_resolved_sockaddr, 0, sizeof(T_SockAddrStorage));
00987
00988 #ifndef USE_IPV4_ONLY
00989 if (getaddrinfo(L_host,
00990 NULL,
00991 &L_hints,
00992 &L_local_addr) != 0) {
00993 LOG_ALL_P1("Unknown host: [%s]", L_host);
00994
00995 return (-1);
00996 }
00997
00998 L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->ai_addr->sa_family;
00999 memcpy(L_resolved_sockaddr,
01000 L_local_addr->ai_addr,
01001 SOCKADDR_IN_SIZE
01002 (RICAST(T_SockAddrStorage *,L_local_addr->ai_addr)));
01003 #else
01004 L_local_addr = gethostbyname(L_host);
01005 if (L_local_addr != NULL) {
01006 L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->h_addrtype;
01007 memcpy((void*)&L_resolved_sockaddr->sin_addr.s_addr,
01008 L_local_addr->h_addr_list[0],
01009 L_local_addr->h_length);
01010 } else {
01011 LOG_ALL_P1("Unknown host: [%s]", L_host);
01012
01013 return (-1);
01014 }
01015 #endif
01016
01017 switch (L_resolved_sockaddr->SOCKADDR_FAMILY) {
01018 case AF_INET:
01019 (RICAST(struct sockaddr_in *, L_resolved_sockaddr))->sin_port =
01020 htons((short)L_port);
01021 break ;
01022 #ifndef USE_IPV4_ONLY
01023 case AF_INET6:
01024 (RICAST(struct sockaddr_in6 *, L_resolved_sockaddr))->sin6_port =
01025 htons((short)L_port);
01026 break ;
01027 #endif
01028 default:
01029 LOG_ALL("Unsupported network");
01030
01031 return(-1);
01032 }
01033 if (inet_addr((char**)&(P_pIpAddr->m_ip), L_resolved_sockaddr) == -1) {
01034 LOG_ALL("Address not supported");
01035
01036
01037 }
01038
01039 #ifndef USE_IPV4_ONLY
01040 freeaddrinfo(L_local_addr);
01041 #endif
01042
01043
01044 L_host = P_pIpAddr->m_value_src ;
01045 L_port = P_pIpAddr->m_port_src ;
01046 L_resolved_sockaddr = &P_pIpAddr->m_addr_src ;
01047
01048 #ifdef DEBUG_MODE
01049 {
01050 const char *L_cNoHost = "none" ;
01051 char *L_hostDebug = (L_host == NULL) ? (char*)L_cNoHost : L_host ;
01052
01053 GEN_DEBUG(1, "C_TransIP::resolve_addr() ["
01054 << L_hostDebug
01055 << "]:[" << L_port << "]");
01056 }
01057 #endif
01058
01059 #ifndef USE_IPV4_ONLY
01060 memset((char*)&L_hints, 0, sizeof(L_hints));
01061 L_hints.ai_flags = AI_PASSIVE;
01062 L_hints.ai_family = PF_UNSPEC;
01063 #endif
01064
01065 if (L_host == NULL) {
01066 if (gethostname(L_local_host, 255)) {
01067 LOG_ALL("Unable to get local IP address");
01068
01069 return(-1);
01070 } else {
01071 ALLOC_TABLE(L_host, char*, sizeof(char),
01072 strlen(L_local_host)+1);
01073 strcpy(L_host, L_local_host) ;
01074 P_pIpAddr->m_value_src = L_host ;
01075 }
01076 }
01077 memset(L_resolved_sockaddr, 0, sizeof(T_SockAddrStorage));
01078
01079 #ifndef USE_IPV4_ONLY
01080 if (getaddrinfo(L_host,
01081 NULL,
01082 &L_hints,
01083 &L_local_addr) != 0) {
01084 LOG_ALL_P1("Unknown host: [%s]", L_host);
01085
01086 return (-1);
01087 }
01088
01089 L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->ai_addr->sa_family;
01090 memcpy(L_resolved_sockaddr,
01091 L_local_addr->ai_addr,
01092 SOCKADDR_IN_SIZE
01093 (RICAST(T_SockAddrStorage *,L_local_addr->ai_addr)));
01094 #else
01095 L_local_addr = gethostbyname(L_host);
01096 if (L_local_addr != NULL) {
01097 L_resolved_sockaddr->SOCKADDR_FAMILY = L_local_addr->h_addrtype;
01098 memcpy((void*)&L_resolved_sockaddr->sin_addr.s_addr,
01099 L_local_addr->h_addr_list[0],
01100 L_local_addr->h_length);
01101 } else {
01102 LOG_ALL_P1("Unknown host: [%s]", L_host);
01103
01104 return (-1);
01105 }
01106 #endif
01107
01108 switch (L_resolved_sockaddr->SOCKADDR_FAMILY) {
01109 case AF_INET:
01110 (RICAST(struct sockaddr_in *, L_resolved_sockaddr))->sin_port =
01111 htons((short)L_port);
01112 break ;
01113 #ifndef USE_IPV4_ONLY
01114 case AF_INET6:
01115 (RICAST(struct sockaddr_in6 *, L_resolved_sockaddr))->sin6_port =
01116 htons((short)L_port);
01117 break ;
01118 #endif
01119 default:
01120 LOG_ALL("Unsupported network");
01121
01122
01123 return(-1);
01124 }
01125 if (inet_addr((char**)&(P_pIpAddr->m_ip_src), L_resolved_sockaddr) == -1) {
01126 LOG_ALL("Address not supported");
01127
01128 }
01129
01130 #ifndef USE_IPV4_ONLY
01131 freeaddrinfo(L_local_addr);
01132 #endif
01133
01134 GEN_DEBUG(0, "C_TransIP::inet_addr() inet_addr [" << P_pIpAddr->m_ip << "]");
01135
01136 return(0);
01137 }
01138
01139 int C_TransIP::inet_addr(char **P_Addr, T_SockAddrStorage * P_AddrS) {
01140
01141 #ifndef USE_IPV4_ONLY
01142 char * L_ipAddr = NULL;
01143
01144 GEN_DEBUG(0, "C_TransIP::inet_addr()");
01145
01146 ALLOC_TABLE(L_ipAddr, char*, sizeof(char), 1024);
01147
01148 if (getnameinfo(RICAST(struct sockaddr *, P_AddrS),
01149 sizeof(struct sockaddr_storage),
01150 L_ipAddr,
01151 1024,
01152 NULL,
01153 0,
01154 NI_NUMERICHOST) != 0) {
01155 FREE_TABLE(L_ipAddr);
01156 return(-1);
01157 }
01158
01159 *P_Addr = L_ipAddr ;
01160 #endif
01161 return (0) ;
01162
01163 }
01164
01165
01166 void C_TransIP::decode_from_protocol (C_Socket *P_socket) {
01167
01168
01169 size_t L_data_size, L_tmp_size ;
01170 unsigned char *L_session_buf, *L_current_data ;
01171 C_pDataDecode L_decode = P_socket->get_decode() ;
01172 C_ProtocolBinaryFrame *L_protocol = P_socket->get_protocol() ;
01173 T_pRcvMsgCtxtList L_msg_list = P_socket->get_list() ;
01174 T_ReceiveMsgContext L_msg_ctxt ;
01175
01176 C_MessageFrame *L_decoded_msg ;
01177
01178 C_ProtocolFrame::T_MsgError L_decode_result ;
01179 size_t L_ret ;
01180
01181
01182 unsigned char *L_data = m_decode_buffer ;
01183 size_t L_buf_size = m_decode_buffer_size ;
01184
01185
01186 GEN_DEBUG(0, "C_TransIP::decode_from_protocol() start");
01187
01188 L_msg_ctxt.m_channel = P_socket->get_channel_id() ;
01189 L_msg_ctxt.m_response = P_socket->get_id();
01190
01191 while ((L_data_size
01192 = P_socket->received_buffer(L_data,
01193 L_buf_size,
01194 &L_msg_ctxt.m_time)) != 0) {
01195
01196 L_protocol->log_buffer((char*)"received", L_data, L_data_size);
01197
01198
01199 L_session_buf = L_decode -> get_buffer(L_data, &L_data_size);
01200
01201
01202 L_current_data = L_session_buf ;
01203 L_tmp_size = L_data_size ;
01204 L_ret = L_data_size ;
01205
01206 if (L_tmp_size) {
01207
01208 do {
01209
01210
01211 L_decoded_msg
01212 = L_protocol->decode_message (L_current_data,
01213 &L_ret,
01214 &L_decode_result) ;
01215
01216 switch (L_decode_result) {
01217
01218 case C_ProtocolFrame::E_MSG_OK:
01219
01220
01221
01222 L_msg_ctxt.m_msg = L_decoded_msg ;
01223 L_msg_list->push_back(L_msg_ctxt);
01224
01225
01226 L_tmp_size = L_data_size - L_ret ;
01227 if (L_ret != 0) {
01228 L_current_data += L_tmp_size ;
01229 L_data_size -= L_tmp_size ;
01230 }
01231 break ;
01232
01233 case C_ProtocolFrame::E_MSG_ERROR_DECODING_SIZE_LESS:
01234
01235
01236
01237
01238
01239 if (L_decode->set_buffer (L_current_data,
01240 L_data_size) != 0) {
01241 L_decode->reset_buffer() ;
01242 }
01243 L_ret = 0 ;
01244 break ;
01245 default:
01246
01247
01248 LOG_ALL("*** Unrecognized message received ***") ;
01249
01250
01251 L_decode->reset_buffer() ;
01252 L_data_size = 0 ;
01253 L_ret = 0 ;
01254 break ;
01255 }
01256
01257 } while (L_ret != 0) ;
01258
01259 }
01260
01261 }
01262
01263 GEN_DEBUG(0, "C_TransIP::decode_from_protocol() end");
01264 }
01265
01266 bool C_TransIP::get_message (int P_id, T_pReceiveMsgContext P_ctxt) {
01267
01268 T_SocketMap::iterator L_it ;
01269 bool L_ret = false ;
01270 T_pRcvMsgCtxtList L_list ;
01271
01272 GEN_DEBUG(0, "C_TransIP::get_message(" << P_id << ")");
01273
01274 L_it = m_socket_map.find(T_SocketMap::key_type(P_id));
01275 if (L_it != m_socket_map.end()) {
01276 L_list = (L_it->second)->get_list() ;
01277 if (!L_list->empty()) {
01278 *P_ctxt = *L_list->begin() ;
01279 L_ret = true ;
01280 L_list->erase(L_list->begin()) ;
01281 }
01282 } else {
01283 LOG_ALL_P1("transport id: [%d] incorrect", P_id);
01284
01285 }
01286
01287 GEN_DEBUG(0, "C_TransIP::get_message() end with " << L_ret);
01288 return (L_ret);
01289 }
01290
01291
01292
01293 T_pTransport create_cipio_instance () {
01294 T_pC_TransIP L_inst ;
01295 NEW_VAR(L_inst, C_TransIP());
01296 return (L_inst);
01297 }
01298
01299 void delete_cipio_instance (T_ppTransport P_inst) {
01300 if (P_inst != NULL) {
01301 T_pC_TransIP L_inst = (T_pC_TransIP) *P_inst ;
01302 DELETE_VAR(L_inst);
01303 *P_inst = NULL ;
01304 }
01305 }
01306
01307