1 /* $OpenBSD: log.c,v 1.10 2021/06/30 13:10:04 claudio Exp $ */
2 /*
3 * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17 #include <errno.h>
18 #include <stdarg.h>
19 #include <stdint.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23
24 #include "extern.h"
25
26 extern int verbose;
27
28 /*
29 * Log a message at level "level", starting at zero, which corresponds
30 * to the current verbosity level opts->verbose (whose verbosity starts
31 * at one).
32 */
33 void
rsync_log(int level,const char * fmt,...)34 rsync_log(int level, const char *fmt, ...)
35 {
36 char *buf = NULL;
37 va_list ap;
38
39 if (verbose < level + 1)
40 return;
41
42 if (fmt != NULL) {
43 va_start(ap, fmt);
44 if (vasprintf(&buf, fmt, ap) == -1) {
45 va_end(ap);
46 return;
47 }
48 va_end(ap);
49 }
50
51 if (level <= 0 && buf != NULL)
52 fprintf(stderr, "%s\n", buf);
53 else if (level > 0)
54 fprintf(stderr, "%s: %s%s\n", getprogname(),
55 (buf != NULL) ? ": " : "",
56 (buf != NULL) ? buf : "");
57 free(buf);
58 }
59
60 /*
61 * This reports an error---not a warning.
62 * However, it is not like errx(3) in that it does not exit.
63 */
64 void
rsync_errx(const char * fmt,...)65 rsync_errx(const char *fmt, ...)
66 {
67 char *buf = NULL;
68 va_list ap;
69
70 if (fmt != NULL) {
71 va_start(ap, fmt);
72 if (vasprintf(&buf, fmt, ap) == -1) {
73 va_end(ap);
74 return;
75 }
76 va_end(ap);
77 }
78
79 fprintf(stderr, "%s: error%s%s\n", getprogname(),
80 (buf != NULL) ? ": " : "",
81 (buf != NULL) ? buf : "");
82 free(buf);
83 }
84
85 /*
86 * This reports an error---not a warning.
87 * However, it is not like err(3) in that it does not exit.
88 */
89 void
rsync_err(const char * fmt,...)90 rsync_err(const char *fmt, ...)
91 {
92 char *buf = NULL;
93 va_list ap;
94 int er = errno;
95
96 if (fmt != NULL) {
97 va_start(ap, fmt);
98 if (vasprintf(&buf, fmt, ap) == -1) {
99 va_end(ap);
100 return;
101 }
102 va_end(ap);
103 }
104
105 fprintf(stderr, "%s: error%s%s: %s\n", getprogname(),
106 (buf != NULL) ? ": " : "",
107 (buf != NULL) ? buf : "", strerror(er));
108 free(buf);
109 }
110
111 /*
112 * Prints a non-terminal error message, that is, when reporting on the
113 * chain of functions from which the actual warning occurred.
114 */
115 void
rsync_errx1(const char * fmt,...)116 rsync_errx1(const char *fmt, ...)
117 {
118 char *buf = NULL;
119 va_list ap;
120
121 if (verbose < 1)
122 return;
123
124 if (fmt != NULL) {
125 va_start(ap, fmt);
126 if (vasprintf(&buf, fmt, ap) == -1) {
127 va_end(ap);
128 return;
129 }
130 va_end(ap);
131 }
132
133 fprintf(stderr, "%s: error%s%s\n", getprogname(),
134 (buf != NULL) ? ": " : "",
135 (buf != NULL) ? buf : "");
136 free(buf);
137 }
138
139 /*
140 * Prints a warning message.
141 */
142 void
rsync_warnx(const char * fmt,...)143 rsync_warnx(const char *fmt, ...)
144 {
145 char *buf = NULL;
146 va_list ap;
147
148 if (fmt != NULL) {
149 va_start(ap, fmt);
150 if (vasprintf(&buf, fmt, ap) == -1) {
151 va_end(ap);
152 return;
153 }
154 va_end(ap);
155 }
156
157 fprintf(stderr, "%s: warning%s%s\n", getprogname(),
158 (buf != NULL) ? ": " : "",
159 (buf != NULL) ? buf : "");
160 free(buf);
161 }
162
163 /*
164 * Prints a warning with an errno.
165 * It uses a level detector for when to inhibit printing.
166 */
167 void
rsync_warn(int level,const char * fmt,...)168 rsync_warn(int level, const char *fmt, ...)
169 {
170 char *buf = NULL;
171 va_list ap;
172 int er = errno;
173
174 if (verbose < level)
175 return;
176
177 if (fmt != NULL) {
178 va_start(ap, fmt);
179 if (vasprintf(&buf, fmt, ap) == -1) {
180 va_end(ap);
181 return;
182 }
183 va_end(ap);
184 }
185
186 fprintf(stderr, "%s: warning%s%s: %s\n", getprogname(),
187 (buf != NULL) ? ": " : "",
188 (buf != NULL) ? buf : "", strerror(er));
189 free(buf);
190 }
191