static void _log()

in sdk/userspace/utils/log.c [164:279]


static void _log(enum log_level level, const char *file, int line,
		 const char *func, const char *format, va_list ap,
		 int error_number)
{
	struct timespec ts;
	time_t ts_s;
	unsigned long ts_us;
	struct tm tm;
	void *p;
	int rc;
	char message[LOG_MESSAGE_LENGTH_MAX];
	size_t message_length = 0;
	size_t t_len;
	bool logged = false;

	/* time */
	rc = clock_gettime(CLOCK_REALTIME, &ts);
	assert(!rc);
	ts_s = ts.tv_sec;
	p = gmtime_r(&ts_s, &tm);
	assert(p);
	t_len = strftime(&message[message_length],
			 sizeof(message) - message_length, "%Y-%m-%dT%T", &tm);
	if (!t_len) {
		internal_log("strftime() failed");
		rc = 0;
	}
	message_length += t_len;
	ts_us = ts.tv_nsec / 1000;
	rc = snprintf(&message[message_length],
		      sizeof(message) - message_length, ".%06luZ, ", ts_us);
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("snprintf() us failed");
		rc = 0;
	}
	message_length += rc;
	/* name */
	rc = snprintf(&message[message_length],
		      sizeof(message) - message_length, "%s, ", priv.name);
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("snprintf() name failed");
		rc = 0;
	}
	message_length += rc;
	/* log level */
	rc = snprintf(&message[message_length],
		      sizeof(message) - message_length,
		      "%s, ", str_log_level(level));
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("snprintf() log level failed");
		rc = 0;
	}
	message_length += rc;
	/* file, line, func */
	rc = snprintf(&message[message_length],
		      sizeof(message) - message_length,
		      "%s +%d: %s(): ", file, line, func);
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("snprintf() file +line: func() failed");
		rc = 0;
	}
	message_length += rc;
	/* prefix */
	if (priv_prefix[0]) {
		rc = snprintf(&message[message_length],
			      sizeof(message) - message_length,
			      "%s: ", priv_prefix);
		if ((size_t)rc >= sizeof(message) - message_length) {
			internal_log("snprintf() prefix failed");
			rc = 0;
		}
		message_length += rc;
	}
	/* message */
	rc = vsnprintf(&message[message_length],
		       sizeof(message) - message_length, format, ap);
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("vsnprintf() message failed");
		rc = 0;
	}
	message_length += rc;
	/* error message */
	if (error_number) {
		rc = snprintf(&message[message_length],
			      sizeof(message) - message_length, ": %s",
			      str_error_number(error_number));
		if ((size_t)rc >= sizeof(message) - message_length) {
			internal_log("snprintf() error message failed");
			rc = 0;
		}
		message_length += rc;
	}
	/* newline */
	rc = snprintf(&message[message_length],
		      sizeof(message) - message_length,
		      "\n");
	if ((size_t)rc >= sizeof(message) - message_length) {
		internal_log("snprintf() \\n failed");
		rc = 0;
	}
	message_length += rc;

	for (size_t i = 0; i < priv.nr_loggers; i++) {
		int rc;

		rc = priv.loggers[i]->log(level, message);
		if (!rc) {
			logged = true;
			continue;
		}
		internal_log("Could not log a message via the %s logger: %s",
			     priv.loggers[i]->name, str_error_number(-rc));
	}
	if (!logged)
		stdout_log(level, message);
}