X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=rpmio%2Frpmlog.c;h=8023d5c446ff0b5a9a31d31a2aba35b001e0d0b6;hb=6b52f62e25ed30e68b4997fac0c52ad1876d4665;hp=0c389bed9b7336563f55de68f999192a77c78c2c;hpb=d8dc44f36377c59164d19106f0f93843ea5b3a09;p=platform%2Fupstream%2Frpm.git diff --git a/rpmio/rpmlog.c b/rpmio/rpmlog.c index 0c389be..8023d5c 100644 --- a/rpmio/rpmlog.c +++ b/rpmio/rpmlog.c @@ -4,39 +4,18 @@ #include "system.h" #include -#include "rpmlog.h" +#include +#include #include "debug.h" -#ifndef va_copy -# ifdef __va_copy -# define va_copy(DEST,SRC) __va_copy((DEST),(SRC)) -# else -# ifdef HAVE_VA_LIST_AS_ARRAY -# define va_copy(DEST,SRC) (*(DEST) = *(SRC)) -# else -# define va_copy(DEST,SRC) ((DEST) = (SRC)) -# endif -# endif -#endif - -/*@access rpmlogRec @*/ - -/*@unchecked@*/ static int nrecs = 0; -/*@unchecked@*/ -static /*@only@*/ /*@null@*/ rpmlogRec recs = NULL; +static rpmlogRec recs = NULL; -/** - * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL. - * @param p memory to free - * @retval NULL always - */ -/*@unused@*/ static inline /*@null@*/ void * -_free(/*@only@*/ /*@null@*/ /*@out@*/ const void * p) /*@modifies p@*/ -{ - if (p != NULL) free((void *)p); - return NULL; -} +struct rpmlogRec_s { + int code; /* unused */ + rpmlogLvl pri; /* priority */ + char * message; /* log message string */ +}; int rpmlogGetNrecs(void) { @@ -58,7 +37,18 @@ const char * rpmlogMessage(void) return _("(no error)"); } -/*@-modfilesys@*/ +const char * rpmlogRecMessage(rpmlogRec rec) +{ + assert(rec != NULL); + return (rec->message); +} + +rpmlogLvl rpmlogRecPriority(rpmlogRec rec) +{ + assert(rec != NULL); + return (rec->pri); +} + void rpmlogPrint(FILE *f) { int i; @@ -73,7 +63,6 @@ void rpmlogPrint(FILE *f) fprintf(f, " %s", rec->message); } } -/*@=modfilesys@*/ void rpmlogClose (void) { @@ -88,15 +77,16 @@ void rpmlogClose (void) nrecs = 0; } -void rpmlogOpen (/*@unused@*/ const char *ident, /*@unused@*/ int option, - /*@unused@*/ int facility) +void rpmlogOpen (const char *ident, int option, + int facility) { } -/*@unchecked@*/ -static int rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE ); -/*@unchecked@*/ -static /*@unused@*/ int rpmlogFacility = RPMLOG_USER; +static unsigned rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE ); + +#ifdef NOTYET +static unsigned rpmlogFacility = RPMLOG_USER; +#endif int rpmlogSetMask (int mask) { @@ -106,19 +96,55 @@ int rpmlogSetMask (int mask) return omask; } -/*@unchecked@*/ -static /*@null@*/ rpmlogCallback _rpmlogCallback = NULL; +static rpmlogCallback _rpmlogCallback = NULL; +static rpmlogCallbackData _rpmlogCallbackData = NULL; -rpmlogCallback rpmlogSetCallback(rpmlogCallback cb) +rpmlogCallback rpmlogSetCallback(rpmlogCallback cb, rpmlogCallbackData data) { rpmlogCallback ocb = _rpmlogCallback; _rpmlogCallback = cb; + _rpmlogCallbackData = data; return ocb; } -/*@-readonlytrans@*/ /* FIX: double indirection. */ -/*@observer@*/ /*@unchecked@*/ -static char *rpmlogMsgPrefix[] = { +static FILE * _stdlog = NULL; + +static int rpmlogDefault(rpmlogRec rec) +{ + FILE *msgout = (_stdlog ? _stdlog : stderr); + + switch (rec->pri) { + case RPMLOG_INFO: + case RPMLOG_NOTICE: + msgout = (_stdlog ? _stdlog : stdout); + break; + case RPMLOG_EMERG: + case RPMLOG_ALERT: + case RPMLOG_CRIT: + case RPMLOG_ERR: + case RPMLOG_WARNING: + case RPMLOG_DEBUG: + default: + break; + } + + (void) fputs(rpmlogLevelPrefix(rec->pri), msgout); + + (void) fputs(rec->message, msgout); + (void) fflush(msgout); + + return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0); +} + + +FILE * rpmlogSetFile(FILE * fp) +{ + FILE * ofp = _stdlog; + _stdlog = fp; + return ofp; +} + +static const char * const rpmlogMsgPrefix[] = { N_("fatal error: "),/*!< RPMLOG_EMERG */ N_("fatal error: "),/*!< RPMLOG_ALERT */ N_("fatal error: "),/*!< RPMLOG_CRIT */ @@ -128,122 +154,77 @@ static char *rpmlogMsgPrefix[] = { "", /*!< RPMLOG_INFO */ "D: ", /*!< RPMLOG_DEBUG */ }; -/*@=readonlytrans@*/ -#if !defined(HAVE_VSNPRINTF) -static inline int vsnprintf(char * buf, /*@unused@*/ int nb, - const char * fmt, va_list ap) +const char * rpmlogLevelPrefix(rpmlogLvl pri) { - return vsprintf(buf, fmt, ap); + const char * prefix = ""; + if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri]) + prefix = _(rpmlogMsgPrefix[pri]); + return prefix; } -#endif -/*@-modfilesys@*/ -/*@-compmempass@*/ /* FIX: rpmlogMsgPrefix[] dependent, not unqualified */ -/*@-nullstate@*/ /* FIX: rpmlogMsgPrefix[] may be NULL */ -static void vrpmlog (unsigned code, const char *fmt, va_list ap) - /*@modifies internalState @*/ +/* FIX: rpmlogMsgPrefix[] dependent, not unqualified */ +/* FIX: rpmlogMsgPrefix[] may be NULL */ +static void dolog (struct rpmlogRec_s *rec) { - int pri = RPMLOG_PRI(code); - int mask = RPMLOG_MASK(pri); - /*@unused@*/ int fac = RPMLOG_FAC(code); - char *msgbuf, *msg; - int msgnb = BUFSIZ, nb; - FILE * msgout = stderr; - - if ((mask & rpmlogMask) == 0) - return; - - msgbuf = xmalloc(msgnb); - *msgbuf = '\0'; - - /* Allocate a sufficently large buffer for output. */ - while (1) { - va_list apc; - /*@-sysunrecog -usedef@*/ va_copy(apc, ap); /*@=sysunrecog =usedef@*/ - nb = vsnprintf(msgbuf, msgnb, fmt, apc); - if (nb > -1 && nb < msgnb) - break; - if (nb > -1) /* glibc 2.1 (and later) */ - msgnb = nb+1; - else /* glibc 2.0 */ - msgnb *= 2; - msgbuf = xrealloc(msgbuf, msgnb); - } - msgbuf[msgnb - 1] = '\0'; - msg = msgbuf; + int cbrc = RPMLOG_DEFAULT; + int needexit = 0; /* Save copy of all messages at warning (or below == "more important"). */ - if (pri <= RPMLOG_WARNING) { - - if (recs == NULL) - recs = xmalloc((nrecs+2) * sizeof(*recs)); - else - recs = xrealloc(recs, (nrecs+2) * sizeof(*recs)); - recs[nrecs].code = code; - recs[nrecs].message = msg = xrealloc(msgbuf, strlen(msgbuf)+1); - msgbuf = NULL; /* XXX don't free at exit. */ + if (rec->pri <= RPMLOG_WARNING) { + recs = xrealloc(recs, (nrecs+2) * sizeof(*recs)); + recs[nrecs].code = rec->code; + recs[nrecs].pri = rec->pri; + recs[nrecs].message = xstrdup(rec->message); recs[nrecs+1].code = 0; recs[nrecs+1].message = NULL; ++nrecs; - - if (_rpmlogCallback) { - _rpmlogCallback(); - return; /* XXX Preserve legacy rpmError behavior. */ - } } - /* rpmMessage behavior */ - - switch (pri) { - case RPMLOG_INFO: - case RPMLOG_NOTICE: - msgout = stdout; - break; - - case RPMLOG_EMERG: - case RPMLOG_ALERT: - case RPMLOG_CRIT: - case RPMLOG_ERR: /* XXX Legacy rpmError behavior used stdout w/o prefix. */ - case RPMLOG_WARNING: - case RPMLOG_DEBUG: - break; + if (_rpmlogCallback) { + cbrc = _rpmlogCallback(rec, _rpmlogCallbackData); + needexit += cbrc & RPMLOG_EXIT; } - if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri]) - (void) fputs(_(rpmlogMsgPrefix[pri]), msgout); - - (void) fputs(msg, msgout); - (void) fflush(msgout); - msgbuf = _free(msgbuf); - if (pri <= RPMLOG_CRIT) + if (cbrc & RPMLOG_DEFAULT) { + cbrc = rpmlogDefault(rec); + needexit += cbrc & RPMLOG_EXIT; + } + + if (needexit) exit(EXIT_FAILURE); } -/*@=compmempass =nullstate@*/ -/*@=modfilesys@*/ void rpmlog (int code, const char *fmt, ...) { + unsigned pri = RPMLOG_PRI(code); + unsigned mask = RPMLOG_MASK(pri); va_list ap; + int n; + + if ((mask & rpmlogMask) == 0) + return; va_start(ap, fmt); - /*@-internalglobs@*/ /* FIX: shrug */ - vrpmlog(code, fmt, ap); - /*@=internalglobs@*/ + n = vsnprintf(NULL, 0, fmt, ap); va_end(ap); -} -int rpmErrorCode(void) -{ - return rpmlogCode(); -} + if (n >= -1) { + struct rpmlogRec_s rec; + size_t nb = n + 1; + char *msg = xmalloc(nb); -const char * rpmErrorString(void) -{ - return rpmlogMessage(); -} + va_start(ap, fmt); + n = vsnprintf(msg, nb, fmt, ap); + va_end(ap); -rpmlogCallback rpmErrorSetCallback(rpmlogCallback cb) -{ - return rpmlogSetCallback(cb); + rec.code = code; + rec.pri = pri; + rec.message = msg; + + dolog(&rec); + + free(msg); + } } +