11 static rpmlogRec recs = NULL;
13 int rpmlogGetNrecs(void)
20 if (recs != NULL && nrecs > 0)
21 return recs[nrecs-1].code;
26 const char * rpmlogMessage(void)
28 if (recs != NULL && nrecs > 0)
29 return recs[nrecs-1].message;
30 return _("(no error)");
33 void rpmlogPrint(FILE *f)
41 for (i = 0; i < nrecs; i++) {
42 rpmlogRec rec = recs + i;
43 if (rec->message && *rec->message)
44 fprintf(f, " %s", rec->message);
48 void rpmlogClose (void)
53 for (i = 0; i < nrecs; i++) {
54 rpmlogRec rec = recs + i;
55 rec->message = _free(rec->message);
61 void rpmlogOpen (const char *ident, int option,
66 static unsigned rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE );
69 static unsigned rpmlogFacility = RPMLOG_USER;
72 int rpmlogSetMask (int mask)
74 int omask = rpmlogMask;
80 static rpmlogCallback _rpmlogCallback = NULL;
82 rpmlogCallback rpmlogSetCallback(rpmlogCallback cb)
84 rpmlogCallback ocb = _rpmlogCallback;
89 static FILE * _stdlog = NULL;
91 FILE * rpmlogSetFile(FILE * fp)
98 static char *rpmlogMsgPrefix[] = {
99 N_("fatal error: "),/*!< RPMLOG_EMERG */
100 N_("fatal error: "),/*!< RPMLOG_ALERT */
101 N_("fatal error: "),/*!< RPMLOG_CRIT */
102 N_("error: "), /*!< RPMLOG_ERR */
103 N_("warning: "), /*!< RPMLOG_WARNING */
104 "", /*!< RPMLOG_NOTICE */
105 "", /*!< RPMLOG_INFO */
106 "D: ", /*!< RPMLOG_DEBUG */
109 #if !defined(HAVE_VSNPRINTF)
110 static inline int vsnprintf(char * buf, int nb,
111 const char * fmt, va_list ap)
113 return vsprintf(buf, fmt, ap);
117 /* FIX: rpmlogMsgPrefix[] dependent, not unqualified */
118 /* FIX: rpmlogMsgPrefix[] may be NULL */
119 static void vrpmlog (unsigned code, const char *fmt, va_list ap)
121 unsigned pri = RPMLOG_PRI(code);
122 unsigned mask = RPMLOG_MASK(pri);
124 unsigned fac = RPMLOG_FAC(code);
127 int msgnb = BUFSIZ, nb;
128 FILE * msgout = (_stdlog ? _stdlog : stderr);
130 if ((mask & rpmlogMask) == 0)
133 msgbuf = xmalloc(msgnb);
136 /* Allocate a sufficently large buffer for output. */
140 nb = vsnprintf(msgbuf, msgnb, fmt, apc);
141 if (nb > -1 && nb < msgnb)
143 if (nb > -1) /* glibc 2.1 (and later) */
147 msgbuf = xrealloc(msgbuf, msgnb);
150 msgbuf[msgnb - 1] = '\0';
153 /* Save copy of all messages at warning (or below == "more important"). */
154 if (pri <= RPMLOG_WARNING) {
157 recs = xmalloc((nrecs+2) * sizeof(*recs));
159 recs = xrealloc(recs, (nrecs+2) * sizeof(*recs));
160 recs[nrecs].code = code;
161 recs[nrecs].message = msg = xrealloc(msgbuf, strlen(msgbuf)+1);
162 msgbuf = NULL; /* XXX don't free at exit. */
163 recs[nrecs+1].code = 0;
164 recs[nrecs+1].message = NULL;
167 if (_rpmlogCallback) {
168 /* FIX: useless callback */
170 return; /* XXX Preserve legacy rpmError behavior. */
174 /* rpmMessage behavior */
179 msgout = (_stdlog ? _stdlog : stdout);
185 case RPMLOG_ERR: /* XXX Legacy rpmError behavior used stdout w/o prefix. */
191 if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri])
192 (void) fputs(_(rpmlogMsgPrefix[pri]), msgout);
194 (void) fputs(msg, msgout);
195 (void) fflush(msgout);
196 msgbuf = _free(msgbuf);
197 if (pri <= RPMLOG_CRIT)
201 void rpmlog (int code, const char *fmt, ...)
207 vrpmlog(code, fmt, ap);