libmicrohttpd

HTTP/1.x server C library (MHD 1.x, stable)
Log | Files | Refs | Submodules | README | LICENSE

commit 5c1e130e09b76f7a77dad883bf7459f2ec2e3888
parent ec2d818cc4975bef2f6d0c6f36ffd5bcf9ea4443
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
Date:   Sat, 23 Apr 2022 17:11:20 +0300

doc/examples: avoid usage of unportable functions

Diffstat:
Mdoc/examples/sessions.c | 76+++++++++++++++++++++++++++++++++++++++++-----------------------------------
1 file changed, 41 insertions(+), 35 deletions(-)

diff --git a/doc/examples/sessions.c b/doc/examples/sessions.c @@ -1,60 +1,66 @@ /* Feel free to use this example code in any way you see fit (Public Domain) */ -/* needed for asprintf */ -#ifndef _GNU_SOURCE -#define _GNU_SOURCE 1 -#endif - #include <stdlib.h> #include <string.h> #include <stdio.h> #include <errno.h> #include <time.h> +#include <stdarg.h> #include <microhttpd.h> -#if defined _WIN32 && ! defined(__MINGW64_VERSION_MAJOR) +/* Emulate 'asprintf()', as it is not portable */ static int -asprintf (char **resultp, const char *format, ...) +MHD_asprintf (char **resultp, const char *format, ...) { va_list argptr; - char *result = NULL; - int len = 0; - - if (format == NULL) - return -1; + va_list argcopy; + int len; + int ret; + ret = -1; va_start (argptr, format); - len = _vscprintf ((char *) format, argptr); - if (len >= 0) + va_copy (argcopy, argptr); +#ifndef _WIN32 + len = vsnprintf (NULL, 0, format, argcopy); +#else + len = _vscprintf (format, argcopy); +#endif + va_end (argcopy); + if (0 < len) { - len += 1; - result = (char *) malloc (sizeof (char *) * len); - if (result != NULL) + size_t buf_size; + char *buf; + + buf_size = len + 1; + buf = (char *) malloc (buf_size * sizeof(char)); + if (NULL != buf) { - int len2 = _vscprintf ((char *) format, argptr); - if ((len2 != len - 1) || (len2 <= 0)) + int res; + +#ifndef _WIN32 + res = vsnprintf (buf, buf_size, format, argptr); +#else + res = _vsnprintf (buf, buf_size, format, argptr); +#endif + if (len == res) { - free (result); - result = NULL; - len = -1; + *resultp = buf; + ret = res; } else { - len = len2; - if (resultp) - *resultp = result; + free (buf); + *resultp = NULL; } } } va_end (argptr); - return len; + return ret; } -#endif - /** * Invalid method page. */ @@ -343,9 +349,9 @@ fill_v1_form (const void *cls, struct MHD_Response *response; (void) cls; /* Unused */ - if (-1 == asprintf (&reply, - MAIN_PAGE, - session->value_1)) + if (-1 == MHD_asprintf (&reply, + MAIN_PAGE, + session->value_1)) { /* oops */ return MHD_NO; @@ -385,10 +391,10 @@ fill_v1_v2_form (const void *cls, struct MHD_Response *response; (void) cls; /* Unused */ - if (-1 == asprintf (&reply, - SECOND_PAGE, - session->value_1, - session->value_2)) + if (-1 == MHD_asprintf (&reply, + SECOND_PAGE, + session->value_1, + session->value_2)) { /* oops */ return MHD_NO;