From d76f86f7db59838fa4a2727d7d07710c6cf7470c Mon Sep 17 00:00:00 2001 From: cpq Date: Sat, 13 Aug 2022 15:37:55 +0100 Subject: [PATCH] Get rid of mg_*asprintf --- docs/README.md | 36 +----------- mongoose.c | 136 +++++++++++++--------------------------------- mongoose.h | 7 +-- src/event.c | 5 +- src/fmt.c | 43 ++------------- src/fmt.h | 4 +- src/fs.c | 23 +++----- src/log.c | 18 +++--- src/log.h | 3 +- src/tls_mbed.c | 8 +-- src/tls_openssl.c | 17 +----- src/ws.c | 22 +++----- test/unit_test.c | 10 +--- 13 files changed, 88 insertions(+), 244 deletions(-) diff --git a/docs/README.md b/docs/README.md index ed021133..e411f7a1 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1473,7 +1473,7 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ### mg\_ws\_send() ```c -size_t mg_ws_send(struct mg_connection *c, const char *buf, size_t len, int op); +size_t mg_ws_send(struct mg_connection *c, const void *buf, size_t len, int op); ``` Send data to websocket peer @@ -1513,7 +1513,7 @@ void fn(struct mg_connection *c, int ev, void *ev_data, void *fn_data) { ```c size_t mg_ws_printf(struct mg_connection *, int op, const char *fmt, ...); -size_t mg_ws_vprintf(struct mg_connection *, int op, const char *fmt, va_list); +size_t mg_ws_vprintf(struct mg_connection *, int op, const char *fmt, va_list *); ``` Same as `mg_ws_send()`, but formats data using `printf()` semantics. @@ -2602,8 +2602,6 @@ mg_remove_double_dots(data); // data is /a.txt ```c size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...); size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list ap); -size_t mg_asprintf(char **buf, size_t len, const char *fmt, ...); -size_t mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap); ``` Print formatted string into a string buffer, just like `snprintf()` @@ -2663,39 +2661,11 @@ size_t f(void (*out)(char, void *), void *ptr, va_list *ap) { } ``` -### mg\_asprintf(), mg\_vasprintf() - -```c -int mg_asprintf(char **buf, size_t size, const char *fmt, ...); -int mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap); -``` - -Print message specified by printf-like format string `fmt` into a buffer -pointed by `buf` of size `size`. If `size` is large enough to hold the whole -message, then a message is stored in `*buf`. If it does not fit, then a large -enough buffer is allocated to hold a message, and `buf` is changed to point to -that buffer. - -Parameters: -- `buf` - Pointer to pointer to output buffer -- `size` - Pre-allocated buffer size -- `fmt` - printf-like format string - -Return value: Number of bytes printed - -Usage example: - -```c -char buf[16], *pbuf = buf; -mg_asprintf(&pbuf, sizeof(buf), "Hello, %s!", "world"); // buf is now "Hello, world!" -if (pbuf != buf) free(pbuf); -``` - ### mg\_mprintf(), mg\_vmprintf() ```c char *mg_mprintf(const char *fmt, ...); -char *mg_vmprintf(const char *fmt, va_list ap); +char *mg_vmprintf(const char *fmt, va_list *ap); ``` Print message into an allocated memory buffer. Caller must free the result. diff --git a/mongoose.c b/mongoose.c index ecaf7245..c9395162 100644 --- a/mongoose.c +++ b/mongoose.c @@ -396,15 +396,14 @@ void mg_call(struct mg_connection *c, int ev, void *ev_data) { } void mg_error(struct mg_connection *c, const char *fmt, ...) { - char mem[256], *buf = mem; + char buf[64]; va_list ap; va_start(ap, fmt); - mg_vasprintf(&buf, sizeof(mem), fmt, ap); + mg_vsnprintf(buf, sizeof(buf), fmt, &ap); va_end(ap); MG_ERROR(("%lu %p %s", c->id, c->fd, buf)); c->is_closing = 1; // Set is_closing before sending MG_EV_CALL mg_call(c, MG_EV_ERROR, buf); // Let user handler to override it - if (buf != mem) free(buf); } #ifdef MG_ENABLE_LINES @@ -413,37 +412,6 @@ void mg_error(struct mg_connection *c, const char *fmt, ...) { -size_t mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap) { - va_list ap_copy; - size_t len; - - va_copy(ap_copy, ap); - len = mg_vsnprintf(*buf, size, fmt, &ap_copy); - va_end(ap_copy); - - if (len >= size) { - // Allocate a buffer that is large enough - if ((*buf = (char *) calloc(1, len + 1)) == NULL) { - len = 0; - } else { - va_copy(ap_copy, ap); - len = mg_vsnprintf(*buf, len + 1, fmt, &ap_copy); - va_end(ap_copy); - } - } - - return len; -} - -size_t mg_asprintf(char **buf, size_t size, const char *fmt, ...) { - size_t ret; - va_list ap; - va_start(ap, fmt); - ret = mg_vasprintf(buf, size, fmt, ap); - va_end(ap); - return ret; -} - size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) { va_list ap; size_t n; @@ -453,17 +421,17 @@ size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) { return n; } -char *mg_vmprintf(const char *fmt, va_list ap) { - char *s = NULL; - mg_vasprintf(&s, 0, fmt, ap); - return s; +char *mg_vmprintf(const char *fmt, va_list *ap) { + struct mg_iobuf io = {0, 0, 0, 256}; + mg_vrprintf(mg_pfn_iobuf, &io, fmt, ap); + return (char *) io.buf; } char *mg_mprintf(const char *fmt, ...) { - char *s = NULL; + char *s; va_list ap; va_start(ap, fmt); - mg_vasprintf(&s, 0, fmt, ap); + s = mg_vmprintf(fmt, &ap); va_end(ap); return s; } @@ -877,32 +845,23 @@ char *mg_file_read(struct mg_fs *fs, const char *path, size_t *sizep) { bool mg_file_write(struct mg_fs *fs, const char *path, const void *buf, size_t len) { bool result = false; - struct mg_fd *fd; - char tmp[MG_PATH_MAX]; - mg_snprintf(tmp, sizeof(tmp), "%s..%d", path, rand()); - if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) { + struct mg_fd *fd = mg_fs_open(fs, path, MG_FS_WRITE); + if (fd != NULL) { result = fs->wr(fd->fd, buf, len) == len; mg_fs_close(fd); - if (result) { - fs->rm(path); - fs->mv(tmp, path); - } else { - fs->rm(tmp); - } } return result; } bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) { - char tmp[256], *buf = tmp; - bool result; - size_t len; va_list ap; + char *data; + bool result = false; va_start(ap, fmt); - len = mg_vasprintf(&buf, sizeof(tmp), fmt, ap); + data = mg_vmprintf(fmt, &ap); va_end(ap); - result = mg_file_write(fs, path, buf, len > 0 ? (size_t) len : 0); - if (buf != tmp) free(buf); + result = mg_file_write(fs, path, data, strlen(data)); + free(data); return result; } @@ -2734,20 +2693,22 @@ long mg_json_get_long(struct mg_str json, const char *path, long dflt) { -static void default_logger(unsigned char c) { +static void default_logger(char c, void *param) { putchar(c); - (void) c; + (void) c, (void) param; } static int s_level = MG_LL_INFO; -static void (*s_log_func)(unsigned char) = default_logger; +static mg_pfn_t s_log_func = default_logger; +static void *s_log_func_param = NULL; -void mg_log_set_fn(void (*fn)(unsigned char)) { +void mg_log_set_fn(mg_pfn_t fn, void *param) { s_log_func = fn; + s_log_func_param = param; } static void logc(unsigned char c) { - s_log_func(c); + s_log_func((char) c, s_log_func_param); } static void logs(const char *buf, size_t len) { @@ -2778,15 +2739,11 @@ bool mg_log_prefix(int level, const char *file, int line, const char *fname) { } void mg_log(const char *fmt, ...) { - char mem[256], *buf = mem; va_list ap; - size_t len; va_start(ap, fmt); - len = mg_vasprintf(&buf, sizeof(mem), fmt, ap); + mg_vrprintf(s_log_func, s_log_func_param, fmt, &ap); va_end(ap); - logs(buf, len); logc((unsigned char) '\n'); - if (buf != mem) free(buf); } static unsigned char nibble(unsigned c) { @@ -5238,11 +5195,9 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) { mbedtls_ssl_conf_ca_chain(&tls->conf, &tls->ca, NULL); #endif if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - mbedtls_ssl_set_hostname(&tls->ssl, buf); - if (buf != mem) free(buf); + char *x = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr); + mbedtls_ssl_set_hostname(&tls->ssl, x); + free(x); } mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED); } @@ -5396,22 +5351,11 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) { #endif } } -#if OPENSSL_VERSION_NUMBER > 0x10002000L - if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - SSL_set1_host(tls->ssl, buf); - if (buf != mem) free(buf); - } -#endif if (opts->ciphers != NULL) SSL_set_cipher_list(tls->ssl, opts->ciphers); if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - SSL_set_tlsext_host_name(tls->ssl, buf); - if (buf != mem) free(buf); + char *s = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr); + SSL_set1_host(tls->ssl, s); + free(s); } c->tls = tls; c->is_tls = 1; @@ -5726,10 +5670,9 @@ size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) { static void ws_handshake(struct mg_connection *c, const struct mg_str *wskey, const struct mg_str *wsproto, const char *fmt, - va_list ap) { + va_list *ap) { const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; unsigned char sha[20], b64_sha[30]; - char mem[128], *buf = mem; mg_sha1_ctx sha_ctx; mg_sha1_init(&sha_ctx); @@ -5737,16 +5680,13 @@ static void ws_handshake(struct mg_connection *c, const struct mg_str *wskey, mg_sha1_update(&sha_ctx, (unsigned char *) magic, 36); mg_sha1_final(sha, &sha_ctx); mg_base64_encode(sha, sizeof(sha), (char *) b64_sha); - buf[0] = '\0'; - if (fmt != NULL) mg_vasprintf(&buf, sizeof(mem), fmt, ap); - mg_printf(c, - "HTTP/1.1 101 Switching Protocols\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Accept: %s\r\n" - "%s", - b64_sha, buf); - if (buf != mem) free(buf); + mg_rprintf(mg_pfn_iobuf, &c->send, + "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept: %s\r\n", + b64_sha); + if (fmt != NULL) mg_vrprintf(mg_pfn_iobuf, &c->send, fmt, ap); if (wsproto != NULL) { mg_printf(c, "Sec-WebSocket-Protocol: %.*s\r\n", (int) wsproto->len, wsproto->ptr); @@ -5966,7 +5906,7 @@ void mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *hm, struct mg_str *wsproto = mg_http_get_header(hm, "Sec-WebSocket-Protocol"); va_list ap; va_start(ap, fmt); - ws_handshake(c, wskey, wsproto, fmt, ap); + ws_handshake(c, wskey, wsproto, fmt, &ap); va_end(ap); c->is_websocket = 1; mg_call(c, MG_EV_WS_OPEN, hm); diff --git a/mongoose.h b/mongoose.h index 14791527..2cf9349d 100644 --- a/mongoose.h +++ b/mongoose.h @@ -795,10 +795,9 @@ size_t mg_vrprintf(void (*)(char, void *), void *, const char *fmt, va_list *); size_t mg_rprintf(void (*fn)(char, void *), void *, const char *fmt, ...); size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap); size_t mg_snprintf(char *, size_t, const char *fmt, ...); -size_t mg_asprintf(char **, size_t, const char *fmt, ...); -size_t mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap); +char *mg_vmprintf(const char *fmt, va_list *ap); char *mg_mprintf(const char *fmt, ...); -char *mg_vmprintf(const char *fmt, va_list ap); + @@ -809,7 +808,7 @@ void mg_log(const char *fmt, ...); bool mg_log_prefix(int ll, const char *file, int line, const char *fname); void mg_log_set(int log_level); void mg_hexdump(const void *buf, size_t len); -void mg_log_set_fn(void (*logfunc)(unsigned char ch)); +void mg_log_set_fn(mg_pfn_t fn, void *param); #if MG_ENABLE_LOG #define MG_LOG(level, args) \ diff --git a/src/event.c b/src/event.c index f8fefa23..fd5e2432 100644 --- a/src/event.c +++ b/src/event.c @@ -12,13 +12,12 @@ void mg_call(struct mg_connection *c, int ev, void *ev_data) { } void mg_error(struct mg_connection *c, const char *fmt, ...) { - char mem[256], *buf = mem; + char buf[64]; va_list ap; va_start(ap, fmt); - mg_vasprintf(&buf, sizeof(mem), fmt, ap); + mg_vsnprintf(buf, sizeof(buf), fmt, &ap); va_end(ap); MG_ERROR(("%lu %p %s", c->id, c->fd, buf)); c->is_closing = 1; // Set is_closing before sending MG_EV_CALL mg_call(c, MG_EV_ERROR, buf); // Let user handler to override it - if (buf != mem) free(buf); } diff --git a/src/fmt.c b/src/fmt.c index fe7407ee..121df2fc 100644 --- a/src/fmt.c +++ b/src/fmt.c @@ -1,37 +1,6 @@ #include "fmt.h" #include "iobuf.h" -size_t mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap) { - va_list ap_copy; - size_t len; - - va_copy(ap_copy, ap); - len = mg_vsnprintf(*buf, size, fmt, &ap_copy); - va_end(ap_copy); - - if (len >= size) { - // Allocate a buffer that is large enough - if ((*buf = (char *) calloc(1, len + 1)) == NULL) { - len = 0; - } else { - va_copy(ap_copy, ap); - len = mg_vsnprintf(*buf, len + 1, fmt, &ap_copy); - va_end(ap_copy); - } - } - - return len; -} - -size_t mg_asprintf(char **buf, size_t size, const char *fmt, ...) { - size_t ret; - va_list ap; - va_start(ap, fmt); - ret = mg_vasprintf(buf, size, fmt, ap); - va_end(ap); - return ret; -} - size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) { va_list ap; size_t n; @@ -41,17 +10,17 @@ size_t mg_snprintf(char *buf, size_t len, const char *fmt, ...) { return n; } -char *mg_vmprintf(const char *fmt, va_list ap) { - char *s = NULL; - mg_vasprintf(&s, 0, fmt, ap); - return s; +char *mg_vmprintf(const char *fmt, va_list *ap) { + struct mg_iobuf io = {0, 0, 0, 256}; + mg_vrprintf(mg_pfn_iobuf, &io, fmt, ap); + return (char *) io.buf; } char *mg_mprintf(const char *fmt, ...) { - char *s = NULL; + char *s; va_list ap; va_start(ap, fmt); - mg_vasprintf(&s, 0, fmt, ap); + s = mg_vmprintf(fmt, &ap); va_end(ap); return s; } diff --git a/src/fmt.h b/src/fmt.h index 12d7ac9b..b41ad67c 100644 --- a/src/fmt.h +++ b/src/fmt.h @@ -15,7 +15,5 @@ size_t mg_vrprintf(void (*)(char, void *), void *, const char *fmt, va_list *); size_t mg_rprintf(void (*fn)(char, void *), void *, const char *fmt, ...); size_t mg_vsnprintf(char *buf, size_t len, const char *fmt, va_list *ap); size_t mg_snprintf(char *, size_t, const char *fmt, ...); -size_t mg_asprintf(char **, size_t, const char *fmt, ...); -size_t mg_vasprintf(char **buf, size_t size, const char *fmt, va_list ap); +char *mg_vmprintf(const char *fmt, va_list *ap); char *mg_mprintf(const char *fmt, ...); -char *mg_vmprintf(const char *fmt, va_list ap); diff --git a/src/fs.c b/src/fs.c index 0d5e070c..04838dff 100644 --- a/src/fs.c +++ b/src/fs.c @@ -45,31 +45,22 @@ char *mg_file_read(struct mg_fs *fs, const char *path, size_t *sizep) { bool mg_file_write(struct mg_fs *fs, const char *path, const void *buf, size_t len) { bool result = false; - struct mg_fd *fd; - char tmp[MG_PATH_MAX]; - mg_snprintf(tmp, sizeof(tmp), "%s..%d", path, rand()); - if ((fd = mg_fs_open(fs, tmp, MG_FS_WRITE)) != NULL) { + struct mg_fd *fd = mg_fs_open(fs, path, MG_FS_WRITE); + if (fd != NULL) { result = fs->wr(fd->fd, buf, len) == len; mg_fs_close(fd); - if (result) { - fs->rm(path); - fs->mv(tmp, path); - } else { - fs->rm(tmp); - } } return result; } bool mg_file_printf(struct mg_fs *fs, const char *path, const char *fmt, ...) { - char tmp[256], *buf = tmp; - bool result; - size_t len; va_list ap; + char *data; + bool result = false; va_start(ap, fmt); - len = mg_vasprintf(&buf, sizeof(tmp), fmt, ap); + data = mg_vmprintf(fmt, &ap); va_end(ap); - result = mg_file_write(fs, path, buf, len > 0 ? (size_t) len : 0); - if (buf != tmp) free(buf); + result = mg_file_write(fs, path, data, strlen(data)); + free(data); return result; } diff --git a/src/log.c b/src/log.c index 1abd8da0..295bb962 100644 --- a/src/log.c +++ b/src/log.c @@ -3,20 +3,22 @@ #include "str.h" #include "util.h" -static void default_logger(unsigned char c) { +static void default_logger(char c, void *param) { putchar(c); - (void) c; + (void) c, (void) param; } static int s_level = MG_LL_INFO; -static void (*s_log_func)(unsigned char) = default_logger; +static mg_pfn_t s_log_func = default_logger; +static void *s_log_func_param = NULL; -void mg_log_set_fn(void (*fn)(unsigned char)) { +void mg_log_set_fn(mg_pfn_t fn, void *param) { s_log_func = fn; + s_log_func_param = param; } static void logc(unsigned char c) { - s_log_func(c); + s_log_func((char) c, s_log_func_param); } static void logs(const char *buf, size_t len) { @@ -47,15 +49,11 @@ bool mg_log_prefix(int level, const char *file, int line, const char *fname) { } void mg_log(const char *fmt, ...) { - char mem[256], *buf = mem; va_list ap; - size_t len; va_start(ap, fmt); - len = mg_vasprintf(&buf, sizeof(mem), fmt, ap); + mg_vrprintf(s_log_func, s_log_func_param, fmt, &ap); va_end(ap); - logs(buf, len); logc((unsigned char) '\n'); - if (buf != mem) free(buf); } static unsigned char nibble(unsigned c) { diff --git a/src/log.h b/src/log.h index aa0b203c..e90ba79e 100644 --- a/src/log.h +++ b/src/log.h @@ -2,13 +2,14 @@ #include "arch.h" #include "config.h" +#include "fmt.h" enum { MG_LL_NONE, MG_LL_ERROR, MG_LL_INFO, MG_LL_DEBUG, MG_LL_VERBOSE }; void mg_log(const char *fmt, ...); bool mg_log_prefix(int ll, const char *file, int line, const char *fname); void mg_log_set(int log_level); void mg_hexdump(const void *buf, size_t len); -void mg_log_set_fn(void (*logfunc)(unsigned char ch)); +void mg_log_set_fn(mg_pfn_t fn, void *param); #if MG_ENABLE_LOG #define MG_LOG(level, args) \ diff --git a/src/tls_mbed.c b/src/tls_mbed.c index bd832704..cc77385f 100644 --- a/src/tls_mbed.c +++ b/src/tls_mbed.c @@ -145,11 +145,9 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) { mbedtls_ssl_conf_ca_chain(&tls->conf, &tls->ca, NULL); #endif if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - mbedtls_ssl_set_hostname(&tls->ssl, buf); - if (buf != mem) free(buf); + char *x = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr); + mbedtls_ssl_set_hostname(&tls->ssl, x); + free(x); } mbedtls_ssl_conf_authmode(&tls->conf, MBEDTLS_SSL_VERIFY_REQUIRED); } diff --git a/src/tls_openssl.c b/src/tls_openssl.c index 15c992c2..0cdc6414 100644 --- a/src/tls_openssl.c +++ b/src/tls_openssl.c @@ -89,22 +89,11 @@ void mg_tls_init(struct mg_connection *c, const struct mg_tls_opts *opts) { #endif } } -#if OPENSSL_VERSION_NUMBER > 0x10002000L - if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - SSL_set1_host(tls->ssl, buf); - if (buf != mem) free(buf); - } -#endif if (opts->ciphers != NULL) SSL_set_cipher_list(tls->ssl, opts->ciphers); if (opts->srvname.len > 0) { - char mem[128], *buf = mem; - mg_asprintf(&buf, sizeof(mem), "%.*s", (int) opts->srvname.len, - opts->srvname.ptr); - SSL_set_tlsext_host_name(tls->ssl, buf); - if (buf != mem) free(buf); + char *s = mg_mprintf("%.*s", (int) opts->srvname.len, opts->srvname.ptr); + SSL_set1_host(tls->ssl, s); + free(s); } c->tls = tls; c->is_tls = 1; diff --git a/src/ws.c b/src/ws.c index 7ed19b7b..6a6c6a4e 100644 --- a/src/ws.c +++ b/src/ws.c @@ -33,10 +33,9 @@ size_t mg_ws_printf(struct mg_connection *c, int op, const char *fmt, ...) { static void ws_handshake(struct mg_connection *c, const struct mg_str *wskey, const struct mg_str *wsproto, const char *fmt, - va_list ap) { + va_list *ap) { const char *magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; unsigned char sha[20], b64_sha[30]; - char mem[128], *buf = mem; mg_sha1_ctx sha_ctx; mg_sha1_init(&sha_ctx); @@ -44,16 +43,13 @@ static void ws_handshake(struct mg_connection *c, const struct mg_str *wskey, mg_sha1_update(&sha_ctx, (unsigned char *) magic, 36); mg_sha1_final(sha, &sha_ctx); mg_base64_encode(sha, sizeof(sha), (char *) b64_sha); - buf[0] = '\0'; - if (fmt != NULL) mg_vasprintf(&buf, sizeof(mem), fmt, ap); - mg_printf(c, - "HTTP/1.1 101 Switching Protocols\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Accept: %s\r\n" - "%s", - b64_sha, buf); - if (buf != mem) free(buf); + mg_rprintf(mg_pfn_iobuf, &c->send, + "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept: %s\r\n", + b64_sha); + if (fmt != NULL) mg_vrprintf(mg_pfn_iobuf, &c->send, fmt, ap); if (wsproto != NULL) { mg_printf(c, "Sec-WebSocket-Protocol: %.*s\r\n", (int) wsproto->len, wsproto->ptr); @@ -273,7 +269,7 @@ void mg_ws_upgrade(struct mg_connection *c, struct mg_http_message *hm, struct mg_str *wsproto = mg_http_get_header(hm, "Sec-WebSocket-Protocol"); va_list ap; va_start(ap, fmt); - ws_handshake(c, wskey, wsproto, fmt, ap); + ws_handshake(c, wskey, wsproto, fmt, &ap); va_end(ap); c->is_websocket = 1; mg_call(c, MG_EV_WS_OPEN, hm); diff --git a/test/unit_test.c b/test/unit_test.c index 055a27cb..09c1e3be 100644 --- a/test/unit_test.c +++ b/test/unit_test.c @@ -1785,13 +1785,9 @@ static void test_util(void) { } { - s = buf; - mg_asprintf(&s, sizeof(buf), "%3d", 123); - ASSERT(s == buf); - ASSERT(strcmp(buf, "123") == 0); - mg_asprintf(&s, sizeof(buf), "%.*s", 7, "a%40b.c"); - ASSERT(s == buf); - ASSERT(strcmp(buf, "a%40b.c") == 0); + s = mg_mprintf("%3d", 123); + ASSERT(strcmp(s, "123") == 0); + free(s); } ASSERT(mg_to64(mg_str("-9223372036854775809")) == 0);