xref: /openbsd/usr.bin/rsync/log.c (revision b0091597)
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