summaryrefslogtreecommitdiffstats
path: root/crypto/cts.c
AgeCommit message (Expand)Author
2020-07-16crypto: algapi - use common mechanism for inheriting flagsEric Biggers
2020-03-06crypto: cts - simplify error handling in crypto_cts_create()Eric Biggers
2020-01-09crypto: skcipher - pass instance to crypto_grab_skcipher()Eric Biggers
2020-01-09crypto: remove propagation of CRYPTO_TFM_RES_* flagsEric Biggers
2019-04-18crypto: run initcalls for generic implementations earlierEric Biggers
2019-04-08crypto: cts - don't support empty messagesEric Biggers
2018-04-21crypto: remove several VLAsSalvatore Mesoraca
2017-11-03crypto: remove redundant backlog checks on EBUSYGilad Ben-Yossef
2017-02-11crypto: algapi - make crypto_xor() and crypto_inc() alignment agnosticArd Biesheuvel
2017-01-13crypto: Replaced gcc specific attributes with macros from compiler.hGideon Israel Dsouza
2016-11-01crypto: skcipher - Get rid of crypto_spawn_skcipher2()Eric Biggers
2016-11-01crypto: skcipher - Get rid of crypto_grab_skcipher2()Eric Biggers
2016-07-18crypto: cts - Convert to skcipherHerbert Xu
2015-01-20crypto: cts - Weed out non-CBC algorithmsHerbert Xu
2015-01-20crypto: cts - Remove bogus use of seqivHerbert Xu
2014-11-26crypto: include crypto- module prefix in templateKees Cook
2014-10-17crypto: memzero_explicit - make sure to clear out sensitive dataDaniel Borkmann
2013-02-04crypto: use ERR_CASTJulia Lawall
2008-06-02[CRYPTO] cts: Init SG tablesAlexey Dobriyan
2008-04-21[CRYPTO] cts: Add CTS mode required for Kerberos AES supportKevin Coffman
='#n159'>159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227
/* $Id: log.c,v 1.4 2007-10-19 22:17:29 nicm Exp $ */

/*
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <sys/types.h>

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
#include <time.h>

#include "tmux.h"

/* Logging enabled. */
int	 log_enabled;

/* Log stream or NULL to use syslog. */
FILE	*log_stream;

/* Debug level. */
int	 log_level;

/* Open logging. */
void
log_open(FILE *f, int facility, int level)
{
	log_stream = f;
	if (f != NULL)
		setlinebuf(f);

	log_level = level;

	if (f == NULL)
		openlog(__progname, LOG_PID|LOG_NDELAY, facility);
	tzset();

	log_enabled = 1;
}

/* Close logging. */
void
log_close(void)
{
	if (log_stream != NULL && log_stream != stderr) /* XXX */
		fclose(log_stream);

	log_enabled = 0;
}

/* Write a log message. */
void
log_write(FILE *f, int priority, const char *msg, ...)
{
	va_list	ap;

	va_start(ap, msg);
	log_vwrite(f, priority, msg, ap);
	va_end(ap);
}

/* Write a log message. */
void
log_vwrite(FILE *f, int priority, const char *msg, va_list ap)
{
	char	*fmt;

	if (!log_enabled)
		return;

	if (f == NULL)
		f = log_stream;
	if (f == NULL) {
		vsyslog(priority, msg, ap);
		return;
	}

	if (asprintf(&fmt, "%s\n", msg) == -1)
		exit(1);
	if (vfprintf(f, fmt, ap) == -1)
		exit(1);
	fflush(f);
	free(fmt);
}

/* Log a warning with error string. */
void printflike1
log_warn(const char *msg, ...)
{
	va_list	 ap;
	char	*fmt;

	if (!log_enabled)
		return;

	va_start(ap, msg);
	if (asprintf(&fmt, "%s: %s", msg, strerror(errno)) == -1)
		exit(1);
	log_vwrite(NULL, LOG_CRIT, fmt, ap);
	free(fmt);
	va_end(ap);
}

/* Log a warning. */
void printflike1
log_warnx(const char *msg, ...)
{
	va_list	ap;

	va_start(ap, msg);
	log_vwrite(NULL, LOG_CRIT, msg, ap);
	va_end(ap);
}

/* Log an informational message. */
void printflike1
log_info(const char *msg, ...)
{
	va_list	ap;

	if (log_level > -1) {
		va_start(ap, msg);
		if (log_stream == stderr) /* XXX */
			log_vwrite(stdout, LOG_INFO, msg, ap);
		else
			log_vwrite(NULL, LOG_INFO, msg, ap);
		va_end(ap);
	}
}

/* Log a debug message. */
void printflike1
log_debug(const char *msg, ...)
{
	va_list	ap;

	if (log_level > 0) {
		va_start(ap, msg);
		log_vwrite(NULL, LOG_DEBUG, msg, ap);
		va_end(ap);
	}
}

/* Log a debug message at level 2. */
void printflike1
log_debug2(const char *msg, ...)
{
	va_list	ap;

	if (log_level > 1) {
		va_start(ap, msg);
		log_vwrite(NULL, LOG_DEBUG, msg, ap);
		va_end(ap);
	}
}

/* Log a debug message at level 3. */
void printflike1
log_debug3(const char *msg, ...)
{
	va_list	ap;

	if (log_level > 2) {
		va_start(ap, msg);
		log_vwrite(NULL, LOG_DEBUG, msg, ap);
		va_end(ap);
	}
}

/* Log a critical error, with error string if necessary, and die. */
__dead void
log_vfatal(const char *msg, va_list ap)
{
	char	*fmt;

	if (!log_enabled)
		exit(1);

	if (errno != 0) {
		if (asprintf(&fmt, "fatal: %s: %s", msg, strerror(errno)) == -1)
			exit(1);
		log_vwrite(NULL, LOG_CRIT, fmt, ap);
	} else {
		if (asprintf(&fmt, "fatal: %s", msg) == -1)
			exit(1);
		log_vwrite(NULL, LOG_CRIT, fmt, ap);
	}
	free(fmt);

	exit(1);
}

/* Log a critical error, with error string, and die. */
__dead void
log_fatal(const char *msg, ...)
{
	va_list	ap;

	va_start(ap, msg);
	log_vfatal(msg, ap);
}

/* Log a critical error and die. */
__dead void
log_fatalx(const char *msg, ...)
{
	va_list	ap;

	errno = 0;
	va_start(ap, msg);
	log_vfatal(msg, ap);
}