1*b0091597Sclaudio /* $OpenBSD: log.c,v 1.10 2021/06/30 13:10:04 claudio Exp $ */
260a32ee9Sbenno /*
360a32ee9Sbenno * Copyright (c) 2019 Kristaps Dzonsons <kristaps@bsd.lv>
460a32ee9Sbenno *
560a32ee9Sbenno * Permission to use, copy, modify, and distribute this software for any
660a32ee9Sbenno * purpose with or without fee is hereby granted, provided that the above
760a32ee9Sbenno * copyright notice and this permission notice appear in all copies.
860a32ee9Sbenno *
960a32ee9Sbenno * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1060a32ee9Sbenno * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1160a32ee9Sbenno * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1260a32ee9Sbenno * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1360a32ee9Sbenno * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1460a32ee9Sbenno * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1560a32ee9Sbenno * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1660a32ee9Sbenno */
1760a32ee9Sbenno #include <errno.h>
1860a32ee9Sbenno #include <stdarg.h>
1960a32ee9Sbenno #include <stdint.h>
2060a32ee9Sbenno #include <stdio.h>
2160a32ee9Sbenno #include <stdlib.h>
2260a32ee9Sbenno #include <string.h>
2360a32ee9Sbenno
2460a32ee9Sbenno #include "extern.h"
2560a32ee9Sbenno
26b2a7eac7Sbenno extern int verbose;
27b2a7eac7Sbenno
2860a32ee9Sbenno /*
2960a32ee9Sbenno * Log a message at level "level", starting at zero, which corresponds
3060a32ee9Sbenno * to the current verbosity level opts->verbose (whose verbosity starts
3160a32ee9Sbenno * at one).
3260a32ee9Sbenno */
3360a32ee9Sbenno void
rsync_log(int level,const char * fmt,...)347ddad9c7Sderaadt rsync_log(int level, const char *fmt, ...)
3560a32ee9Sbenno {
3660a32ee9Sbenno char *buf = NULL;
3760a32ee9Sbenno va_list ap;
3860a32ee9Sbenno
39b2a7eac7Sbenno if (verbose < level + 1)
4060a32ee9Sbenno return;
4160a32ee9Sbenno
42ed5cc9fbSderaadt if (fmt != NULL) {
4360a32ee9Sbenno va_start(ap, fmt);
4495af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
4560a32ee9Sbenno va_end(ap);
4660a32ee9Sbenno return;
4760a32ee9Sbenno }
4860a32ee9Sbenno va_end(ap);
4960a32ee9Sbenno }
5060a32ee9Sbenno
51ed5cc9fbSderaadt if (level <= 0 && buf != NULL)
5260a32ee9Sbenno fprintf(stderr, "%s\n", buf);
5360a32ee9Sbenno else if (level > 0)
547ddad9c7Sderaadt fprintf(stderr, "%s: %s%s\n", getprogname(),
55ed5cc9fbSderaadt (buf != NULL) ? ": " : "",
56ed5cc9fbSderaadt (buf != NULL) ? buf : "");
5760a32ee9Sbenno free(buf);
5860a32ee9Sbenno }
5960a32ee9Sbenno
6060a32ee9Sbenno /*
6160a32ee9Sbenno * This reports an error---not a warning.
6260a32ee9Sbenno * However, it is not like errx(3) in that it does not exit.
6360a32ee9Sbenno */
6460a32ee9Sbenno void
rsync_errx(const char * fmt,...)657ddad9c7Sderaadt rsync_errx(const char *fmt, ...)
6660a32ee9Sbenno {
6760a32ee9Sbenno char *buf = NULL;
6860a32ee9Sbenno va_list ap;
6960a32ee9Sbenno
70ed5cc9fbSderaadt if (fmt != NULL) {
7160a32ee9Sbenno va_start(ap, fmt);
7295af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
7360a32ee9Sbenno va_end(ap);
7460a32ee9Sbenno return;
7560a32ee9Sbenno }
7660a32ee9Sbenno va_end(ap);
7760a32ee9Sbenno }
7860a32ee9Sbenno
797ddad9c7Sderaadt fprintf(stderr, "%s: error%s%s\n", getprogname(),
8055cb9f91Sbenno (buf != NULL) ? ": " : "",
8155cb9f91Sbenno (buf != NULL) ? buf : "");
8260a32ee9Sbenno free(buf);
8360a32ee9Sbenno }
8460a32ee9Sbenno
8560a32ee9Sbenno /*
8660a32ee9Sbenno * This reports an error---not a warning.
8760a32ee9Sbenno * However, it is not like err(3) in that it does not exit.
8860a32ee9Sbenno */
8960a32ee9Sbenno void
rsync_err(const char * fmt,...)907ddad9c7Sderaadt rsync_err(const char *fmt, ...)
9160a32ee9Sbenno {
9260a32ee9Sbenno char *buf = NULL;
9360a32ee9Sbenno va_list ap;
9460a32ee9Sbenno int er = errno;
9560a32ee9Sbenno
96ed5cc9fbSderaadt if (fmt != NULL) {
9760a32ee9Sbenno va_start(ap, fmt);
9895af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
9960a32ee9Sbenno va_end(ap);
10060a32ee9Sbenno return;
10160a32ee9Sbenno }
10260a32ee9Sbenno va_end(ap);
10360a32ee9Sbenno }
10460a32ee9Sbenno
1057ddad9c7Sderaadt fprintf(stderr, "%s: error%s%s: %s\n", getprogname(),
10655cb9f91Sbenno (buf != NULL) ? ": " : "",
10755cb9f91Sbenno (buf != NULL) ? buf : "", strerror(er));
10860a32ee9Sbenno free(buf);
10960a32ee9Sbenno }
11060a32ee9Sbenno
11160a32ee9Sbenno /*
11260a32ee9Sbenno * Prints a non-terminal error message, that is, when reporting on the
11360a32ee9Sbenno * chain of functions from which the actual warning occurred.
11460a32ee9Sbenno */
11560a32ee9Sbenno void
rsync_errx1(const char * fmt,...)1167ddad9c7Sderaadt rsync_errx1(const char *fmt, ...)
11760a32ee9Sbenno {
11860a32ee9Sbenno char *buf = NULL;
11960a32ee9Sbenno va_list ap;
12060a32ee9Sbenno
121b2a7eac7Sbenno if (verbose < 1)
12260a32ee9Sbenno return;
12360a32ee9Sbenno
124ed5cc9fbSderaadt if (fmt != NULL) {
12560a32ee9Sbenno va_start(ap, fmt);
12695af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
12760a32ee9Sbenno va_end(ap);
12860a32ee9Sbenno return;
12960a32ee9Sbenno }
13060a32ee9Sbenno va_end(ap);
13160a32ee9Sbenno }
13260a32ee9Sbenno
1337ddad9c7Sderaadt fprintf(stderr, "%s: error%s%s\n", getprogname(),
13455cb9f91Sbenno (buf != NULL) ? ": " : "",
13555cb9f91Sbenno (buf != NULL) ? buf : "");
13660a32ee9Sbenno free(buf);
13760a32ee9Sbenno }
13860a32ee9Sbenno
13960a32ee9Sbenno /*
14060a32ee9Sbenno * Prints a warning message.
14160a32ee9Sbenno */
14260a32ee9Sbenno void
rsync_warnx(const char * fmt,...)1437ddad9c7Sderaadt rsync_warnx(const char *fmt, ...)
14460a32ee9Sbenno {
14560a32ee9Sbenno char *buf = NULL;
14660a32ee9Sbenno va_list ap;
14760a32ee9Sbenno
148ed5cc9fbSderaadt if (fmt != NULL) {
14960a32ee9Sbenno va_start(ap, fmt);
15095af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
15160a32ee9Sbenno va_end(ap);
15260a32ee9Sbenno return;
15360a32ee9Sbenno }
15460a32ee9Sbenno va_end(ap);
15560a32ee9Sbenno }
15660a32ee9Sbenno
1577ddad9c7Sderaadt fprintf(stderr, "%s: warning%s%s\n", getprogname(),
15855cb9f91Sbenno (buf != NULL) ? ": " : "",
15955cb9f91Sbenno (buf != NULL) ? buf : "");
16060a32ee9Sbenno free(buf);
16160a32ee9Sbenno }
16260a32ee9Sbenno
16360a32ee9Sbenno /*
16460a32ee9Sbenno * Prints a warning with an errno.
16560a32ee9Sbenno * It uses a level detector for when to inhibit printing.
16660a32ee9Sbenno */
16760a32ee9Sbenno void
rsync_warn(int level,const char * fmt,...)1687ddad9c7Sderaadt rsync_warn(int level, const char *fmt, ...)
16960a32ee9Sbenno {
17060a32ee9Sbenno char *buf = NULL;
17160a32ee9Sbenno va_list ap;
17260a32ee9Sbenno int er = errno;
17360a32ee9Sbenno
174b2a7eac7Sbenno if (verbose < level)
17560a32ee9Sbenno return;
17660a32ee9Sbenno
177ed5cc9fbSderaadt if (fmt != NULL) {
17860a32ee9Sbenno va_start(ap, fmt);
17995af8abfSderaadt if (vasprintf(&buf, fmt, ap) == -1) {
18060a32ee9Sbenno va_end(ap);
18160a32ee9Sbenno return;
18260a32ee9Sbenno }
18360a32ee9Sbenno va_end(ap);
18460a32ee9Sbenno }
18560a32ee9Sbenno
1867ddad9c7Sderaadt fprintf(stderr, "%s: warning%s%s: %s\n", getprogname(),
18755cb9f91Sbenno (buf != NULL) ? ": " : "",
18855cb9f91Sbenno (buf != NULL) ? buf : "", strerror(er));
18960a32ee9Sbenno free(buf);
19060a32ee9Sbenno }
191