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; }
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; }
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; }
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; }