0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #include <ndrx_config.h>
0037 #include <string.h>
0038 #include <stdio.h>
0039 #include <stdlib.h>
0040 #include <memory.h>
0041 #include <time.h>
0042 #include <sys/time.h>
0043 #include <unistd.h>
0044 #include <stdarg.h>
0045
0046 #include <ndrstandard.h>
0047 #include <ndebug.h>
0048 #include <nstdutil.h>
0049 #include <sys_unix.h>
0050 #include <userlog.h>
0051 #include <nstd_tls.h>
0052 #include <errno.h>
0053 #include <nstd_int.h>
0054
0055 #include "atmi_tls.h"
0056
0057
0058 #define API_ENTRY {_Nunset_error();}
0059
0060
0061
0062
0063
0064 #define LOGGER_MAP { \
0065 {&G_nstd_tls->requestlog_tp, &G_nstd_tls->threadlog_tp, &G_tp_debug} \
0066 ,{&G_nstd_tls->requestlog_ndrx, &G_nstd_tls->threadlog_ndrx, &G_ndrx_debug} \
0067 ,{&G_nstd_tls->requestlog_ubf, &G_nstd_tls->threadlog_ubf, &G_ubf_debug} \
0068 }
0069
0070
0071
0072
0073
0074 #define LOGGER_SAVE_FIELDS_DEF \
0075 char sav_code; \
0076 long sav_flags; \
0077 char sav_module[NDRX_LOG_MODULE_LEN+1];
0078
0079
0080
0081
0082 #define LOGGER_SAVE_FIELDS(LOGGERPTR) \
0083 sav_code = LOGGERPTR->code; \
0084 sav_flags = LOGGERPTR->flags; \
0085 NDRX_STRCPY_SAFE(sav_module, LOGGERPTR->module);
0086
0087
0088
0089
0090 #define LOGGER_RESTORE_FIELDS(LOGGERPTR) \
0091 LOGGERPTR->code = sav_code; \
0092 LOGGERPTR->flags = sav_flags; \
0093 NDRX_STRCPY_SAFE(LOGGERPTR->module, sav_module);
0094
0095
0096
0097
0098
0099
0100
0101 typedef struct
0102 {
0103 ndrx_debug_t *req;
0104 ndrx_debug_t *th;
0105 ndrx_debug_t *proc;
0106 } debug_map_t;
0107
0108
0109
0110 exprivate MUTEX_LOCKDECL(M_proc_lock);
0111
0112 exprivate ndrx_debug_t * ndrx_tplog_getlogger(int logger);
0113
0114
0115
0116
0117
0118 expublic void ndrx_nstd_tls_loggers_close(nstd_tls_t *tls)
0119 {
0120 ndrx_debug_t *nlogger[] = {&tls->threadlog_ndrx, &tls->threadlog_ubf,
0121 &tls->threadlog_tp, &tls->requestlog_ndrx, &tls->requestlog_ubf,
0122 &tls->requestlog_tp, NULL};
0123 int i=0;
0124
0125 while (NULL!=nlogger[i])
0126 {
0127 if (NULL!=nlogger[i]->dbg_f_ptr)
0128 {
0129 ndrx_debug_unset_sink(nlogger[i]->dbg_f_ptr, EXTRUE, EXFALSE);
0130 nlogger[i]->dbg_f_ptr=NULL;
0131
0132 nlogger[i]->filename[0]=EXEOS;
0133 nlogger[i]->level = EXFAIL;
0134 }
0135 i++;
0136 }
0137
0138 }
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150 expublic void tplogsetreqfile_direct(const char *filename)
0151 {
0152 debug_map_t map[] = LOGGER_MAP;
0153 int i, dosetup=EXFALSE;
0154
0155 API_ENTRY;
0156
0157 do
0158 {
0159
0160 LOGGER_SAVE_FIELDS_DEF;
0161
0162 for (i=0; i<N_DIM(map); i++)
0163 {
0164
0165 if (EXFAIL==map[i].req->level)
0166 {
0167 LOGGER_SAVE_FIELDS(map[i].req);
0168
0169
0170 if (NULL!=map[i].th->dbg_f_ptr)
0171 {
0172 memcpy(map[i].req, map[i].th, sizeof(ndrx_debug_t));
0173 ndrx_debug_addref(map[i].req->dbg_f_ptr);
0174 }
0175 else
0176 {
0177
0178 MUTEX_LOCK_V(M_proc_lock);
0179 memcpy(map[i].req, map[i].proc, sizeof(ndrx_debug_t));
0180 MUTEX_UNLOCK_V(M_proc_lock);
0181 ndrx_debug_addref(map[i].req->dbg_f_ptr);
0182 }
0183
0184
0185 LOGGER_RESTORE_FIELDS(map[i].req);
0186 dosetup=EXTRUE;
0187 }
0188 else if (0!=strcmp(map[i].req->filename, filename))
0189 {
0190 dosetup=EXTRUE;
0191 }
0192 }
0193
0194
0195
0196 if (dosetup)
0197 {
0198 for (i=0; i<3; i++)
0199 {
0200
0201
0202
0203
0204
0205
0206 if (NULL==map[i].req->dbg_f_ptr)
0207 {
0208 ndrx_debug_get_sink(filename, EXTRUE, map[i].req, NULL);
0209 }
0210 else
0211 {
0212
0213 ndrx_debug_changename(filename, EXTRUE, map[i].req, NULL);
0214 }
0215
0216
0217
0218
0219
0220 }
0221 }
0222 } while(0);
0223 }
0224
0225
0226
0227
0228
0229
0230
0231 exprivate ndrx_debug_t * ndrx_tplog_getlogger(int logger)
0232 {
0233 int i;
0234 ndrx_debug_t *ret = NULL;
0235 debug_map_t map[] = LOGGER_MAP;
0236 LOGGER_SAVE_FIELDS_DEF;
0237
0238 for (i=0; i<N_DIM(map); i++)
0239 {
0240 if (logger & map[i].proc->flags)
0241 {
0242 ret = map[i].proc;
0243 break;
0244 }
0245 else if (logger & map[i].th->flags)
0246 {
0247 if (EXFAIL==map[i].th->level)
0248 {
0249 LOGGER_SAVE_FIELDS(map[i].th);
0250
0251
0252
0253
0254 MUTEX_LOCK_V(M_proc_lock);
0255 memcpy(map[i].th, map[i].proc, sizeof(ndrx_debug_t));
0256 MUTEX_UNLOCK_V(M_proc_lock);
0257
0258
0259
0260
0261
0262
0263 ndrx_debug_addref(map[i].th->dbg_f_ptr);
0264
0265 LOGGER_RESTORE_FIELDS(map[i].th);
0266
0267 }
0268 ret = map[i].th;
0269 break;
0270 }
0271 else if (logger & map[i].req->flags)
0272 {
0273
0274 if (EXFAIL==map[i].req->level)
0275 {
0276 LOGGER_SAVE_FIELDS(map[i].req);
0277
0278
0279
0280
0281 if (NULL!=map[i].th->dbg_f_ptr)
0282 {
0283 memcpy(map[i].req, map[i].th, sizeof(ndrx_debug_t));
0284
0285
0286 ndrx_debug_addref(map[i].req->dbg_f_ptr);
0287 }
0288 else
0289 {
0290
0291
0292
0293 MUTEX_LOCK_V(M_proc_lock);
0294 memcpy(map[i].req, map[i].proc, sizeof(ndrx_debug_t));
0295 MUTEX_UNLOCK_V(M_proc_lock);
0296
0297
0298 ndrx_debug_addref(map[i].req->dbg_f_ptr);
0299 }
0300
0301 LOGGER_RESTORE_FIELDS(map[i].req);
0302 }
0303 ret = map[i].req;
0304 break;
0305 }
0306 }
0307
0308 out:
0309 return ret;
0310 }
0311
0312
0313
0314
0315
0316
0317 expublic void tplogclosereqfile(void)
0318 {
0319 int i;
0320
0321 if (G_nstd_tls)
0322 {
0323 debug_map_t map[] = {
0324 {&G_nstd_tls->requestlog_tp}
0325 ,{&G_nstd_tls->requestlog_ndrx}
0326 ,{&G_nstd_tls->requestlog_ubf}
0327 };
0328
0329 for (i=0; i<N_DIM(map); i++)
0330 {
0331 if (map[i].req->dbg_f_ptr)
0332 {
0333
0334
0335
0336 ndrx_debug_unset_sink(map[i].req->dbg_f_ptr, EXTRUE, EXFALSE);
0337 map[i].req->dbg_f_ptr = NULL;
0338 map[i].req->level = EXFAIL;
0339
0340 }
0341 map[i].req->filename[0] = EXEOS;
0342 }
0343 }
0344 }
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355 expublic int tplogconfig(int logger, int lev, const char *debug_string, const char *module,
0356 const char *new_file)
0357 {
0358 return tplogconfig_int(logger, lev, debug_string, module, new_file, 0);
0359 }
0360
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378 expublic int tplogconfig_int(int logger, int lev, const char *debug_string, const char *module,
0379 const char *new_file, long flags)
0380 {
0381 int ret = EXSUCCEED;
0382 ndrx_debug_t *l;
0383 char tmp_filename[PATH_MAX+1];
0384 int loggers[] = {LOG_FACILITY_NDRX,
0385 LOG_FACILITY_UBF,
0386 LOG_FACILITY_TP,
0387 LOG_FACILITY_TP_THREAD,
0388 LOG_FACILITY_TP_REQUEST,
0389 LOG_FACILITY_NDRX_THREAD,
0390 LOG_FACILITY_NDRX_REQUEST,
0391 LOG_FACILITY_UBF_THREAD,
0392 LOG_FACILITY_UBF_REQUEST
0393 };
0394 int i;
0395
0396 API_ENTRY;
0397 NDRX_DBG_INIT_ENTRY;
0398
0399 for (i=0; i<N_DIM(loggers); i++)
0400 {
0401 int curlogger = logger & loggers[i];
0402
0403 if (!curlogger)
0404 {
0405 continue;
0406 }
0407
0408 l = ndrx_tplog_getlogger(curlogger);
0409
0410 if (NULL==l)
0411 {
0412
0413
0414
0415
0416 continue;
0417 }
0418
0419
0420 if (l->flags & LOG_FACILITY_PROCESS)
0421 {
0422 MUTEX_LOCK_V(M_proc_lock);
0423 }
0424
0425 if (NULL!=module && EXEOS!=module[0] &&
0426 loggers[i] != LOG_FACILITY_NDRX &&
0427 loggers[i] != LOG_FACILITY_UBF &&
0428 loggers[i] != LOG_FACILITY_NDRX_THREAD &&
0429 loggers[i] != LOG_FACILITY_UBF_THREAD &&
0430 loggers[i] != LOG_FACILITY_NDRX_REQUEST &&
0431 loggers[i] != LOG_FACILITY_UBF_REQUEST
0432 )
0433 {
0434 NDRX_STRNCPY(l->module, module, 4);
0435 l->module[4] = EXEOS;
0436 }
0437
0438 if (NULL!= debug_string && EXEOS!=debug_string[0])
0439 {
0440
0441
0442
0443
0444 NDRX_STRCPY_SAFE(tmp_filename, l->filename);
0445
0446 if (EXSUCCEED!= (ret = ndrx_init_parse_line(debug_string, l,
0447 l->filename, sizeof(l->filename), NULL, NULL )))
0448 {
0449
0450
0451 if (l->flags & LOG_FACILITY_PROCESS)
0452 {
0453 MUTEX_UNLOCK_V(M_proc_lock);
0454 }
0455
0456 _Nset_error_msg(NEFORMAT, "Failed to parse debug string");
0457 EXFAIL_OUT(ret);
0458 }
0459
0460
0461 if (0!=strcmp(tmp_filename, l->filename) &&
0462 (NULL==new_file || EXEOS==new_file[0]))
0463 {
0464 ndrx_debug_changename(l->filename, EXTRUE, l, NULL);
0465 }
0466
0467
0468 if (flags & NDRX_TPLOGCONFIG_VERSION_INC)
0469 {
0470
0471
0472
0473 l->version++;
0474 }
0475 }
0476
0477 if (EXFAIL!=lev)
0478 {
0479 l->level = lev;
0480 }
0481
0482
0483 if (NULL!=new_file && EXEOS!=new_file[0] && 0!=strcmp(new_file, l->filename))
0484 {
0485 ndrx_debug_changename(new_file, EXTRUE, l, NULL);
0486 }
0487
0488
0489 if (l->flags & LOG_FACILITY_PROCESS)
0490 {
0491 MUTEX_UNLOCK_V(M_proc_lock);
0492 }
0493
0494 }
0495
0496 out:
0497 return ret;
0498 }
0499
0500
0501
0502
0503 expublic int tplogreopen(void)
0504 {
0505 API_ENTRY;
0506 NDRX_DBG_INIT_ENTRY;
0507 return ndrx_debug_reopen_all();
0508 }
0509
0510
0511
0512
0513 expublic void tplogclosethread(void)
0514 {
0515 int i;
0516
0517 if (G_nstd_tls)
0518 {
0519 debug_map_t map[] = {
0520 {&G_nstd_tls->threadlog_tp}
0521 ,{&G_nstd_tls->threadlog_ubf}
0522 ,{&G_nstd_tls->threadlog_ndrx}
0523 };
0524
0525 for (i=0; i<N_DIM(map); i++)
0526 {
0527 if (map[i].req->dbg_f_ptr)
0528 {
0529
0530
0531
0532 ndrx_debug_unset_sink(map[i].req->dbg_f_ptr, EXTRUE, EXFALSE);
0533 map[i].req->dbg_f_ptr = NULL;
0534 map[i].req->level = EXFAIL;
0535
0536 }
0537 map[i].req->filename[0] = EXEOS;
0538 }
0539 }
0540 }
0541
0542
0543
0544
0545
0546
0547 expublic int tploggetreqfile(char *filename, int bufsize)
0548 {
0549 int ret = EXFALSE;
0550
0551 if (NULL==G_nstd_tls->requestlog_tp.dbg_f_ptr)
0552 {
0553 ret=EXFALSE;
0554 goto out;
0555 }
0556
0557 ret = EXTRUE;
0558
0559 if (NULL!=filename)
0560 {
0561 if (bufsize>0)
0562 {
0563 NDRX_STRCPY_SAFE_DST(filename, G_nstd_tls->requestlog_tp.filename, bufsize);
0564 }
0565 else
0566 {
0567 strcpy(filename, G_nstd_tls->requestlog_tp.filename);
0568 }
0569 }
0570
0571 out:
0572 return ret;
0573 }
0574
0575
0576
0577
0578
0579
0580 expublic void tplog(int lev, const char *message)
0581 {
0582
0583 TP_LOG(lev, "%s", message);
0584 }
0585
0586
0587
0588
0589
0590
0591 expublic void tplogex(int lev, const char *file, long line, const char *message)
0592 {
0593
0594 TP_LOGEX(lev, file, line, "%s", message);
0595 }
0596
0597
0598
0599
0600
0601 expublic char * tploggetiflags(void)
0602 {
0603 TP_LOGGETIFLAGS;
0604 }
0605
0606
0607
0608
0609
0610
0611
0612
0613 expublic void tplogdump(int lev, const char *comment, void *ptr, int len)
0614 {
0615 TP_DUMP(lev, comment, (char *)ptr, len);
0616 }
0617
0618
0619
0620
0621
0622
0623
0624
0625
0626 expublic void tplogdumpdiff(int lev, const char *comment, void *ptr1, void *ptr2, int len)
0627 {
0628 TP_DUMP_DIFF(lev, comment, (char *)ptr1, (char *)ptr2, len);
0629 }
0630
0631
0632
0633
0634
0635
0636 expublic void ndrxlog(int lev, const char *message)
0637 {
0638
0639 NDRX_LOG(lev, "%s", message);
0640 }
0641
0642
0643
0644
0645
0646
0647
0648
0649 expublic void ndrxlogex(int lev, const char *file, long line, const char *message)
0650 {
0651
0652 NDRX_LOGEX(lev, file, line, "%s", message);
0653 }
0654
0655
0656
0657
0658
0659
0660
0661
0662 expublic void ndrxlogdump(int lev, const char *comment, void *ptr, int len)
0663 {
0664 NDRX_DUMP(lev, comment, (char *)ptr, len);
0665 }
0666
0667
0668
0669
0670
0671
0672
0673
0674
0675 expublic void ndrxlogdumpdiff(int lev, const char *comment, void *ptr1, void *ptr2, int len)
0676 {
0677 NDRX_DUMP_DIFF(lev, comment, (char *)ptr1, (char *)ptr2, len);
0678 }
0679
0680
0681
0682
0683
0684
0685 expublic void ubflog(int lev, const char *message)
0686 {
0687
0688 UBF_LOG(lev, "%s", message);
0689 }
0690
0691
0692
0693
0694
0695
0696
0697
0698 expublic void ubflogex(int lev, const char *file, long line, const char *message)
0699 {
0700
0701 UBF_LOGEX(lev, file, line, "%s", message);
0702 }
0703
0704
0705
0706
0707
0708
0709
0710
0711 expublic void ubflogdump(int lev, const char *comment, void *ptr, int len)
0712 {
0713 UBF_DUMP(lev, comment, (char *)ptr, len);
0714 }
0715
0716
0717
0718
0719
0720
0721
0722
0723
0724 expublic void ubflogdumpdiff(int lev, const char *comment, void *ptr1, void *ptr2, int len)
0725 {
0726 UBF_DUMP_DIFF(lev, comment, (char *)ptr1, (char *)ptr2, len);
0727 }
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737 expublic long tplogqinfo(int lev, long flags)
0738 {
0739 int ret = 0;
0740 int tmp;
0741 ndrx_debug_t *dbg;
0742
0743 API_ENTRY;
0744
0745 if (flags & TPLOGQI_GET_NDRX)
0746 {
0747 dbg = debug_get_ndrx_ptr();
0748 }
0749 else if (flags & TPLOGQI_GET_UBF)
0750 {
0751 dbg = debug_get_ubf_ptr();
0752 }
0753 else if (flags & TPLOGQI_GET_TP)
0754 {
0755 dbg = debug_get_tp_ptr();
0756 }
0757 else
0758 {
0759 _Nset_error_fmt(NEINVAL, "%s: Invalid flags: %ld", __func__, flags);
0760 EXFAIL_OUT(ret);
0761 }
0762
0763 if (!(flags & TPLOGQI_EVAL_RETURN) && lev > dbg->level)
0764 {
0765 goto out;
0766 }
0767
0768 ret|=(((int)dbg->flags) & LOG_FACILITY_MASK);
0769
0770 if (flags & TPLOGQI_EVAL_DETAILED)
0771 {
0772 if (NULL!=strstr(dbg->iflags, LOG_IFLAGS_DETAILED))
0773 {
0774 ret|=TPLOGQI_RET_HAVDETAILED;
0775 }
0776 }
0777 tmp = dbg->level;
0778
0779 tmp <<= TPLOGQI_RET_DBGLEVBITS;
0780 ret|=tmp;
0781
0782 out:
0783
0784 return ret;
0785 }
0786
0787
0788
0789
0790
0791
0792
0793 expublic ndrx_debug_t * tplogfplock(int lev, long flags)
0794 {
0795 ndrx_debug_t * ret = debug_get_tp_ptr();
0796
0797 if (ret->level>=lev || EXFAIL==lev)
0798 {
0799 ndrx_debug_lock((ndrx_debug_file_sink_t*)ret->dbg_f_ptr);
0800 return (void *)ret;
0801 }
0802
0803
0804 return NULL;
0805 }
0806
0807
0808
0809
0810
0811
0812
0813 expublic FILE *tplogfpget(ndrx_debug_t *dbg, long flags)
0814 {
0815 if (NULL==dbg)
0816 {
0817 return NULL;
0818 }
0819
0820 return ((ndrx_debug_file_sink_t*)dbg->dbg_f_ptr)->fp;
0821 }
0822
0823
0824
0825
0826
0827 expublic void tplogfpunlock(ndrx_debug_t *dbg)
0828 {
0829 if (NULL==dbg)
0830 {
0831 return;
0832 }
0833
0834 ndrx_debug_unlock((ndrx_debug_file_sink_t*)dbg->dbg_f_ptr);
0835 }
0836
0837