/* LOGMSG.C : ISW 2003 */ /* logmsg frontend routing */ #include "hstdinc.h" #define _HUTIL_DLL_ #define _LOGMSG_C_ #include "hercules.h" #define BFR_CHUNKSIZE (256) /******************************************/ /* UTILITY MACRO BFR_VSNPRINTF */ /* Original design by Fish */ /* Modified by Jay Maynard */ /* Further modification by Ivan Warren */ /* */ /* Purpose : set 'bfr' to contain */ /* a C string based on a message format */ /* and a va_list of args. */ /* bfr must be free()d when over with */ /* this macro can ONLY be used from the */ /* topmost variable arg function */ /* that is the va_list cannot be passed */ /* as a parameter from another function */ /* since va_xxx functions behavio(u)r */ /* seems to be undefined in those cases */ /* char *bfr; must be originally defined */ /* int siz; must be defined and cont- */ /* ain a start size */ /* va_list vl; must be defined and init- */ /* ialised with va_start */ /* char *msg; is the message format */ /* int rc; to contain final size */ /******************************************/ #define BFR_VSNPRINTF() \ bfr=malloc(siz); \ rc=-1; \ while(bfr&&(rc<0||rc>=siz)) \ { \ va_start(vl,msg); \ rc=vsnprintf(bfr,siz,msg,vl); \ va_end(vl); \ if(rc>=0 && rcccwtrace||dev->ccwstep) { logmsg("%4.4X:",dev->devnum); BFR_VSNPRINTF(); if(bfr) log_write(2,bfr); } #ifdef NEED_LOGMSG_FFLUSH fflush(stdout); #endif if(bfr) { free(bfr); } } /* end function logdevtr */ /* panel : 0 - No, 1 - Only, 2 - Also */ DLL_EXPORT void log_write(int panel,char *msg) { /* (log_write function proper starts here) */ int slot; log_route_init(); if(panel==1) { write_pipe( logger_syslogfd[LOG_WRITE], msg, strlen(msg) ); return; } obtain_lock(&log_route_lock); slot=log_route_search(thread_id()); release_lock(&log_route_lock); if(slot<0 || panel>0) { write_pipe( logger_syslogfd[LOG_WRITE], msg, strlen(msg) ); if(slot<0) return; } log_routes[slot].w(log_routes[slot].u,msg); return; } /* capture log output routine series */ /* log_capture is a sample of how to */ /* use log rerouting. */ /* log_capture takes 2 args : */ /* a ptr to a function taking 1 parm */ /* the function parm */ struct log_capture_data { char *obfr; size_t sz; }; DLL_EXPORT void log_capture_writer(void *vcd,char *msg) { struct log_capture_data *cd; if(!vcd||!msg)return; cd=(struct log_capture_data *)vcd; if(cd->sz==0) { cd->sz=strlen(msg)+1; cd->obfr=malloc(cd->sz); cd->obfr[0]=0; } else { cd->sz+=strlen(msg); cd->obfr=realloc(cd->obfr,cd->sz); } strcat(cd->obfr,msg); return; } DLL_EXPORT void log_capture_closer(void *vcd) { UNREFERENCED(vcd); return; } DLL_EXPORT char *log_capture(void *(*func)(void *),void *arg) { struct log_capture_data cd; cd.obfr=NULL; cd.sz=0; log_open(log_capture_writer,log_capture_closer,&cd); func(arg); log_close(); return(cd.obfr); }