]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Introduce new ul_log function which prints also process name
authorMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 27 Nov 2009 10:15:07 +0000 (11:15 +0100)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Fri, 27 Nov 2009 10:15:07 +0000 (11:15 +0100)
This is useful when debugging FRSH with multiple programs/resources
running.

src/forb.c

index fe340818c3e6c06ff9d268081386382c272b9b00..663e6adb862fda26391b1df0c75cf30f3d30cfa6 100644 (file)
@@ -85,6 +85,7 @@
 #include <fcb.h>
 #include <fcb_contact_info.h>
 #endif
+#include <fcntl.h>
 
 #ifdef DEBUG
 #define UL_LOGL_DEF UL_LOGL_DEB
@@ -94,6 +95,7 @@
 #include "log_domains.inc"
 
 extern UL_LOG_CUST(ulogd_forb);
+static int init_ul_log(void);
 
 UL_LOGREG_DOMAINS_INIT_FUNCTION(forb_logreg_domains, forb_logreg_domains_array);
 
@@ -181,6 +183,7 @@ forb_init(int *argc, char **argv[], const struct forb_init_attr *attr)
        memset(forb, 0, sizeof(*forb));
 
        /* Initialize ULUT logging facility */
+       init_ul_log();
        forb_logreg_domains();
 
        if (attr) {
@@ -496,3 +499,62 @@ __forb_sequence_alloc_buf_internal(void *seq, size_t seq_size,
        *maximum_ptr = *buf_pptr ? num_elements : 0;
        return (*buf_pptr != NULL) || (num_elements == 0);
 }
+
+static FILE *forb_ul_log_file;
+static char progname[64] = "";
+
+void
+forb_ul_log_fnc(ul_log_domain_t *domain, int level,
+               const char *format, va_list ap)
+{
+       if(!(level&UL_LOGL_CONT)) {
+               level&=UL_LOGL_MASK;
+               fprintf(forb_ul_log_file,"%s:", progname);
+               if(level)
+                       fprintf(forb_ul_log_file,"<%d>",level);
+               if(domain && domain->name)
+                       fprintf(forb_ul_log_file,"%s: ",domain->name);
+       }
+       vfprintf(forb_ul_log_file, format, ap);
+       fflush(forb_ul_log_file);
+}
+
+static int init_ul_log(void)
+{
+       char *s;
+       char *log_fname;
+       int fd;
+       int flg = 0;
+       char path[128];
+
+/*     if(ul_log_output != NULL) */
+/*             return 0; */
+
+       fd = open("/proc/self/cmdline", O_RDONLY);
+       if (fd >= 0) {
+               int ret;
+               ret = read(fd, path, sizeof(path)-1);
+               if (ret > 0) {
+                       path[ret]=0;
+                       s = strrchr(path, '/');
+                       if (s) s++;
+                       else s = path;
+                       strncpy(progname, s, sizeof(progname)-1);
+               }
+               close(fd);
+       }
+
+       if((log_fname=getenv("UL_LOG_FILENAME"))!=NULL){
+               forb_ul_log_file=fopen(log_fname,"a");
+       }
+       if(forb_ul_log_file==NULL)
+               forb_ul_log_file=stderr;
+       
+       if((s=getenv("UL_DEBUG_FLG")) != NULL){
+               flg=atoi(s);
+       }
+
+       ul_log_redir(forb_ul_log_fnc, flg);
+
+       return 0;
+}