~sysman-one/starlet/main

« back to all changes in this revision

Viewing changes to utility_routines.c

  • Committer: SysManOne
  • Date: 2021-03-18 07:42:38 UTC
  • Revision ID: git-v1:47ea517d5ab73653512877e006327cb1d01d5661
**      17-MAR-2021     RRL     V.01-01 :  Added a set of routines to mimic to $GETMSG/$PUTMSG service routines.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
#define __MODULE__      "UTIL$"
2
 
#define __IDENT__       "V.01-00"
3
 
#define __REV__         "1.00.0"
 
2
#define __IDENT__       "V.01-01"
 
3
#define __REV__         "1.01.0"
4
4
 
5
5
 
6
6
/*
54
54
**      19-MAR-2020     RRL     Addeв O_APPEND flag in call of open() in the __util$deflog().
55
55
**
56
56
**       7-MAY-2020     RRL     Fixed incorrect value of 'mode' argument of open() under Windows.
 
57
**
 
58
**      17-MAR-2021     RRL     V.01-01 :  Added a set of routines to mimicrate to $GETMSG/$PUTMSG service routines.
 
59
**
57
60
*/
58
61
 
59
62
 
137
140
 
138
141
int     logoutput = STDOUT_FILENO;      /* Default descriptor for default output device         */
139
142
 
140
 
struct sockaddr_in slogsock;    /* SYSLOG Host socket                                   */
 
143
struct sockaddr_in slogsock;            /* SYSLOG Host socket                                   */
141
144
 
142
145
#ifndef WIN32
143
146
 
163
166
#endif  /* ANDROID */
164
167
#endif
165
168
 
 
169
 
 
170
static EMSG_RECORD_DESC *emsg_record_desc_root;                         /* A root to the message records descriptior */
 
171
 
 
172
/*
 
173
 *   DESCRIPTION: Message record compare routine
 
174
 *
 
175
 *   INPUT:
 
176
 *
 
177
 *   OUTPUT:
 
178
 *      NONE
 
179
 *
 
180
 *   RETURNS:
 
181
 *      a - b
 
182
 */
 
183
static int __msgcmp (const void *a, const void *b)
 
184
{
 
185
const EMSG_RECORD *m1 = a, *m2 = b;
 
186
 
 
187
 
 
188
        return  ( (int)m1->sts - (int)m2->sts);
 
189
}
 
190
 
 
191
 
 
192
/*
 
193
 *   DESCRIPTION: Sorting message records according <sts> field as a key,
 
194
 *      link message records descriptor in to the global list.
 
195
 *      This routine is should be called once at task initialization time before any
 
196
 *      consecutive $GETMSG/$PUTMSG calls!
 
197
 *
 
198
 *   IMPLICITE INPUTS:
 
199
 *      emsg_record_desc_root
 
200
 *
 
201
 *   INPUTS:
 
202
 *      msgdsc: Message Records Descriptior
 
203
 *
 
204
 *   OUTPUTS:
 
205
 *      NONE
 
206
 *
 
207
 *   IMPLICITE OUTPUTS:
 
208
 *      msgdsc:
 
209
 *
 
210
 *   RETURNS:
 
211
 *      STS$K_WARN      - non-principal error
 
212
 *      condition code
 
213
 */
 
214
unsigned        __util$inimsg   (EMSG_RECORD_DESC *msgdsc)
 
215
{
 
216
EMSG_RECORD_DESC *md;
 
217
 
 
218
        if ( !msgdsc )
 
219
                return  STS$K_WARN;
 
220
 
 
221
        /* At first level we try to find the message records descriptor by using facility number */
 
222
        for  (md = emsg_record_desc_root; md; md = md->link)
 
223
                if ( md->facno == msgdsc->facno)
 
224
                        return  STS$K_WARN;
 
225
 
 
226
 
 
227
        qsort(msgdsc->msgrec, msgdsc->msgnr, sizeof(EMSG_RECORD), __msgcmp);
 
228
 
 
229
        msgdsc->link = emsg_record_desc_root;
 
230
        emsg_record_desc_root = msgdsc;
 
231
 
 
232
        return  STS$K_SUCCESS;
 
233
}
 
234
 
 
235
 
 
236
/*
 
237
 *   DESCRIPTION: Retreive message record by using message number code.
 
238
 *
 
239
 *   IMPLICITE INPUTS:
 
240
 *      emsg_record_desc_root
 
241
 *
 
242
 *   INPUTS:
 
243
 *      sts:    condition code/message number code
 
244
 *
 
245
 *   OUTPUTS:
 
246
 *      outmsg: A found message record
 
247
 *
 
248
 *   RETURNS:
 
249
 *      STS$K_SUCCESS   - outmsg contains an address of the has been found mssage record
 
250
 *      condition code
 
251
 */
 
252
unsigned        __util$getmsg   (unsigned sts, EMSG_RECORD **outmsg )
 
253
{
 
254
unsigned        facno;
 
255
EMSG_RECORD_DESC *msgdsc;
 
256
EMSG_RECORD *msgrec;
 
257
 
 
258
        /* At first level we try to find the message records descriptor by using facility number */
 
259
        facno = $FAC(sts);
 
260
        for  (msgdsc = emsg_record_desc_root; msgdsc; msgdsc = msgdsc->link)
 
261
                if ( msgdsc->facno == facno)
 
262
                        break;
 
263
 
 
264
        if ( !msgdsc )
 
265
                return  STS$K_ERROR;            /* RNF */
 
266
 
 
267
        /* We found message records descriptor for the facility,
 
268
         * so we can try to find the message record with the given <msgno>
 
269
         */
 
270
        if ( !(msgrec = bsearch(&sts, msgdsc->msgrec, msgdsc->msgnr, sizeof(EMSG_RECORD), __msgcmp)) )
 
271
                return  STS$K_ERROR;            /* RNF */
 
272
 
 
273
        *outmsg = msgrec;
 
274
 
 
275
        return  STS$K_SUCCESS;
 
276
}
 
277
 
 
278
/*
 
279
 *   DESCRIPTION: Format a message to be output on the SYS$OUTPUT by using a format from the message record
 
280
 *
 
281
 *   IMPLICITE INPUTS:
 
282
 *      emsg_record_desc_root
 
283
 *
 
284
 *   INPUTS:
 
285
 *      sts:    condition code/message number code
 
286
 *      ...:    Additional parameters, according the FAO of the message
 
287
 *
 
288
 *   OUTPUTS:
 
289
 *      NONE
 
290
 *
 
291
 *   RETURNS:
 
292
 *      <sts>
 
293
 */
 
294
unsigned        __util$putmsg
 
295
                        (
 
296
                unsigned        sts,
 
297
                        ...
 
298
                        )
 
299
 
 
300
{
 
301
va_list arglist;
 
302
const char lfmt [] = "%02u-%02u-%04u %02u:%02u:%02u.%03u " PID_FMT " ";
 
303
const char defmsgfao[] = {"NONAME-%c-NOMSG, Message number %08X, fac=%#x/%d, sev=%#x/%d, msgno=%#x/%d"};
 
304
const char severity[]= { 'W', 'S', 'E', 'I', 'F', '?', '?', '?'};
 
305
char    pref[128], out[1024];
 
306
unsigned olen, sev;
 
307
struct tm _tm;
 
308
struct timespec now;
 
309
struct iovec iov [3];
 
310
EMSG_RECORD *msgrec;
 
311
 
 
312
        /*
 
313
        ** Out to buffer "DD-MM-YYYY HH:MM:SS.msec <PID/TID> " prefix
 
314
        */
 
315
        ____time(&now);
 
316
 
 
317
#ifdef  WIN32
 
318
        localtime_s(&_tm, (time_t *)&now);
 
319
#else
 
320
        localtime_r((time_t *)&now, &_tm);
 
321
#endif
 
322
 
 
323
        olen = snprintf (pref, sizeof(pref), lfmt,                      /* Format a prefix part of the message: time + PID ... */
 
324
                _tm.tm_mday, _tm.tm_mon + 1, 1900 + _tm.tm_year,
 
325
                _tm.tm_hour, _tm.tm_min, _tm.tm_sec, (unsigned) now.tv_nsec/TIMSPECDEVIDER,
 
326
                (unsigned) gettid());
 
327
 
 
328
        iov[0].iov_base = pref;
 
329
        iov[0].iov_len = olen;
 
330
 
 
331
        if ( 1 & __util$getmsg(sts, &msgrec) )                          /* Retrive the message record */
 
332
                {
 
333
                va_start (arglist, sts);                                /* Fromat text message */
 
334
                olen = vsnprintf(out, sizeof(out), msgrec->text, arglist);
 
335
                va_end (arglist);
 
336
                }
 
337
        else    {                                                       /* Format text message with the default FAO */
 
338
                sev = $SEV(sts);
 
339
                olen = snprintf(out, sizeof(out), defmsgfao, severity[sev], sts,
 
340
                        $FAC(sts), $FAC(sts), sev, sev, $MSG(sts), $MSG(sts));
 
341
                }
 
342
 
 
343
        iov[1].iov_base = out;
 
344
        iov[1].iov_len = olen;
 
345
 
 
346
 
 
347
        /* Add <LF> at end of record*/
 
348
        iov[2].iov_base = "\n";
 
349
        iov[2].iov_len = 1;
 
350
 
 
351
        /* Write to file and flush buffer depending on severity level */
 
352
        writev (logoutput, iov, $ARRSZ(iov) );
 
353
 
 
354
        /* ARL - for android logcat */
 
355
        #ifdef ANDROID
 
356
                __android_log_print(ANDROID_LOG_VERBOSE, fac, "%.*s", olen, out);
 
357
        #endif
 
358
 
 
359
        return  sts;
 
360
}
 
361
 
 
362
 
166
363
/*
167
364
 *
168
365
 *  Description: a simplified analog of the C RTL syslog() routine is supposed to used to
1463
1660
}
1464
1661
 
1465
1662
 
1466
 
 
1467
 
 
1468
 
 
1469
 
 
1470
1663
/*
1471
1664
**  STRSTR/_STRSTR64
1472
1665
**