X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Frmr%2Fcommon%2Fsrc%2Frt_generic_static.c;h=816e18a9b56cc776748b2258b75db18687a9281f;hb=6511ac74cdc367a94bffeb3743624775acd52c5b;hp=7add33ca721a9bf9d5416e431fdd72cb2b7764db;hpb=412d53dfa2f9b5b56a448797d0dfec3b0f11f666;p=ric-plt%2Flib%2Frmr.git diff --git a/src/rmr/common/src/rt_generic_static.c b/src/rmr/common/src/rt_generic_static.c index 7add33c..816e18a 100644 --- a/src/rmr/common/src/rt_generic_static.c +++ b/src/rmr/common/src/rt_generic_static.c @@ -153,6 +153,39 @@ static char* clip( char* buf ) { return buf; } +/* + This accepts a pointer to a nil terminated string, and ensures that there is a + newline as the last character. If there is not, a new buffer is allocated and + the newline is added. If a new buffer is allocated, the buffer passed in is + freed. The function returns a pointer which the caller should use, and must + free. In the event of an error, a nil pointer is returned. +*/ +static char* ensure_nlterm( char* buf ) { + char* nb = NULL; + int len = 1; + + + nb = buf; + if( buf == NULL || (len = strlen( buf )) < 2 ) { + if( (nb = (char *) malloc( sizeof( char ) * 2 )) != NULL ) { + *nb = '\n'; + *(nb+1) = 0; + } + } else { + if( buf[len-1] != '\n' ) { + fprintf( stderr, "[WRN] rmr buf_check: input buffer was not newline terminated (file missing final \\n?)\n" ); + if( (nb = (char *) malloc( sizeof( char ) * (len + 2) )) != NULL ) { + memcpy( nb, buf, len ); + *(nb+len) = '\n'; // insert \n and nil into the two extra bytes we allocated + *(nb+len+1) = 0; + } + + free( buf ); + } + } + + return nb; +} /* Given a message type create a route table entry and add to the hash keyed on the @@ -168,7 +201,7 @@ static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups } if( (rte = (rtable_ent_t *) malloc( sizeof( *rte ) )) == NULL ) { - fprintf( stderr, "rmr_add_rte: malloc failed for entry\n" ); + fprintf( stderr, "[ERR] rmr_add_rte: malloc failed for entry\n" ); return NULL; } memset( rte, 0, sizeof( *rte ) ); @@ -193,7 +226,7 @@ static rtable_ent_t* uta_add_rte( route_table_t* rt, uint64_t key, int nrrgroups rmr_sym_map( rt->hash, key, rte ); // add to hash using numeric mtype as key - if( DEBUG ) fprintf( stderr, "[DBUG] route table entry created: k=%lx groups=%d\n", key, nrrgroups ); + if( DEBUG ) fprintf( stderr, "[DBUG] route table entry created: k=%llx groups=%d\n", (long long) key, nrrgroups ); return rte; } @@ -238,17 +271,20 @@ static void build_entry( uta_ctx_t* ctx, char* ts_field, uint32_t subid, char* r rte = uta_add_rte( ctx->new_rtable, key, ngtoks ); // get/create entry for this key for( grp = 0; grp < ngtoks; grp++ ) { - if( (ntoks = uta_tokenise( gtokens[grp], tokens, 64, ',' )) > 0 ) { + if( (ntoks = uta_rmip_tokenise( gtokens[grp], ctx->ip_list, tokens, 64, ',' )) > 0 ) { // remove any referneces to our ip addrs for( i = 0; i < ntoks; i++ ) { - if( DEBUG > 1 || (vlevel > 1)) fprintf( stderr, "[DBUG] add endpoint %s\n", ts_field ); - uta_add_ep( ctx->new_rtable, rte, tokens[i], grp ); + if( strcmp( tokens[i], ctx->my_name ) != 0 ) { // don't add if it is us -- cannot send to ourself + if( DEBUG > 1 || (vlevel > 1)) fprintf( stderr, "[DBUG] add endpoint ts=%s %s\n", ts_field, tokens[i] ); + uta_add_ep( ctx->new_rtable, rte, tokens[i], grp ); + } } } } } } else { - if( DEBUG || (vlevel > 2) ) + if( DEBUG || (vlevel > 2) ) { fprintf( stderr, "entry not included, sender not matched: %s\n", tokens[1] ); + } } } @@ -489,22 +525,33 @@ static void read_static_rt( uta_ctx_t* ctx, int vlevel ) { return; } - if( (fbuf = uta_fib( fname ) ) == NULL ) { // read file into a single buffer - fprintf( stderr, "[WRN] seed route table could not be opened: %s: %s\n", fname, strerror( errno ) ); + if( (fbuf = ensure_nlterm( uta_fib( fname ) ) ) == NULL ) { // read file into a single buffer (nil terminated string) + fprintf( stderr, "[WRN] rmr read_static: seed route table could not be opened: %s: %s\n", fname, strerror( errno ) ); return; } - if( DEBUG ) fprintf( stderr, "[INFO] seed route table successfully opened: %s\n", fname ); + if( DEBUG ) fprintf( stderr, "[DBUG] rmr: seed route table successfully opened: %s\n", fname ); + for( eor = fbuf; *eor; eor++ ) { // fix broken systems that use \r or \r\n to terminate records + if( *eor == '\r' ) { + *eor = '\n'; // will look like a blank line which is ok + } + } + for( rec = fbuf; rec && *rec; rec = eor+1 ) { rcount++; if( (eor = strchr( rec, '\n' )) != NULL ) { *eor = 0; + } else { + fprintf( stderr, "[WRN] rmr read_static: seed route table had malformed records (missing newline): %s\n", fname ); + fprintf( stderr, "[WRN] rmr read_static: seed route table not used: %s\n", fname ); + free( fbuf ); + return; } parse_rt_rec( ctx, rec, vlevel ); } - if( DEBUG ) fprintf( stderr, "[INFO] seed route table successfully parsed: %d records\n", rcount ); + if( DEBUG ) fprintf( stderr, "[DBUG] rmr: seed route table successfully parsed: %d records\n", rcount ); free( fbuf ); } @@ -801,14 +848,14 @@ static endpoint_t* rt_ensure_ep( route_table_t* rt, char const* ep_name ) { endpoint_t* ep; if( !rt || !ep_name || ! *ep_name ) { - fprintf( stderr, "[WARN] rmr: rt_ensure: internal mishap, something undefined rt=%p ep_name=%p\n", rt, ep_name ); + fprintf( stderr, "[WRN] rmr: rt_ensure: internal mishap, something undefined rt=%p ep_name=%p\n", rt, ep_name ); errno = EINVAL; return NULL; } if( (ep = uta_get_ep( rt, ep_name )) == NULL ) { // not there yet, make if( (ep = (endpoint_t *) malloc( sizeof( *ep ) )) == NULL ) { - fprintf( stderr, "[WARN] rmr: rt_ensure: malloc failed for endpoint creation: %s\n", ep_name ); + fprintf( stderr, "[WRN] rmr: rt_ensure: malloc failed for endpoint creation: %s\n", ep_name ); errno = ENOMEM; return NULL; }