/* FIX: rpmlogMsgPrefix[] may be NULL */ static void dolog(rpmlogCtx ctx, struct rpmlogRec_s *rec, int saverec) { int cbrc = RPMLOG_DEFAULT; int needexit = 0; /* Save copy of all messages at warning (or below == "more important"). */ if (saverec) { ctx->recs = xrealloc(ctx->recs, (ctx->nrecs+2) * sizeof(*ctx->recs)); ctx->recs[ctx->nrecs].code = rec->code; ctx->recs[ctx->nrecs].pri = rec->pri; ctx->recs[ctx->nrecs].message = xstrdup(rec->message); ctx->recs[ctx->nrecs+1].code = 0; ctx->recs[ctx->nrecs+1].message = NULL; ctx->nrecs++; } if (ctx->cbfunc) { cbrc = ctx->cbfunc(rec, ctx->cbdata); needexit += cbrc & RPMLOG_EXIT; } if (cbrc & RPMLOG_DEFAULT) { cbrc = rpmlogDefault(ctx, rec); needexit += cbrc & RPMLOG_EXIT; } if (needexit) exit(EXIT_FAILURE); }
/* FIX: rpmlogMsgPrefix[] may be NULL */ static void vrpmlog (unsigned code, const char *fmt, va_list ap) { unsigned pri = RPMLOG_PRI(code); unsigned mask = RPMLOG_MASK(pri); #ifdef NOTYET unsigned fac = RPMLOG_FAC(code); #endif char *msgbuf, *msg; int msgnb = BUFSIZ, nb; int cbrc = RPMLOG_DEFAULT; int needexit = 0; struct rpmlogRec_s rec; if ((mask & rpmlogMask) == 0) return; msgbuf = xmalloc(msgnb); *msgbuf = '\0'; /* Allocate a sufficently large buffer for output. */ while (1) { va_list apc; va_copy(apc, ap); 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); va_end(apc); } msgbuf[msgnb - 1] = '\0'; msg = msgbuf; rec.code = code; rec.message = msg; rec.pri = pri; /* 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 = rec.code; recs[nrecs].pri = rec.pri; recs[nrecs].message = msg = xrealloc(msgbuf, strlen(msgbuf)+1); msgbuf = NULL; /* XXX don't free at exit. */ recs[nrecs+1].code = 0; recs[nrecs+1].message = NULL; ++nrecs; } if (_rpmlogCallback) { cbrc = _rpmlogCallback(&rec, _rpmlogCallbackData); needexit += cbrc & RPMLOG_EXIT; } if (cbrc & RPMLOG_DEFAULT) { cbrc = rpmlogDefault(&rec); needexit += cbrc & RPMLOG_EXIT; } msgbuf = _free(msgbuf); if (needexit) exit(EXIT_FAILURE); }