aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libbb/printf.c96
1 files changed, 0 insertions, 96 deletions
diff --git a/libbb/printf.c b/libbb/printf.c
deleted file mode 100644
index f0ddb862e..000000000
--- a/libbb/printf.c
+++ /dev/null
@@ -1,96 +0,0 @@
1/* vi: set sw=4 ts=4: */
2/*
3 * *printf implementations for busybox
4 *
5 * Copyright (C) 2003 Manuel Novoa III <mjn3@codepoet.org>
6 *
7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
8 */
9
10/* Mar 12, 2003 Manuel Novoa III
11 *
12 * While fwrite(), fputc(), fputs(), etc. all set the stream error flag
13 * on failure, the *printf functions are unique in that they can fail
14 * for reasons not related to the actual output itself. Among the possible
15 * reasons for failure which don't set the streams error indicator,
16 * SUSv3 lists EILSEQ, EINVAL, and ENOMEM.
17 *
18 * In some cases, it would be desirable to have a group of *printf()
19 * functions available that _always_ set the stream error indicator on
20 * failure. That would allow us to defer error checking until applet
21 * exit. Unfortunately, there is no standard way of setting a streams
22 * error indicator... even though we can clear it with clearerr().
23 */
24
25/* Mar 22, 2006 Rich Felker III
26 *
27 * Actually there is a portable way to set the error indicator. See below.
28 * It is not thread-safe as written due to a race condition with file
29 * descriptors but since BB is not threaded that does not matter. It can be
30 * made thread-safe at the expense of slightly more code, if this is ever
31 * needed in the future.
32 */
33
34#include <stdio.h>
35#include <stdarg.h>
36#include <unistd.h>
37#include <errno.h>
38#include "libbb.h"
39
40int bb_vfprintf(FILE * __restrict stream,
41 const char * __restrict format,
42 va_list arg)
43{
44 int rv;
45
46 if ((rv = vfprintf(stream, format, arg)) < 0) {
47 /* The following sequence portably sets the error flag for
48 * stream on any remotely POSIX-compliant implementation. */
49
50 int errno_save = errno;
51 int fd = fileno(stream);
52 int tmp = dup(fd);
53
54 fflush(stream);
55 close(fd);
56 /* Force an attempted write to nonexistant fd => EBADF */
57 fputc(0, stream);
58 fflush(stream);
59 /* Restore the stream's original fd */
60 dup2(tmp, fd);
61 close(tmp);
62 errno = errno_save;
63 }
64
65 return rv;
66}
67
68int bb_vprintf(const char * __restrict format, va_list arg)
69{
70 return bb_vfprintf(stdout, format, arg);
71}
72
73int bb_fprintf(FILE * __restrict stream,
74 const char * __restrict format, ...)
75{
76 va_list arg;
77 int rv;
78
79 va_start(arg, format);
80 rv = bb_vfprintf(stream, format, arg);
81 va_end(arg);
82
83 return rv;
84}
85
86int bb_printf(const char * __restrict format, ...)
87{
88 va_list arg;
89 int rv;
90
91 va_start(arg, format);
92 rv = bb_vfprintf(stdout, format, arg);
93 va_end(arg);
94
95 return rv;
96}