// 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 disable extended headers expectation 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 = 1; // -e is on command line turns this off, by default 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 = 0; 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" ); }