xref: /illumos-gate/usr/src/lib/libc/port/print/vdprintf.c (revision 34b5c75ae1f95c7b8ef561f3c7586e03a21f59e7)
1*34b5c75aSHans Rosenfeld /*
2*34b5c75aSHans Rosenfeld  * This file and its contents are supplied under the terms of the
3*34b5c75aSHans Rosenfeld  * Common Development and Distribution License ("CDDL"), version 1.0.
4*34b5c75aSHans Rosenfeld  * You may only use this file in accordance with the terms of version
5*34b5c75aSHans Rosenfeld  * 1.0 of the CDDL.
6*34b5c75aSHans Rosenfeld  *
7*34b5c75aSHans Rosenfeld  * A full copy of the text of the CDDL should have accompanied this
8*34b5c75aSHans Rosenfeld  * source.  A copy of the CDDL is also available via the Internet at
9*34b5c75aSHans Rosenfeld  * http://www.illumos.org/license/CDDL.
10*34b5c75aSHans Rosenfeld  */
11*34b5c75aSHans Rosenfeld 
12*34b5c75aSHans Rosenfeld /*
13*34b5c75aSHans Rosenfeld  * Copyright 2025 Hans Rosenfeld
14*34b5c75aSHans Rosenfeld  */
15*34b5c75aSHans Rosenfeld 
16*34b5c75aSHans Rosenfeld #include <stdarg.h>
17*34b5c75aSHans Rosenfeld #include <sys/types.h>
18*34b5c75aSHans Rosenfeld #include "print.h"
19*34b5c75aSHans Rosenfeld 
20*34b5c75aSHans Rosenfeld int
vdprintf(int fildes,const char * format,va_list ap)21*34b5c75aSHans Rosenfeld vdprintf(int fildes, const char *format, va_list ap)
22*34b5c75aSHans Rosenfeld {
23*34b5c75aSHans Rosenfeld 	FILE *file;
24*34b5c75aSHans Rosenfeld 	int count;
25*34b5c75aSHans Rosenfeld 	int ret;
26*34b5c75aSHans Rosenfeld 
27*34b5c75aSHans Rosenfeld 	file = fdopen(fildes, "w");
28*34b5c75aSHans Rosenfeld 	if (file == NULL)
29*34b5c75aSHans Rosenfeld 		return (EOF);
30*34b5c75aSHans Rosenfeld 
31*34b5c75aSHans Rosenfeld 	/*
32*34b5c75aSHans Rosenfeld 	 * Make the FILE unbuffered, avoiding all kinds of headaches associated
33*34b5c75aSHans Rosenfeld 	 * with buffering and recovering from potential late failure of delayed
34*34b5c75aSHans Rosenfeld 	 * writes.
35*34b5c75aSHans Rosenfeld 	 */
36*34b5c75aSHans Rosenfeld 	(void) setvbuf(file, NULL, _IONBF, 0);
37*34b5c75aSHans Rosenfeld 
38*34b5c75aSHans Rosenfeld 	/*
39*34b5c75aSHans Rosenfeld 	 * As this FILE is temporary and exists only for the runtime of this
40*34b5c75aSHans Rosenfeld 	 * function, there should be no need for locking.
41*34b5c75aSHans Rosenfeld 	 */
42*34b5c75aSHans Rosenfeld 	SET_IONOLOCK(file);
43*34b5c75aSHans Rosenfeld 
44*34b5c75aSHans Rosenfeld 	count = vfprintf(file, format, ap);
45*34b5c75aSHans Rosenfeld 
46*34b5c75aSHans Rosenfeld 	(void) fdclose(file, NULL);
47*34b5c75aSHans Rosenfeld 
48*34b5c75aSHans Rosenfeld 	return (count);
49*34b5c75aSHans Rosenfeld }
50*34b5c75aSHans Rosenfeld 
51*34b5c75aSHans Rosenfeld int
dprintf(int fildes,const char * format,...)52*34b5c75aSHans Rosenfeld dprintf(int fildes, const char *format, ...)
53*34b5c75aSHans Rosenfeld {
54*34b5c75aSHans Rosenfeld 	int count;
55*34b5c75aSHans Rosenfeld 	va_list ap;
56*34b5c75aSHans Rosenfeld 
57*34b5c75aSHans Rosenfeld 	va_start(ap, format);
58*34b5c75aSHans Rosenfeld 	count = vdprintf(fildes, format, ap);
59*34b5c75aSHans Rosenfeld 	va_end(ap);
60*34b5c75aSHans Rosenfeld 
61*34b5c75aSHans Rosenfeld 	return (count);
62*34b5c75aSHans Rosenfeld }
63