introduce and use bb_basename()
[oweals/busybox.git] / libbb / verror_msg.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Utility routines.
4  *
5  * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
6  *
7  * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8  */
9
10 #include "libbb.h"
11 #include <syslog.h>
12
13 smallint logmode = LOGMODE_STDIO;
14 const char *msg_eol = "\n";
15
16 void bb_verror_msg(const char *s, va_list p, const char* strerr)
17 {
18         /* va_copy is used because it is not portable
19          * to use va_list p twice */
20         va_list p2;
21         va_copy(p2, p);
22
23         if (!s) /* nomsg[_and_die] uses NULL fmt */
24                 s = ""; /* some libc don't like printf(NULL) */
25
26         if (logmode & LOGMODE_STDIO) {
27                 fflush(stdout);
28                 fprintf(stderr, "%s: ", applet_name);
29                 vfprintf(stderr, s, p);
30                 if (!strerr)
31                         fputs(msg_eol, stderr);
32                 else
33                         fprintf(stderr, "%s%s%s",
34                                         s[0] ? ": " : "",
35                                         strerr, msg_eol);
36         }
37         if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG)) {
38                 if (!strerr)
39                         vsyslog(LOG_ERR, s, p2);
40                 else  {
41                         char *msg;
42                         if (vasprintf(&msg, s, p2) < 0) {
43                                 fprintf(stderr, "%s: %s\n", applet_name, bb_msg_memory_exhausted);
44                                 xfunc_die();
45                         }
46                         syslog(LOG_ERR, "%s: %s", msg, strerr);
47                         free(msg);
48                 }
49         }
50         va_end(p2);
51 }