int _vsyslog(int priority, FAR const IPTR char *fmt, FAR va_list *ap) { struct lib_outstream_s stream; #ifdef CONFIG_SYSLOG_TIMESTAMP struct timespec ts; /* Get the current time. Since debug output may be generated very early * in the start-up sequence, hardware timer support may not yet be * available. */ if (!OSINIT_HW_READY() || clock_systimespec(&ts) < 0) { /* Timer hardware is not available, or clock_systimespec failed */ ts.tv_sec = 0; ts.tv_nsec = 0; } #endif /* Wrap the low-level output in a stream object and let lib_vsprintf * do the work. NOTE that emergency priority output is handled * differently.. it will use the SYSLOG emergency stream. */ if (priority == LOG_EMERG) { /* Use the SYSLOG emergency stream */ emergstream((FAR struct lib_outstream_s *)&stream); } else { /* Use the normal SYSLOG stream */ syslogstream((FAR struct lib_outstream_s *)&stream); } #if defined(CONFIG_SYSLOG_TIMESTAMP) /* Pre-pend the message with the current time, if available */ (void)lib_sprintf((FAR struct lib_outstream_s *)&stream, "[%6d.%06d]", ts.tv_sec, ts.tv_nsec/1000); #endif return lib_vsprintf((FAR struct lib_outstream_s *)&stream, fmt, *ap); }
int clock_gettime(clockid_t clock_id, struct timespec *tp) { struct timespec ts; uint32_t carry; int ret = OK; sdbg("clock_id=%d\n", clock_id); DEBUGASSERT(tp != NULL); #ifdef CONFIG_CLOCK_MONOTONIC /* CLOCK_MONOTONIC is an optional under POSIX: "If the Monotonic Clock * option is supported, all implementations shall support a clock_id * of CLOCK_MONOTONIC defined in <time.h>. This clock represents the * monotonic clock for the system. For this clock, the value returned * by clock_gettime() represents the amount of time (in seconds and * nanoseconds) since an unspecified point in the past (for example, * system start-up time, or the Epoch). This point does not change * after system start-up time. The value of the CLOCK_MONOTONIC clock * cannot be set via clock_settime(). This function shall fail if it * is invoked with a clock_id argument of CLOCK_MONOTONIC." */ if (clock_id == CLOCK_MONOTONIC) { /* The the time elapsed since the timer was initialized at power on * reset. */ ret = clock_systimespec(tp); } else #endif /* CLOCK_REALTIME - POSIX demands this to be present. CLOCK_REALTIME * represents the machine's best-guess as to the current wall-clock, * time-of-day time. This means that CLOCK_REALTIME can jump forward and * backward as the system time-of-day clock is changed. */ if (clock_id == CLOCK_REALTIME) { /* Get the elapsedcd s time since the time-of-day was last set. * clock_systimespec() provides the time since power was applied; * the bias value corresponds to the time when the time-of-day was * last set. */ ret = clock_systimespec(&ts); if (ret == OK) { /* Add the base time to this. The base time is the time-of-day * setting. When added to the elapsed time since the time-of-day * was last set, this gives us the current time. */ ts.tv_sec += (uint32_t)g_basetime.tv_sec; ts.tv_nsec += (uint32_t)g_basetime.tv_nsec; /* Handle carry to seconds. */ if (ts.tv_nsec >= NSEC_PER_SEC) { carry = ts.tv_nsec / NSEC_PER_SEC; ts.tv_sec += carry; ts.tv_nsec -= (carry * NSEC_PER_SEC); } /* And return the result to the caller. */ tp->tv_sec = ts.tv_sec; tp->tv_nsec = ts.tv_nsec; } } else { ret = -EINVAL; } /* Check for errors and set the errno value if necessary */ if (ret < 0) { sdbg("Returning ERROR\n"); set_errno(-ret); ret = ERROR; } else { sdbg("Returning tp=(%d,%d)\n", (int)tp->tv_sec, (int)tp->tv_nsec); } return ret; }