10 /*@access rpmlogRec @*/
13 static /*@only@*/ /*@null@*/ rpmlogRec recs = NULL;
15 int rpmlogGetNrecs(void)
23 return recs[nrecs-1].code;
28 const char * rpmlogMessage(void)
31 return recs[nrecs-1].message;
32 return _("(no error)");
35 void rpmlogPrint(FILE *f)
42 for (i = 0; i < nrecs; i++) {
43 rpmlogRec rec = recs + i;
44 if (rec->message && *rec->message)
45 fprintf(f, " %s", rec->message);
49 void rpmlogClose (void)
53 for (i = 0; i < nrecs; i++) {
54 rpmlogRec rec = recs + i;
56 free((void *)rec->message);
65 void rpmlogOpen (/*@unused@*/ const char *ident, /*@unused@*/ int option,
66 /*@unused@*/ int facility)
70 static int rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE );
71 static /*@unused@*/ int rpmlogFacility = RPMLOG_USER;
73 int rpmlogSetMask (int mask)
75 int omask = rpmlogMask;
81 static /*@null@*/ rpmlogCallback _rpmlogCallback = NULL;
83 rpmlogCallback rpmlogSetCallback(rpmlogCallback cb)
85 rpmlogCallback ocb = _rpmlogCallback;
90 static char *rpmlogMsgPrefix[] = {
91 N_("fatal error: "),/*!< RPMLOG_EMERG */
92 N_("fatal error: "),/*!< RPMLOG_ALERT */
93 N_("fatal error: "),/*!< RPMLOG_CRIT */
94 N_("error: "), /*!< RPMLOG_ERR */
95 N_("warning: "), /*!< RPMLOG_WARNING */
96 "", /*!< RPMLOG_NOTICE */
97 "", /*!< RPMLOG_INFO */
98 "D: ", /*!< RPMLOG_DEBUG */
101 #if !defined(HAVE_VSNPRINTF)
102 static inline int vsnprintf(char * buf, /*@unused@*/ int nb,
103 const char * fmt, va_list ap)
105 return vsprintf(buf, fmt, ap);
109 static void vrpmlog (unsigned code, const char *fmt, va_list ap)
111 int pri = RPMLOG_PRI(code);
112 int mask = RPMLOG_MASK(pri);
113 /*@unused@*/ int fac = RPMLOG_FAC(code);
116 int msgnb = BUFSIZ, nb;
117 FILE * msgout = stderr;
120 if ((mask & rpmlogMask) == 0)
123 msgbuf = xmalloc(msgnb);
126 /* Allocate a sufficently large buffer for output. */
129 /*@-sysunrecog@*/ __va_copy(apc, ap); /*@=sysunrecog@*/
130 /*@-unrecog@*/ nb = vsnprintf(msgbuf, msgnb, fmt, apc); /*@=unrecog@*/
131 if (nb > -1 && nb < msgnb)
133 if (nb > -1) /* glibc 2.1 */
137 msgbuf = xrealloc(msgbuf, msgnb);
139 msgbuf[msgnb - 1] = '\0';
142 /* Save copy of all messages at warning (or below == "more important"). */
143 if (pri <= RPMLOG_WARNING) {
146 recs = xmalloc((nrecs+2) * sizeof(*recs));
148 recs = xrealloc(recs, (nrecs+2) * sizeof(*recs));
149 recs[nrecs+1].code = 0;
150 recs[nrecs+1].message = NULL;
155 rec->message = msgbuf;
158 if (_rpmlogCallback) {
160 return; /* XXX Preserve legacy rpmError behavior. */
164 /* rpmMessage behavior */
175 case RPMLOG_ERR: /* XXX Legacy rpmError behavior used stdout w/o prefix. */
181 if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri])
182 fputs(_(rpmlogMsgPrefix[pri]), msgout);
188 if (pri <= RPMLOG_CRIT)
192 void rpmlog (int code, const char *fmt, ...)
197 vrpmlog(code, fmt, ap);
201 int rpmErrorCode(void)
206 const char * rpmErrorString(void)
208 return rpmlogMessage();
211 rpmlogCallback rpmErrorSetCallback(rpmlogCallback cb)
213 return rpmlogSetCallback(cb);