void log_ext( int errnum, /* I (errno or PBSErrno) */ const char *routine, /* I */ const char *text, /* I */ int severity) /* I */ { char buf[LOG_BUF_SIZE]; char *EPtr = NULL; char EBuf[1024]; char tmpLine[2048]; const char *SeverityText = NULL; tmpLine[0] = '\0'; EBuf[0] = '\0'; if (errnum == -1) { buf[0] = '\0'; } else { /* NOTE: some strerror() routines return "Unknown error X" w/bad errno */ if (errnum >= 15000) { EPtr = pbse_to_txt(errnum); } else { EPtr = strerror(errnum); } if (EPtr == NULL) { sprintf(EBuf, "unexpected error %d", errnum); EPtr = EBuf; } sprintf(tmpLine,"%s (%d) in ", EPtr, errnum); } SeverityText = log_get_severity_string(severity); snprintf(buf,sizeof(buf),"%s::%s%s, %s", SeverityText, tmpLine, routine, text); buf[LOG_BUF_SIZE - 1] = '\0'; pthread_mutex_lock(&log_mutex); if (log_opened == 0) { #if !SYSLOG log_open("/dev/console", log_directory); #endif /* not SYSLOG */ } if (isatty(2)) { fprintf(stderr, "%s: %s\n", msg_daemonname, buf); } if (log_opened > 0) { pthread_mutex_unlock(&log_mutex); log_record( PBSEVENT_ERROR | PBSEVENT_FORCE, PBS_EVENTCLASS_SERVER, msg_daemonname, buf); } else pthread_mutex_unlock(&log_mutex); #if SYSLOG if (syslogopen == 0) { openlog(msg_daemonname, LOG_NOWAIT, LOG_DAEMON); syslogopen = 1; } syslog(severity|LOG_DAEMON,"%s",buf); #endif /* SYSLOG */ return; } /* END log_ext() */
/** * An internal worker function to perform the logging. * * Takes VA_ARGS similar to vprintf. * * \param _l The logger reference. * \param severity The severity of the message * \param format The message to send * \param ap The va_list for the format paramater * \returns 0 on success, -1 on error. */ static int vlog(int severity, const char *format, va_list ap) { if (logLevel > severity) { return 0; } if (buffer == NULL) { buffer = (char *) g_malloc(INITIAL_BUFFER_SIZE); buffer_size = INITIAL_BUFFER_SIZE; } struct timeval timestamp; // Populate buffer with time stamp if (gettimeofday(×tamp, NULL) != 0) { // Print the message to stderr before erroring out fprintf(stderr, "??.?? PID(%d) %s: [%s] ", getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity)); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); fflush(stderr); return -1; } int ret = g_vsnprintf(buffer, buffer_size, format, ap); if (ret < 0) { // Broken implementation of vsnprintf? // Print the message to stderr before erroring out fprintf(stderr, "%ld.%06ld PID(%d) %s: [%s] ", timestamp.tv_sec, timestamp.tv_usec, getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity)); vfprintf(stderr, format, ap); fprintf(stderr, "\n"); fflush(stderr); return -1; } if (ret >= buffer_size) { g_free(buffer); buffer = (char *) g_malloc(ret * 2); buffer_size = ret * 2; errno = EAGAIN; return -1; } if (id == NULL) { fprintf(stderr, "%ld.%06ld PID(%d) %s: [%s] %s\n", timestamp.tv_sec, timestamp.tv_usec, getpid(), basename_safe(PROCESS_NAME), log_get_severity_string(severity), buffer); return 0; } log_t log = log_init(NULL, 0); log_set_sender_id(log, id); log_set_severity(log, severity); log_set_timestamp(log, timestamp.tv_sec, timestamp.tv_usec); log_set_message(log, buffer); unsigned int size; char *s = log_serialise(log, &size); log_close(log); ret = transport_send(transport, s, NULL, size); g_free(s); return ret; }