Пример #1
0
static void
result(pds_session_t *pdss, const char *cmdtag, const char *fmt, ...)
{
	va_list va;
	char *formatted;
	char *resbuf;
	char errdesc[256];
	int len;
	char terminator = '\n';
	if(pdss->pdss_client_cr_null)
		terminator = '\0';

	va_start(va, fmt);
	len = pvasprintf(&formatted, fmt, va);
	va_end(va);
	if (!formatted) {
		if (!pdss->pdss_should_close)
			pu_log(PUL_WARN, pdss->pdss_id,
				"problem with pvasprintf;"
				" closing session");
		pdss->pdss_should_close = 1;
		return;
	}

	if (cmdtag)
		len = pasprintf(&resbuf, "%s %s%c", cmdtag, formatted, terminator);
	else
		len = pasprintf(&resbuf, "%s%c", formatted, terminator);
	if (!resbuf) {
		free(formatted); formatted = NULL;
		if (!pdss->pdss_should_close)
			pu_log(PUL_WARN, pdss->pdss_id,
				"insufficient memory to compose command result;"
				" closing session");
		pdss->pdss_should_close = 1;
		return;
	}
	free(formatted); formatted = NULL;

#ifndef _MSC_EXTENSIONS
#ifdef DEBUG_PROTOCOL
	if (debug_protocol)
		write(1, resbuf, len);
#endif
#endif
	if (!pdss->pdss_write(pdss->pdss_wfd, resbuf, len +
	    pdss->pdss_client_cr_null, errdesc, sizeof (errdesc)) &&
	    !pdss->pdss_should_close) {
		char *errbuf;
		pasprintf(&errbuf,
		    "I/O error sending result: %s; closing session", errdesc);
		if (errbuf) {
			pu_log(PUL_WARN, pdss->pdss_id, errbuf);
			free(errbuf); errbuf = NULL;
		}
		pdss->pdss_should_close = 1;
	}
	free(resbuf); resbuf = NULL;
	return;
}
Пример #2
0
int
pasprintf(char **strp, const char *fmt, ...)
{
    va_list args;
    int status;

    va_start(args, fmt);
    status = pvasprintf(strp, fmt, args);
    va_end(args);
    return status;
}
Пример #3
0
int
pasprintf(char **ret, const char *fmt, ...)
{
	va_list args;
	int outsize = 0;

	va_start(args, fmt);
	outsize = pvasprintf(ret, fmt, args);
	va_end(args);

	return outsize;
}
Пример #4
0
static void
result(pds_session_t *pdss, const char *cmdtag, const char *fmt, ...)
{
	va_list va;
	char *formatted;
	char *resbuf;
	char errdesc[256];
	int len;
	char terminator = '\n';
	if(pdss->pdss_client_cr_null)
		terminator = '\0';
	
	va_start(va, fmt);
	pvasprintf(&formatted, fmt, va);
	va_end(va);
	if (!formatted) {
		if (!pdss->pdss_should_close)
			pu_log(PUL_WARN, pdss->pdss_id,"problem with pvasprintf; closing session");
		pdss->pdss_should_close = 1;
		return;
	}
	
	if (cmdtag)
		len = pasprintf(&resbuf, "%s %s%c", cmdtag, formatted, terminator);
	else
		len = pasprintf(&resbuf, "%s%c", formatted, terminator);
	if (!resbuf) {
		free(formatted); formatted = NULL;
		if (!pdss->pdss_should_close)
			pu_log(PUL_WARN, pdss->pdss_id,
				   "insufficient memory to compose command result; closing session");
		pdss->pdss_should_close = 1;
		return;
	}
	free(formatted); formatted = NULL;
	
	if (!pdss->pdss_write(pdss->pdss_wfd, resbuf, len +
						  pdss->pdss_client_cr_null, errdesc, sizeof (errdesc)) &&
	    !pdss->pdss_should_close) {
		char *errbuf;
		pasprintf(&errbuf,
				  "connection closed remotely; closing session (%s)", errdesc);
		if (errbuf) {
			pu_log(PUL_INFO, pdss->pdss_id, errbuf);
			free(errbuf); errbuf = NULL;
		}
		pdss->pdss_should_close = 1;
	}
	free(resbuf); resbuf = NULL;
	return;
}