10 /*@access rpmlogRec @*/
13 static /*@only@*/ /*@null@*/ rpmlogRec recs = NULL;
16 * Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
17 * @param this memory to free
20 /*@unused@*/ static inline /*@null@*/ void * _free(/*@only@*/ /*@null@*/ const void * this) {
21 if (this != NULL) free((void *)this);
25 int rpmlogGetNrecs(void)
32 if (recs != NULL && nrecs > 0)
33 return recs[nrecs-1].code;
38 const char * rpmlogMessage(void)
40 if (recs != NULL && nrecs > 0)
41 return recs[nrecs-1].message;
42 return _("(no error)");
45 void rpmlogPrint(FILE *f)
52 for (i = 0; i < nrecs; i++) {
53 rpmlogRec rec = recs + i;
54 if (rec->message && *rec->message)
55 fprintf(f, " %s", rec->message);
59 void rpmlogClose (void)
63 for (i = 0; i < nrecs; i++) {
64 rpmlogRec rec = recs + i;
65 rec->message = _free(rec->message);
71 void rpmlogOpen (/*@unused@*/ const char *ident, /*@unused@*/ int option,
72 /*@unused@*/ int facility)
76 static int rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE );
77 static /*@unused@*/ int rpmlogFacility = RPMLOG_USER;
79 int rpmlogSetMask (int mask)
81 int omask = rpmlogMask;
87 static /*@null@*/ rpmlogCallback _rpmlogCallback = NULL;
89 rpmlogCallback rpmlogSetCallback(rpmlogCallback cb)
91 rpmlogCallback ocb = _rpmlogCallback;
96 static char *rpmlogMsgPrefix[] = {
97 N_("fatal error: "),/*!< RPMLOG_EMERG */
98 N_("fatal error: "),/*!< RPMLOG_ALERT */
99 N_("fatal error: "),/*!< RPMLOG_CRIT */
100 N_("error: "), /*!< RPMLOG_ERR */
101 N_("warning: "), /*!< RPMLOG_WARNING */
102 "", /*!< RPMLOG_NOTICE */
103 "", /*!< RPMLOG_INFO */
104 "D: ", /*!< RPMLOG_DEBUG */
107 #if !defined(HAVE_VSNPRINTF)
108 static inline int vsnprintf(char * buf, /*@unused@*/ int nb,
109 const char * fmt, va_list ap)
111 return vsprintf(buf, fmt, ap);
115 static void vrpmlog (unsigned code, const char *fmt, va_list ap)
117 int pri = RPMLOG_PRI(code);
118 int mask = RPMLOG_MASK(pri);
119 /*@unused@*/ int fac = RPMLOG_FAC(code);
121 int msgnb = BUFSIZ, nb;
122 FILE * msgout = stderr;
124 if ((mask & rpmlogMask) == 0)
127 msgbuf = xmalloc(msgnb);
130 /* Allocate a sufficently large buffer for output. */
133 /*@-sysunrecog -usedef@*/ __va_copy(apc, ap); /*@=sysunrecog =usedef@*/
134 /*@-unrecog@*/ nb = vsnprintf(msgbuf, msgnb, fmt, apc); /*@=unrecog@*/
135 if (nb > -1 && nb < msgnb)
137 if (nb > -1) /* glibc 2.1 */
141 msgbuf = xrealloc(msgbuf, msgnb);
143 msgbuf[msgnb - 1] = '\0';
146 /* Save copy of all messages at warning (or below == "more important"). */
147 if (pri <= RPMLOG_WARNING) {
150 recs = xmalloc((nrecs+2) * sizeof(*recs));
152 recs = xrealloc(recs, (nrecs+2) * sizeof(*recs));
153 recs[nrecs].code = code;
154 recs[nrecs].message = msg = msgbuf;
156 recs[nrecs+1].code = 0;
157 recs[nrecs+1].message = NULL;
161 if (_rpmlogCallback) {
163 return; /* XXX Preserve legacy rpmError behavior. */
167 /* rpmMessage behavior */
178 case RPMLOG_ERR: /* XXX Legacy rpmError behavior used stdout w/o prefix. */
184 if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri])
185 (void) fputs(_(rpmlogMsgPrefix[pri]), msgout);
187 (void) fputs(msg, msgout);
188 (void) fflush(msgout);
189 msgbuf = _free(msgbuf);
190 if (pri <= RPMLOG_CRIT)
194 void rpmlog (int code, const char *fmt, ...)
199 vrpmlog(code, fmt, ap);
203 int rpmErrorCode(void)
208 const char * rpmErrorString(void)
210 return rpmlogMessage();
213 rpmlogCallback rpmErrorSetCallback(rpmlogCallback cb)
215 return rpmlogSetCallback(cb);