diff --git a/musl_src.gni b/musl_src.gni index ef600af8a5e5bd1838f6a9c8864a3d3d4b85f5fc..86008dea2aba565eacb3f10fc40158da7336c4b2 100644 --- a/musl_src.gni +++ b/musl_src.gni @@ -2190,6 +2190,7 @@ musl_src_porting_file = [ "src/stdio/stderr.c", "src/stdio/fgets.c", "src/stdio/vsnprintf.c", + "src/stdio/vsscanf.c", "src/internal/stdio_impl.h", "src/internal/vdso.c", "src/time/clock_gettime.c", diff --git a/porting/linux/user/src/stdio/vsscanf.c b/porting/linux/user/src/stdio/vsscanf.c new file mode 100644 index 0000000000000000000000000000000000000000..f0c4a7d01d35e7e91c3f7dc7399b820e8b54a799 --- /dev/null +++ b/porting/linux/user/src/stdio/vsscanf.c @@ -0,0 +1,21 @@ +#include "stdio_impl.h" +#include + +// Empty implementation because vfscanf operates rpos directly. +static size_t string_read(FILE *f, unsigned char *buf, size_t len) +{ + return 0; +} + +int vsscanf(const char *restrict s, const char *restrict fmt, va_list ap) +{ + size_t s_len = strlen(s); + FILE f = { + .buf = (void *)s, .cookie = (void *)s, + .read = string_read, .lock = -1, + .buf_size = s_len, .rpos = s, .rend = s + s_len, + }; + return vfscanf(&f, fmt, ap); +} + +weak_alias(vsscanf,__isoc99_vsscanf);