diff --git a/thirdparty/EVPath/EVPath/CMakeLists.txt b/thirdparty/EVPath/EVPath/CMakeLists.txt index 35ef33bc05..b5f8111c06 100644 --- a/thirdparty/EVPath/EVPath/CMakeLists.txt +++ b/thirdparty/EVPath/EVPath/CMakeLists.txt @@ -201,7 +201,7 @@ cmake_dependent_option(EVPATH_TRANSPORT_MODULES list(INSERT CMAKE_PREFIX_PATH 0 ${CMAKE_INSTALL_PREFIX}) find_package(atl 2.2.1 REQUIRED) -find_package(ffs 1.5.1 REQUIRED) +find_package(ffs 2.0.0 REQUIRED) _pkg_get_target_prefix(atl::atl atl_PREFIX) _pkg_get_target_prefix(ffs::ffs ffs_PREFIX) list(APPEND _pkg_config_pfxs "${atl_PREFIX}" "${ffs_PREFIX}") diff --git a/thirdparty/EVPath/EVPath/cm.c b/thirdparty/EVPath/EVPath/cm.c index 4430c8cb8b..2e50831ca1 100644 --- a/thirdparty/EVPath/EVPath/cm.c +++ b/thirdparty/EVPath/EVPath/cm.c @@ -2284,6 +2284,11 @@ timeout_conn(CManager cm, void *client_data) byte_swap = 1; case 0x004d4400: /* CMD\0 */ break; + case 0x00444d01: /* \1DMC reversed byte order long msg*/ + byte_swap = 1; + case 0x004d4401: /* CMD\1 long msg*/ + short_length = 0; + break; case 0x00414d00: /* \0AMC reversed byte order */ byte_swap = 1; case 0x004d4100: /* CMA\0 */ @@ -2357,6 +2362,9 @@ timeout_conn(CManager cm, void *client_data) } else { header_len = 16; } + if (!short_length) { + header_len += 4; /* extra data length bytes */ + } } else { if (short_length) { header_len = 8; /* magic plus 4-byte size */ @@ -2446,13 +2454,25 @@ timeout_conn(CManager cm, void *client_data) data_length -= 8; /* subtract off header size */ } if (event_msg) { - if (byte_swap) { - ((char*)&stone_id)[0] = base[11]; - ((char*)&stone_id)[1] = base[10]; - ((char*)&stone_id)[2] = base[9]; - ((char*)&stone_id)[3] = base[8]; - } else { - stone_id = ((int *) base)[2]; + char *stone_base = base; + if (header_len == 16) { + if (byte_swap) { + ((char*)&stone_id)[0] = stone_base[11]; + ((char*)&stone_id)[1] = stone_base[10]; + ((char*)&stone_id)[2] = stone_base[9]; + ((char*)&stone_id)[3] = stone_base[8]; + } else { + stone_id = ((int *) stone_base)[2]; + } + } else if (header_len == 20) { + if (byte_swap) { + ((char*)&stone_id)[0] = stone_base[15]; + ((char*)&stone_id)[1] = stone_base[14]; + ((char*)&stone_id)[2] = stone_base[13]; + ((char*)&stone_id)[3] = stone_base[12]; + } else { + stone_id = ((int *) stone_base)[3]; + } } } @@ -2698,28 +2718,33 @@ timeout_conn(CManager cm, void *client_data) cm_return_data_buf(cm, buf); } - void - INT_CMregister_handler(CMFormat format, CMHandlerFunc handler, - void *client_data) - { - CManager cm = format->cm; - int i; - format->handler = handler; - format->client_data = client_data; +void +INT_CMregister_handler(CMFormat format, CMHandlerFunc handler, + void *client_data) +{ + CManager cm = format->cm; + int i; + format->handler = handler; + format->client_data = client_data; - for (i=0; i< cm->in_format_count; i++) { - if (cm->in_formats[i].format == format->ffsformat) { - if (!cm->in_formats[i].handler) { - cm->in_formats[i].handler = handler; - cm->in_formats[i].client_data = client_data; - } else if ((cm->in_formats[i].handler != handler) || - (cm->in_formats[i].client_data != client_data)) { - fprintf(stderr, "Warning, CMregister_handler() called multiple times for the same format with different handler or client_data\n"); - fprintf(stderr, "Repeated calls will be ignored\n"); - } - } - } - } + for (i=0; i< cm->in_format_count; i++) { + if (strcmp(name_of_FMformat(FMFormat_of_original(cm->in_formats[i].format)), format->format_name) == 0) { + if (format->registration_pending) { + CMcomplete_format_registration(format, 1); + } + if (cm->in_formats[i].format == format->ffsformat) { + if (!cm->in_formats[i].handler) { + cm->in_formats[i].handler = handler; + cm->in_formats[i].client_data = client_data; + } else if ((cm->in_formats[i].handler != handler) || + (cm->in_formats[i].client_data != client_data)) { + fprintf(stderr, "Warning, CMregister_handler() called multiple times for the same format with different handler or client_data\n"); + fprintf(stderr, "Repeated calls will be ignored\n"); + } + } + } + } +} extern void INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) @@ -3202,14 +3227,18 @@ INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) INT_CMwrite_attr(CMConnection conn, CMFormat format, void *data, attr_list attrs) { - /* GSE MUST FIX for LONG */ + void *header_ptr = NULL; + int header_len = 0; int no_attr_header[2] = {0x434d4400, 0}; /* CMD\0 in first entry */ - int attr_header[4] = {0x434d4100, 0x434d4100, 0, 0}; /* CMA\0 in first entry */ + int no_attr_long_header[4] = {0x434d4401, 0x434d4401, 0, 0}; /* CMD\1 in first entry, pad to 16 */ + int attr_header[4] = {0x434d4100, 0x434d4100, 0, 0}; /* CMA\0 in first entry, pad to 16 */ + int attr_long_header[4] = {0x434d4101, 0, 0, 0}; /* CMA\1 in first entry */ FFSEncodeVector vec; size_t length = 0, vec_count = 0, actual; int do_write = 1; void *encoded_attrs = NULL; int attrs_present = 0; + int long_message = 0; CManager cm = conn->cm; /* ensure conn is open */ @@ -3279,13 +3308,38 @@ INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) length += vec[vec_count].iov_len; vec_count++; } - no_attr_header[1] = length; - attr_header[2] = length; + if ((length & 0x7fffffff) == 0) { + long_message = 1; + } if (attrs != NULL) { attrs_present++; + } + if (!long_message) { + if (attrs_present) { + attr_header[2] = length; + header_ptr = &attr_header; + header_len = sizeof(attr_header); + } else { + no_attr_header[1] = length; + header_ptr = &no_attr_header; + header_len = sizeof(no_attr_header); + } + } else { + if (attrs_present) { + memcpy((void*) &attr_long_header[1], &length, sizeof(length)); + header_ptr = &attr_long_header; + header_len = sizeof(attr_long_header); + } else { + memcpy((void*) &attr_long_header[2], &length, sizeof(length)); + header_ptr = no_attr_header; + header_len = sizeof(no_attr_header); + } + } + if (attrs_present) { encoded_attrs = encode_attr_for_xmit(attrs, conn->attr_encode_buffer, &attr_header[3]); attr_header[3] = (attr_header[3] +7) & -8; /* round up to even 8 */ + attr_long_header[3] = (attr_header[3] +7) & -8; /* round up to even 8 */ } CMtrace_out(conn->cm, CMDataVerbose, "CM - Total write size is %zu bytes data + %d bytes attrs\n", length, attr_header[3]); if (cm_write_hook != NULL) { @@ -3298,9 +3352,9 @@ INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) if (vec_count >= sizeof(static_vec)/ sizeof(static_vec[0])) { tmp_vec = INT_CMmalloc((vec_count+1) * sizeof(*tmp_vec)); } + tmp_vec[0].iov_base = header_ptr; + tmp_vec[0].iov_len = header_len; if (attrs == NULL) { - tmp_vec[0].iov_base = &no_attr_header; - tmp_vec[0].iov_len = sizeof(no_attr_header); memcpy(&tmp_vec[1], vec, sizeof(*tmp_vec) * vec_count); vec_count++; byte_count += sizeof(no_attr_header); @@ -3308,8 +3362,6 @@ INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) "Writing %zu vectors, total %zu bytes in writev\n", vec_count, byte_count); } else { - tmp_vec[0].iov_base = &attr_header; - tmp_vec[0].iov_len = sizeof(attr_header); tmp_vec[1].iov_base = encoded_attrs; tmp_vec[1].iov_len = attr_header[3]; memcpy(&tmp_vec[2], vec, sizeof(*tmp_vec) * vec_count); @@ -3483,6 +3535,7 @@ INT_CMregister_invalid_message_handler(CManager cm, CMUnregCMHandler handler) "Writing %zu vectors, total %zu bytes (including attrs) in writev\n", vec_count, byte_count); } + char *header_ptr = (char*)&header[0]; actual = INT_CMwrite_raw(conn, tmp_vec, vec, vec_count, byte_count, attrs, vec == &preencoded_vec[0]); if (tmp_vec != &static_vec[0]) { diff --git a/thirdparty/EVPath/EVPath/cmfabric.c b/thirdparty/EVPath/EVPath/cmfabric.c index c17a7c0632..1fc51d6478 100644 --- a/thirdparty/EVPath/EVPath/cmfabric.c +++ b/thirdparty/EVPath/EVPath/cmfabric.c @@ -2263,7 +2263,7 @@ libcmfabric_LTX_non_blocking_listen(CManager cm, CMtrans_services svc, transport #ifdef NEED_IOVEC_DEFINE struct iovec { void *iov_base; - int iov_len; + size_t iov_len; }; #endif diff --git a/thirdparty/EVPath/EVPath/cmib.c b/thirdparty/EVPath/EVPath/cmib.c index 40d4b65416..d9f9b0c922 100644 --- a/thirdparty/EVPath/EVPath/cmib.c +++ b/thirdparty/EVPath/EVPath/cmib.c @@ -1707,7 +1707,7 @@ attr_list listen_info; #ifdef NEED_IOVEC_DEFINE struct iovec { void *iov_base; - int iov_len; + long iov_len; }; #endif diff --git a/thirdparty/EVPath/EVPath/cmmulticast.c b/thirdparty/EVPath/EVPath/cmmulticast.c index b4d12d2500..d80b4bfb3b 100644 --- a/thirdparty/EVPath/EVPath/cmmulticast.c +++ b/thirdparty/EVPath/EVPath/cmmulticast.c @@ -393,7 +393,7 @@ attr_list listen_info; #ifdef NEED_IOVEC_DEFINE struct iovec { void *iov_base; - int iov_len; + size_t iov_len; }; #endif diff --git a/thirdparty/EVPath/EVPath/cmnnti.c b/thirdparty/EVPath/EVPath/cmnnti.c index 4997bed792..1c9172ca12 100644 --- a/thirdparty/EVPath/EVPath/cmnnti.c +++ b/thirdparty/EVPath/EVPath/cmnnti.c @@ -1437,7 +1437,7 @@ attr_list listen_info; #ifdef NEED_IOVEC_DEFINE struct iovec { void *iov_base; - int iov_len; + long iov_len; }; #endif diff --git a/thirdparty/EVPath/EVPath/cmsockets.c b/thirdparty/EVPath/EVPath/cmsockets.c index e7b32dcdae..14a7452137 100644 --- a/thirdparty/EVPath/EVPath/cmsockets.c +++ b/thirdparty/EVPath/EVPath/cmsockets.c @@ -857,7 +857,7 @@ attr_list listen_info; #ifdef NEED_IOVEC_DEFINE struct iovec { void *iov_base; - int iov_len; + size_t iov_len; }; #endif @@ -912,10 +912,10 @@ libcmsockets_LTX_read_to_buffer_func(svc, scd, buffer, requested_len, CMtrans_services svc; socket_conn_data_ptr scd; void *buffer; -int requested_len; +ssize_t requested_len; int non_blocking; { - int left, iget; + ssize_t left, iget; int fdflags = fcntl(scd->fd, F_GETFL, 0); if (fdflags == -1) { @@ -927,7 +927,7 @@ int non_blocking; } else { svc->trace_out(scd->sd->cm, "CMSocket fd %d state nonblock", scd->fd); } - svc->trace_out(scd->sd->cm, "CMSocket read of %d bytes on fd %d, non_block %d", requested_len, + svc->trace_out(scd->sd->cm, "CMSocket read of %zd bytes on fd %d, non_block %d", requested_len, scd->fd, non_blocking); if (non_blocking && (scd->block_state == Block)) { svc->trace_out(scd->sd->cm, "CMSocket switch to non-blocking fd %d", @@ -993,20 +993,25 @@ int non_blocking; #ifndef HAVE_WRITEV static -int +ssize_t writev(fd, iov, iovcnt) int fd; struct iovec *iov; int iovcnt; { - int wrote = 0; + ssize_t wrote = 0; int i; + printf("tmp Writev iovcnt %d\n", iovcnt); for (i = 0; i < iovcnt; i++) { - int left = iov[i].iov_len; - int iget = 0; + size_t left = iov[i].iov_len; + ssize_t iget = 0; + printf("Writing block[%d] of len %zu, startig at %p\n", i, left, iov[i].iov_base); while (left > 0) { - iget = write(fd, (char *) iov[i].iov_base + iov[i].iov_len - left, left); + errno = 0; + size_t this_write = left; + char *this_base = iov[i].iov_base + iov[i].iov_len - left; + iget = write(fd, this_base, this_write); if (iget == -1) { int lerrno = errno; if ((lerrno != EWOULDBLOCK) && @@ -1015,10 +1020,6 @@ int iovcnt; /* serious error */ return -1; } else { - if (lerrno == EWOULDBLOCK) { - printf("CMSockets write Would block, fd %d, length %d", - fd, left); - } iget = 0; } } @@ -1030,6 +1031,20 @@ int iovcnt; } #endif +int long_writev(svc, scd, iovs, iovcnt) +CMtrans_services svc; +socket_conn_data_ptr scd; +void *iovs; +int iovcnt; +{ + assert(0); // for right now, don't try this +} + +#ifndef MAX_RW_COUNT +// Not actually defined outside the kernel as far as I know - GSE +#define MAX_RW_COUNT 0x7ffff000 +#endif + extern int libcmsockets_LTX_writev_func(svc, scd, iovs, iovcnt, attrs) CMtrans_services svc; @@ -1039,19 +1054,25 @@ int iovcnt; attr_list attrs; { int fd = scd->fd; - int left = 0; - int iget = 0; - int iovleft, i; + ssize_t left = 0; + ssize_t iget = 0; + ssize_t iovleft, i; iovleft = iovcnt; struct iovec * iov = (struct iovec*) iovs; /* sum lengths */ - for (i = 0; i < iovcnt; i++) + for (i = 0; i < iovcnt; i++) { left += iov[i].iov_len; + } - svc->trace_out(scd->sd->cm, "CMSocket writev of %d bytes on fd %d", + svc->trace_out(scd->sd->cm, "CMSocket writev of %zd bytes on fd %d", left, fd); + if (left > MAX_RW_COUNT) { + // more to write than unix lets us do in one call + return long_writev(svc, scd, iovs, iovcnt); + } + while (left > 0) { - int write_count = iovleft; + size_t write_count = iovleft; if (write_count > IOV_MAX) write_count = IOV_MAX; iget = writev(fd, (struct iovec *) &iov[iovcnt - iovleft], @@ -1108,9 +1129,9 @@ int iovcnt; attr_list attrs; { int fd = scd->fd; - int init_bytes, left = 0; - int iget = 0; - int iovleft, i; + ssize_t init_bytes, left = 0; + ssize_t iget = 0; + ssize_t iovleft, i; struct iovec * iov = (struct iovec*) iovs; iovleft = iovcnt; @@ -1120,12 +1141,12 @@ attr_list attrs; init_bytes = left; - svc->trace_out(scd->sd->cm, "CMSocket Non-blocking writev of %d bytes on fd %d", + svc->trace_out(scd->sd->cm, "CMSocket Non-blocking writev of %zd bytes on fd %d", left, fd); set_block_state(svc, scd, Non_Block); while (left > 0) { - int write_count = iovleft; - int this_write_bytes = 0; + ssize_t write_count = iovleft; + ssize_t this_write_bytes = 0; if (write_count > IOV_MAX) write_count = IOV_MAX; for (i = 0; i < write_count; i++) diff --git a/thirdparty/EVPath/EVPath/cmudt4.cpp b/thirdparty/EVPath/EVPath/cmudt4.cpp index abf50ca324..a3d493b48d 100644 --- a/thirdparty/EVPath/EVPath/cmudt4.cpp +++ b/thirdparty/EVPath/EVPath/cmudt4.cpp @@ -767,7 +767,7 @@ libcmudt4_LTX_non_blocking_listen(CManager cm, CMtrans_services svc, struct iovec { void *iov_base; - int iov_len; + long iov_len; }; #endif diff --git a/thirdparty/EVPath/EVPath/ev_internal.h b/thirdparty/EVPath/EVPath/ev_internal.h index 45edda64a6..c2218e4a01 100644 --- a/thirdparty/EVPath/EVPath/ev_internal.h +++ b/thirdparty/EVPath/EVPath/ev_internal.h @@ -8,7 +8,7 @@ typedef struct _event_item { int event_encoded; event_pkg_contents contents; void *encoded_event; - int event_len; + size_t event_len; void *decoded_event; FFSEncodeVector encoded_eventv; FMFormat reference_format; @@ -207,8 +207,9 @@ typedef struct extern_entry { void *extern_value; } cod_extern_entry; #define COD_EXTERN_ENTRY_DEFINED -#endif +#else typedef struct extern_entry cod_extern_entry; +#endif typedef struct _extern_routine_struct { char *extern_decl; cod_extern_entry *externs; diff --git a/thirdparty/EVPath/EVPath/mtests/bulktest.c b/thirdparty/EVPath/EVPath/mtests/bulktest.c index eb07919c6a..23c151edec 100644 --- a/thirdparty/EVPath/EVPath/mtests/bulktest.c +++ b/thirdparty/EVPath/EVPath/mtests/bulktest.c @@ -50,7 +50,7 @@ typedef struct _simple_rec { double double_field; char char_field; int scan_sum; - int vec_count; + size_t vec_count; FFSEncodeVector vecs; } simple_rec, *simple_rec_ptr; @@ -79,7 +79,7 @@ static FMField simple_field_list[] = {"scan_sum", "integer", sizeof(int), FMOffset(simple_rec_ptr, scan_sum)}, {"vec_count", "integer", - sizeof(int), FMOffset(simple_rec_ptr, vec_count)}, + sizeof(size_t), FMOffset(simple_rec_ptr, vec_count)}, {"vecs", "EventVecElem[vec_count]", sizeof(struct FFSEncodeVec), FMOffset(simple_rec_ptr, vecs)}, {NULL, NULL, 0, 0}, @@ -103,7 +103,7 @@ static FMStructDescRec simple_format_list[] = {NULL, NULL} }; -static int size = 400; +static size_t size = 400; static int vecs = 20; int quiet = 1; @@ -137,7 +137,7 @@ generate_record(simple_rec_ptr event) event->vec_count = vecs; event->vecs = malloc(sizeof(event->vecs[0]) * vecs); memset(event->vecs, 0, sizeof(event->vecs[0]) * vecs); - if (quiet <= 0) printf("Sending %d vecs of size %d\n", vecs, size/vecs); + if (quiet <= 0) printf("Sending %d vecs of size %zu\n", vecs, (size_t)size/vecs); for (i=0; i < vecs; i++) { event->vecs[i].iov_len = size/vecs; event->vecs[i].iov_base = malloc(event->vecs[i].iov_len); @@ -196,6 +196,10 @@ simple_handler(CManager cm, CMConnection conn, void *vevent, void *client_data, printf(" long_field = %ld\n", event->long_field); printf(" double_field = %g\n", event->double_field); printf(" char_field = %c\n", event->char_field); + printf(" Vec_count = %zu\n", event->vec_count); + if (event->vec_count >= 1) { + printf(" Vec size = %zu\n", event->vecs[0].iov_len); + } printf("Data was received with attributes : \n"); dump_attr_list(attrs); } @@ -219,7 +223,7 @@ static atom_t CM_TRANSPORT; static char *transport; #define PARSE_EXTRA_ARGS } else if (strcmp(&argv[1][1], "size") == 0) {\ - if (sscanf(argv[2], "%d", &size) != 1) {\ + if (sscanf(argv[2], "%zu", &size) != 1) {\ printf("Unparseable argument to -size, %s\n", argv[2]);\ }\ if (vecs == 0) { vecs = 1; printf("vecs not 1\n");}\ @@ -387,7 +391,7 @@ do_regression_master_test() string_list = attr_list_to_string(contact_list); free_attr_list(contact_list); args[2] = "-size"; - sprintf(&size_str[0], "%d", size); + sprintf(&size_str[0], "%zu", size); args[3] = size_str; args[4] = "-vecs"; sprintf(&vec_str[0], "%d", vecs);