Address sonar complaints about the listener
[ric-app/mc.git] / sidecars / listener / src / pipe_reader.c
1 // vim: ts=4 sw=4 noet:
2 /*
3 --------------------------------------------------------------------------------
4         Copyright (c) 2018-2019 AT&T Intellectual Property.
5
6    Licensed under the Apache License, Version 2.0 (the "License");
7    you may not use this file except in compliance with the License.
8    You may obtain a copy of the License at
9
10            http://www.apache.org/licenses/LICENSE-2.0
11
12    Unless required by applicable law or agreed to in writing, software
13    distributed under the License is distributed on an "AS IS" BASIS,
14    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15    See the License for the specific language governing permissions and
16    limitations under the License.
17 --------------------------------------------------------------------------------
18 */
19
20 /*
21         Mnemonic:       pipe_reader.c
22         Abstract:       Read a single pipe which was associated with a message type.  This
23                                 programme is primarily for verification or example of how to use the
24                                 read1() function in the mc-listener library.
25
26         Date:           22 August 2019
27         Author:         E. Scott Daniels
28 */
29
30 #include <unistd.h>
31 #include <errno.h>
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <time.h>
35 #include <string.h>
36 #include <signal.h>
37
38
39 #include "mcl.h"
40
41 //---- support -----------------------------------------------------------------------------
42
43 static void bad_arg( char* what ) {
44         fprintf( stderr, "[ERR] option is unrecognised or isn't followed by meaningful data: %s\n", what );
45 }
46
47 static void usage( char* argv0 ) {
48         fprintf( stderr, "usage: %s [-d fifo-dir] [-e] [-m msg-type] [-s]\n", argv0 );
49         fprintf( stderr, "   -d  dir (default is /tmp/mcl/fifos)\n" );
50         fprintf( stderr, "   -e  disable extended headers expectation in FIFO data\n" );
51         fprintf( stderr, "   -m  msg-type (default is 0)\n" );
52         fprintf( stderr, "   -s  stats only mode\n" );
53 }
54
55 /*
56         We exit on any trapped signal so that we can kill  -15 the proecss
57         and still get gcoverage information to keep sonar happy.
58 */
59 static void sigh( int sig ) {
60         fprintf( stderr, "\n[INFO] exiting on signal %d\n", sig );
61         exit( 0 );
62 }
63
64 //------------------------------------------------------------------------------------------
65 int main( int argc,  char** argv ) {
66         void*   ctx;                                                    // the mc listener library context
67         char*   dname = "/tmp/mcl/fifos";               // default directory where we open fifos
68         int             pidx = 1;                                               // parameter index
69         int             error = 0;
70         int             len;
71         int             mtype = 0;
72         char    buf[4096];
73         int             flush_often = 0;
74         int             long_hdrs = 1;                                  // -e is on command line turns this off, by default we expect long headers
75         int             stats_only = 0;
76         char    timestamp[MCL_TSTAMP_SIZE];             // we'll get the timestamp from this
77         long    count = 0;
78         int             blabber = 0;
79
80         signal( SIGINT, sigh );
81         signal( SIGTERM, sigh );
82
83         while( pidx < argc && argv[pidx][0] == '-' ) {                  // simple argument parsing (-x  or -x value)
84                 switch( argv[pidx][1] ) {
85                         case 'd':
86                                 if( pidx+1 < argc ) {
87                                         dname = strdup( argv[pidx+1] );
88                                         pidx++;
89                                 } else {
90                                         bad_arg( argv[pidx] );
91                                         error = 1;
92                                 }
93                                 break;
94
95                         case 'e':
96                                 long_hdrs = 0;
97                                 break;
98
99                         case 'f':
100                                 flush_often = 1;
101                                 break;
102
103                         case 'm':
104                                 if( pidx+1 < argc ) {
105                                         mtype = atoi( argv[pidx+1] );
106                                         pidx++;
107                                 } else {
108                                         bad_arg( argv[pidx] );
109                                         error = 1;
110                                 }
111                                 break;
112
113                         case 's':
114                                 stats_only = 1;
115                                 break;
116
117                         case 'h':
118                         case '?':
119                                 usage( argv[0] );
120                                 exit( 0 );
121
122                         default:
123                                 bad_arg( argv[pidx] );
124                                 error = 1;
125                                 break;
126                 }
127
128                 pidx++;
129         }
130
131         if( error ) {
132                 usage( argv[0] );
133                 exit( 1 );
134         }
135
136         ctx = mcl_mk_context( dname );                  // initialise the library context
137         if( ctx == NULL ) {
138                 fprintf( stderr, "[FAIL] couldn't initialise the mc listener library" );
139                 exit( 1 );
140         }
141
142         while( 1 ) {
143                 len = mcl_fifo_tsread1( ctx, mtype, buf, sizeof( buf ) -1, long_hdrs, timestamp );
144                 if( len > 0 ) {
145                         if( stats_only ) {
146                                 if( time( NULL ) > blabber ) {
147                                         fprintf( stdout, "[%d] %ld messages received\n", mtype, count );
148                                         blabber = time( NULL ) + 2;
149                                 }
150                         } else {
151                                 buf[len] = 0;
152                                 fprintf( stdout, "[%d] ts=%s count=%ld len=%d  msg=%s\n",  mtype, timestamp,  count, len, buf );
153                                 if( flush_often ) {
154                                         fflush( stdout );
155                                 }
156                         }
157
158                         count++;
159                 }
160         }
161 }
162