Esempio n. 1
0
File: e.c Progetto: marchon/sophia
void sp_vef(spe *e, int type, va_list args)
{
	sp_lock(&e->lock);
	if (e->type & SPEF) {
		sp_unlock(&e->lock);
		return;
	}
	const char *fmt;
	int len;
	uint32_t epoch;

	e->type = type;
	switch (type & ~SPEF) {
	case SPE: {
		fmt = va_arg(args, const char*);
		len = snprintf(e->e, sizeof(e->e), "error: ");
		vsnprintf(e->e + len, sizeof(e->e) - len, fmt, args);
		break;
	}
	case SPEOOM: {
		fmt = va_arg(args, const char*);
		len = snprintf(e->e, sizeof(e->e), "out-of-memory error: ");
		vsnprintf(e->e + len, sizeof(e->e) - len, fmt, args);
		break;
	}
	case SPESYS: {
		e->errno_ = errno;
		fmt  = va_arg(args, const char*);
		len  = snprintf(e->e, sizeof(e->e), "system error: ");
		len += vsnprintf(e->e + len, sizeof(e->e) - len, fmt, args);
		snprintf(e->e + len, sizeof(e->e) - len, " (errno: %d, %s)",
		         e->errno_, strerror(e->errno_));
		break;
	}
	case SPEIO: {
		e->errno_ = errno;
		epoch = va_arg(args, uint32_t);
		fmt  = va_arg(args, const char*);
		len  = snprintf(e->e, sizeof(e->e), "io error: [epoch %"PRIu32"] ", epoch);
		len += vsnprintf(e->e + len, sizeof(e->e) - len, fmt, args);
		snprintf(e->e + len, sizeof(e->e) - len, " (errno: %d, %s)",
		         e->errno_, strerror(e->errno_));
		break;
	}
	}
	sp_unlock(&e->lock);
}
Esempio n. 2
0
File: e.c Progetto: AmirooR/sophia
void sp_ve(spe *e, int type, va_list args)
{
	sp_lock(&e->lock);
	if (e->type != SPENONE) {
		sp_unlock(&e->lock);
		return;
	}
	e->type = type;
	switch (type) {
	case SPE: {
		char *fmt = va_arg(args, char*);
		int len = snprintf(e->e, sizeof(e->e), "error: ");
		vsnprintf(e->e + len, sizeof(e->e) - len, fmt, args);
		break;
	}
	case SPEOOM: {
		char *msg = va_arg(args, char*);
		snprintf(e->e, sizeof(e->e), "out-of-memory error: %s", msg);
		break;
	}
	case SPESYS: {
		e->errno_ = errno;
		char *msg = va_arg(args, char*);
		snprintf(e->e, sizeof(e->e), "system error: %s (errno: %d, %s)",
		         msg, e->errno_, strerror(e->errno_));
		break;
	}
	case SPEIO: {
		e->errno_ = errno;
		char *msg = va_arg(args, char*);
		uint32_t epoch = va_arg(args, uint32_t);
		snprintf(e->e, sizeof(e->e), "io error: [epoch %"PRIu32"] %s (errno: %d, %s)",
		         epoch, msg, e->errno_, strerror(e->errno_));
		break;
	}
	}
	sp_unlock(&e->lock);
}