>Number: 4246 >Category: apache-api >Synopsis: New function: ap_vrprintf >Confidential: no >Severity: non-critical >Priority: medium >Responsible: apache >State: open >Class: change-request >Submitter-Id: apache >Arrival-Date: Wed Apr 14 15:40:01 PDT 1999 >Last-Modified: >Originator: [EMAIL PROTECTED] >Organization: apache >Release: 1.3.6 >Environment: SunOS hendrix 5.6 Generic_105181-04 sun4u sparc SUNW,Ultra-4 >Description: In order for modules to define printf-like functions that accept a request_req as the output stream, it is necessary to copy the implementation of ap_rprintf in a function that accepts a va_list argument. By analogy to vfprintf and ap_vbprintf, the function should be named ap_vrprintf.
This function's implementation must use an interface that is not part of the public API (namely, the SET_BYTES_SENT macro). If modules implement ap_vrprintf, they will break when the internal interface changes. As a service to modules, ap_vrprintf should be implemented in httpd and added to the API. >How-To-Repeat: You can repeat this problem by trying to transition a large pile of CGI and FCGI apps written in C to Apache modules. >Fix: This patch adds ap_vrprintf to http_protocol.c and adds its prototype to http_protocol.h. It would probably be wise to modify ap_rprintf so that it uses the new function, but you might want to consider the overhead of an additional function call in ap_rprintf. *** apache_1.3.6/src/main/http_protocol.c~ Tue Apr 13 19:25:09 1999 --- apache_1.3.6/src/main/http_protocol.c Wed Apr 14 17:48:16 1999 *************** *** 2182,2187 **** --- 2182,2209 ---- return n; } + API_EXPORT(int) ap_vrprintf(request_rec *r, const char *fmt, va_list ap) + { + int n; + + if (r->connection->aborted) + return -1; + + n = ap_vbprintf(r->connection->client, fmt, ap); + + if (n < 0) { + if (!r->connection->aborted) { + ap_log_rerror(APLOG_MARK, APLOG_INFO, r, + "client stopped connection before vrprintf completed"); + ap_bsetflag(r->connection->client, B_EOUT, 1); + r->connection->aborted = 1; + } + return -1; + } + SET_BYTES_SENT(r); + return n; + } + API_EXPORT(int) ap_rprintf(request_rec *r, const char *fmt,...) { va_list vlist; *** apache_1.3.6/src/include/http_protocol.h~ Fri Jan 1 14:04:40 1999 --- apache_1.3.6/src/include/http_protocol.h Wed Apr 14 18:01:41 1999 *************** *** 148,153 **** --- 148,154 ---- API_EXPORT(int) ap_rputs(const char *str, request_rec *r); API_EXPORT(int) ap_rwrite(const void *buf, int nbyte, request_rec *r); API_EXPORT_NONSTD(int) ap_rvputs(request_rec *r,...); + API_EXPORT(int) ap_vbprintf(request_rec *r, const char *fmt, va_list vlist); API_EXPORT_NONSTD(int) ap_rprintf(request_rec *r, const char *fmt,...) __attribute__((format(printf,2,3))); API_EXPORT(int) ap_rflush(request_rec *r); >Audit-Trail: >Unformatted: [In order for any reply to be added to the PR database, ] [you need to include <[EMAIL PROTECTED]> in the Cc line ] [and leave the subject line UNCHANGED. This is not done] [automatically because of the potential for mail loops. ] [If you do not include this Cc, your reply may be ig- ] [nored unless you are responding to an explicit request ] [from a developer. ] [Reply only with text; DO NOT SEND ATTACHMENTS! ]