7 #include <rpm/rpmlog.h>
11 static rpmlogRec recs = NULL;
14 int code; /* unused */
15 rpmlogLvl pri; /* priority */
16 char * message; /* log message string */
19 int rpmlogGetNrecs(void)
26 if (recs != NULL && nrecs > 0)
27 return recs[nrecs-1].code;
32 const char * rpmlogMessage(void)
34 if (recs != NULL && nrecs > 0)
35 return recs[nrecs-1].message;
36 return _("(no error)");
39 const char * rpmlogRecMessage(rpmlogRec rec)
42 return (rec->message);
45 rpmlogLvl rpmlogRecPriority(rpmlogRec rec)
51 void rpmlogPrint(FILE *f)
59 for (i = 0; i < nrecs; i++) {
60 rpmlogRec rec = recs + i;
61 if (rec->message && *rec->message)
62 fprintf(f, " %s", rec->message);
66 void rpmlogClose (void)
71 for (i = 0; i < nrecs; i++) {
72 rpmlogRec rec = recs + i;
73 rec->message = _free(rec->message);
79 void rpmlogOpen (const char *ident, int option,
84 static unsigned rpmlogMask = RPMLOG_UPTO( RPMLOG_NOTICE );
87 static unsigned rpmlogFacility = RPMLOG_USER;
90 int rpmlogSetMask (int mask)
92 int omask = rpmlogMask;
98 static rpmlogCallback _rpmlogCallback = NULL;
99 static rpmlogCallbackData _rpmlogCallbackData = NULL;
101 rpmlogCallback rpmlogSetCallback(rpmlogCallback cb, rpmlogCallbackData data)
103 rpmlogCallback ocb = _rpmlogCallback;
104 _rpmlogCallback = cb;
105 _rpmlogCallbackData = data;
109 static FILE * _stdlog = NULL;
111 static int rpmlogDefault(rpmlogRec rec)
113 FILE *msgout = (_stdlog ? _stdlog : stderr);
118 msgout = (_stdlog ? _stdlog : stdout);
130 (void) fputs(rpmlogLevelPrefix(rec->pri), msgout);
132 (void) fputs(rec->message, msgout);
133 (void) fflush(msgout);
135 return (rec->pri <= RPMLOG_CRIT ? RPMLOG_EXIT : 0);
139 FILE * rpmlogSetFile(FILE * fp)
141 FILE * ofp = _stdlog;
146 static const char * const rpmlogMsgPrefix[] = {
147 N_("fatal error: "),/*!< RPMLOG_EMERG */
148 N_("fatal error: "),/*!< RPMLOG_ALERT */
149 N_("fatal error: "),/*!< RPMLOG_CRIT */
150 N_("error: "), /*!< RPMLOG_ERR */
151 N_("warning: "), /*!< RPMLOG_WARNING */
152 "", /*!< RPMLOG_NOTICE */
153 "", /*!< RPMLOG_INFO */
154 "D: ", /*!< RPMLOG_DEBUG */
157 const char * rpmlogLevelPrefix(rpmlogLvl pri)
159 const char * prefix = "";
160 if (rpmlogMsgPrefix[pri] && *rpmlogMsgPrefix[pri])
161 prefix = _(rpmlogMsgPrefix[pri]);
165 /* FIX: rpmlogMsgPrefix[] dependent, not unqualified */
166 /* FIX: rpmlogMsgPrefix[] may be NULL */
167 static void dolog (struct rpmlogRec_s *rec)
169 int cbrc = RPMLOG_DEFAULT;
172 /* Save copy of all messages at warning (or below == "more important"). */
173 if (rec->pri <= RPMLOG_WARNING) {
174 recs = xrealloc(recs, (nrecs+2) * sizeof(*recs));
175 recs[nrecs].code = rec->code;
176 recs[nrecs].pri = rec->pri;
177 recs[nrecs].message = xstrdup(rec->message);
178 recs[nrecs+1].code = 0;
179 recs[nrecs+1].message = NULL;
183 if (_rpmlogCallback) {
184 cbrc = _rpmlogCallback(rec, _rpmlogCallbackData);
185 needexit += cbrc & RPMLOG_EXIT;
188 if (cbrc & RPMLOG_DEFAULT) {
189 cbrc = rpmlogDefault(rec);
190 needexit += cbrc & RPMLOG_EXIT;
197 void rpmlog (int code, const char *fmt, ...)
199 unsigned pri = RPMLOG_PRI(code);
200 unsigned mask = RPMLOG_MASK(pri);
204 if ((mask & rpmlogMask) == 0)
208 n = vsnprintf(NULL, 0, fmt, ap);
212 struct rpmlogRec_s rec;
214 char *msg = xmalloc(nb);
217 n = vsnprintf(msg, nb, fmt, ap);