X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Fsidecars%2Flistener%2Fpipe_reader.c;fp=src%2Fsidecars%2Flistener%2Fpipe_reader.c;h=58a11fff7ab172e26b6d537e563b6f3dc234d546;hb=5f75c08e01fa73a8f54dd0d474c0a50b8dd23845;hp=0000000000000000000000000000000000000000;hpb=59f84608ec15c016958a6e0e0ddd813f376c0925;p=ric-app%2Fmc.git diff --git a/src/sidecars/listener/pipe_reader.c b/src/sidecars/listener/pipe_reader.c new file mode 100644 index 0000000..58a11ff --- /dev/null +++ b/src/sidecars/listener/pipe_reader.c @@ -0,0 +1,152 @@ +// vim: ts=4 sw=4 noet: +/* +-------------------------------------------------------------------------------- + Copyright (c) 2018-2019 AT&T Intellectual Property. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +-------------------------------------------------------------------------------- +*/ + +/* + Mnemonic: pipe_reader.c + Abstract: Read a single pipe which was associated with a message type. This + programme is primarily for verification or example of how to use the + read1() function in the mc-listener library. + + Date: 22 August 2019 + Author: E. Scott Daniels +*/ + +#include +#include +#include +#include +#include +#include + + +#include "mcl.h" + +//---- support ----------------------------------------------------------------------------- + +static void bad_arg( char* what ) { + fprintf( stderr, "[ERR] option is unrecognised or isn't followed by meaningful data: %s\n", what ); +} + +static void usage( char* argv0 ) { + fprintf( stderr, "usage: %s [-d fifo-dir] [-e] [-m msg-type] [-s]\n", argv0 ); + fprintf( stderr, " -d dir (default is /tmp/mcl/fifos)\n" ); + fprintf( stderr, " -e extended headers expected in FIFO data\n" ); + fprintf( stderr, " -m msg-type (default is 0)\n" ); + fprintf( stderr, " -s stats only mode\n" ); +} + +//------------------------------------------------------------------------------------------ +int main( int argc, char** argv ) { + void* ctx; // the mc listener library context + char* dname = "/tmp/mcl/fifos"; // default directory where we open fifos + int pidx = 1; // parameter index + int error = 0; + int len; + int mtype = 0; + char buf[4096]; + int flush_often = 0; + int long_hdrs = 0; // if -e is on command line, we expect long headers + int stats_only = 0; + char timestamp[MCL_TSTAMP_SIZE]; // we'll get the timestamp from this + long count = 0; + int blabber = 0; + + while( pidx < argc && argv[pidx][0] == '-' ) { // simple argument parsing (-x or -x value) + switch( argv[pidx][1] ) { + case 'd': + if( pidx+1 < argc ) { + dname = strdup( argv[pidx+1] ); + pidx++; + } else { + bad_arg( argv[pidx] ); + error = 1; + } + break; + + case 'e': + long_hdrs = 1; + break; + + case 'f': + flush_often = 1; + break; + + case 'm': + if( pidx+1 < argc ) { + mtype = atoi( argv[pidx+1] ); + pidx++; + } else { + bad_arg( argv[pidx] ); + error = 1; + } + break; + + case 's': + stats_only = 1; + break; + + case 'h': + case '?': + usage( argv[0] ); + exit( 0 ); + break; + + default: + bad_arg( argv[pidx] ); + error = 1; + break; + } + + pidx++; + } + + if( error ) { + usage( argv[0] ); + exit( 1 ); + } + + ctx = mcl_mk_context( dname ); // initialise the library context + if( ctx == NULL ) { + fprintf( stderr, "[FAIL] couldn't initialise the mc listener library" ); + exit( 1 ); + } + + while( 1 ) { + len = mcl_fifo_tsread1( ctx, mtype, buf, sizeof( buf ) -1, long_hdrs, timestamp ); + if( len > 0 ) { + if( stats_only ) { + if( time( NULL ) > blabber ) { + fprintf( stdout, "[%d] %ld messages received\n", mtype, count ); + blabber = time( NULL ) + 2; + } + } else { + buf[len] = 0; + fprintf( stdout, "[%d] ts=%s count=%ld len=%d msg=%s\n", mtype, timestamp, count, len, buf ); + if( flush_often ) { + fflush( stdout ); + } + } + + count++; + } + } + + fprintf( stderr, "[INFO] mc listener is finished.\n" ); +} +