X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fverbose.c;fp=src%2Fverbose.c;h=b8751069ee3e683d1d194934049aef6937738789;hb=b355a2a65511c32aaaddf289d70395f872bd4b26;hp=e0e382488c1d1fc39895c2ea29d791ad55aa1ec7;hpb=36c7ab15e79d6b0ff6188b61da1061f36b902f8e;p=src%2Fapp-framework-binder.git diff --git a/src/verbose.c b/src/verbose.c index e0e38248..b8751069 100644 --- a/src/verbose.c +++ b/src/verbose.c @@ -83,6 +83,8 @@ void verbose_set_name(const char *name, int authority) #include #include +#include +#include static const char *appname; @@ -99,18 +101,76 @@ static const char *prefixes[] = { "<7> DEBUG" }; +static int tty; + +static const char chars[] = { '\n', '?', ':', ' ', '[', ',', ']' }; + static void _vverbose_(int loglevel, const char *file, int line, const char *function, const char *fmt, va_list args) { - int saverr = errno; - int tty = isatty(fileno(stderr)); - errno = saverr; + char buffer[4000]; + char lino[40]; + int saverr, n, rc; + struct iovec iov[20]; + + saverr = errno; + + if (!tty) + tty = 1 + isatty(STDERR_FILENO); + + iov[0].iov_base = (void*)prefixes[CROP_LOGLEVEL(loglevel)] + (tty - 1 ? 4 : 0); + iov[0].iov_len = strlen(iov[0].iov_base); + + iov[1].iov_base = (void*)&chars[2]; + iov[1].iov_len = 2; + + n = 2; + if (fmt) { + iov[n].iov_base = buffer; + rc = vsnprintf(buffer, sizeof buffer, fmt, args); + if (rc < 0) + rc = 0; + else if ((size_t)rc > sizeof buffer) { + rc = (int)sizeof buffer; + buffer[rc - 1] = buffer[rc - 2] = buffer[rc - 3] = '.'; + } + iov[n++].iov_len = (size_t)rc; + } + if (file && (!fmt || tty == 1 || loglevel <= Log_Level_Warning)) { + iov[n].iov_base = (void*)&chars[3 + !fmt]; + iov[n++].iov_len = 2 - !fmt; + iov[n].iov_base = (void*)file; + iov[n++].iov_len = strlen(file); + iov[n].iov_base = (void*)&chars[2]; + iov[n++].iov_len = 1; + if (line) { + iov[n].iov_base = lino; + iov[n++].iov_len = snprintf(lino, sizeof lino, "%d", line); + } else { + iov[n].iov_base = (void*)&chars[1]; + iov[n++].iov_len = 1; + } + iov[n].iov_base = (void*)&chars[5]; + iov[n++].iov_len = 1; + if (function) { + iov[n].iov_base = (void*)function; + iov[n++].iov_len = strlen(function); + } else { + iov[n].iov_base = (void*)&chars[1]; + iov[n++].iov_len = 1; + } + iov[n].iov_base = (void*)&chars[6]; + iov[n++].iov_len = 1; + } + if (n == 2) { + iov[n].iov_base = (void*)&chars[1]; + iov[n++].iov_len = 1; + } + iov[n].iov_base = (void*)&chars[0]; + iov[n++].iov_len = 1; - fprintf(stderr, "%s: ", prefixes[CROP_LOGLEVEL(loglevel)] + (tty ? 4 : 0)); - vfprintf(stderr, fmt, args); - if (file != NULL && (!tty || verbosity > 2)) - fprintf(stderr, " [%s:%d,%s]\n", file, line, function); - else - fprintf(stderr, "\n"); + writev(STDERR_FILENO, iov, n); + + errno = saverr; } void verbose_set_name(const char *name, int authority)