소스 검색

Add vdprintf function. Note: will be rewritten to check if file descriptor has an associated FILE to avoid bad interactions with buffered output, but needed for busybox right now and that implementation has the same bug.

Manuel Novoa III 23 년 전
부모
커밋
0ba092c1c9
2개의 변경된 파일12개의 추가작업 그리고 1개의 파일을 삭제
  1. 1 1
      libc/stdio/Makefile
  2. 11 0
      libc/stdio/printf.c

+ 1 - 1
libc/stdio/Makefile

@@ -41,7 +41,7 @@ MOBJ=_stdio_init.o fputc.o fgetc.o fflush.o fgets.o gets.o fputs.o	\
 
 MSRC2=printf.c
 MOBJ2=printf.o sprintf.o fprintf.o vprintf.o vsprintf.o vfprintf.o snprintf.o \
-     vsnprintf.o asprintf.o vfnprintf.o fnprintf.o
+     vsnprintf.o asprintf.o vfnprintf.o fnprintf.o vdprintf.o
 
 MSRC3=scanf.c
 MOBJ3=scanf.o sscanf.o fscanf.o vscanf.o vsscanf.o vfscanf.o

+ 11 - 0
libc/stdio/printf.c

@@ -279,6 +279,17 @@ int vsnprintf(char *sp, size_t size, __const char *fmt, va_list ap)
 }
 #endif
 
+#ifdef L_vdprintf
+#warning rewrite vdprintf ... fd may have an associated file!!! plus buffer?
+extern int vdprintf(int fd, const char *fmt, va_list ap)
+{
+	FILE f = {f.unbuf, f.unbuf, f.unbuf, f.unbuf, f.unbuf + sizeof(f.unbuf),
+			  fd, _IONBF | __MODE_WRITE | __MODE_IOTRAN};
+
+	return vfnprintf(&f, -1, fmt, ap);
+}
+#endif
+
 #ifdef L_vfnprintf
 
 extern char *__ultostr(char *buf, unsigned long uval, int base, int uppercase);