*: introduce and use ffulsh_all()
[platform/upstream/busybox.git] / libbb / info_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 void FAST_FUNC bb_info_msg(const char *s, ...)
14 {
15 #ifdef THIS_ONE_DOESNT_DO_SINGLE_WRITE
16         va_list p;
17         /* va_copy is used because it is not portable
18          * to use va_list p twice */
19         va_list p2;
20
21         va_start(p, s);
22         va_copy(p2, p);
23         if (logmode & LOGMODE_STDIO) {
24                 vprintf(s, p);
25                 fputs(msg_eol, stdout);
26         }
27         if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG))
28                 vsyslog(LOG_INFO, s, p2);
29         va_end(p2);
30         va_end(p);
31 #else
32         int used;
33         char *msg;
34         va_list p;
35
36         if (logmode == 0)
37                 return;
38
39         va_start(p, s);
40         used = vasprintf(&msg, s, p);
41         if (used < 0)
42                 return;
43
44         if (ENABLE_FEATURE_SYSLOG && (logmode & LOGMODE_SYSLOG))
45                 syslog(LOG_INFO, "%s", msg);
46         if (logmode & LOGMODE_STDIO) {
47                 fflush_all();
48                 /* used = strlen(msg); - must be true already */
49                 msg[used++] = '\n';
50                 full_write(STDOUT_FILENO, msg, used);
51         }
52
53         free(msg);
54         va_end(p);
55 #endif
56 }