xref: /titanic_53/usr/src/test/libc-tests/tests/stdio/memstream_reopen.c (revision f65a228f854974d51b13928c21fa0ae281aa80af)
1*f65a228fSRobert Mustacchi /*
2*f65a228fSRobert Mustacchi  * This file and its contents are supplied under the terms of the
3*f65a228fSRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
4*f65a228fSRobert Mustacchi  * You may only use this file in accordance with the terms of version
5*f65a228fSRobert Mustacchi  * 1.0 of the CDDL.
6*f65a228fSRobert Mustacchi  *
7*f65a228fSRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
8*f65a228fSRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
9*f65a228fSRobert Mustacchi  * http://www.illumos.org/license/CDDL.
10*f65a228fSRobert Mustacchi  */
11*f65a228fSRobert Mustacchi 
12*f65a228fSRobert Mustacchi /*
13*f65a228fSRobert Mustacchi  * Copyright 2020 Robert Mustacchi
14*f65a228fSRobert Mustacchi  */
15*f65a228fSRobert Mustacchi 
16*f65a228fSRobert Mustacchi /*
17*f65a228fSRobert Mustacchi  * In a c99/xpg6 environment freopen(3C) allows you to specify a NULL path to
18*f65a228fSRobert Mustacchi  * try and change the fopen() flags. Verify that the memstream functions do not
19*f65a228fSRobert Mustacchi  * allow this. Note, freopen(3C) is defined to try and close the stream, hence
20*f65a228fSRobert Mustacchi  * you won't see anything here.
21*f65a228fSRobert Mustacchi  */
22*f65a228fSRobert Mustacchi 
23*f65a228fSRobert Mustacchi #include <stdio.h>
24*f65a228fSRobert Mustacchi #include <stdio.h>
25*f65a228fSRobert Mustacchi #include <wchar.h>
26*f65a228fSRobert Mustacchi #include <err.h>
27*f65a228fSRobert Mustacchi #include <stdlib.h>
28*f65a228fSRobert Mustacchi #include <errno.h>
29*f65a228fSRobert Mustacchi 
30*f65a228fSRobert Mustacchi const char *
_umem_debug_init(void)31*f65a228fSRobert Mustacchi _umem_debug_init(void)
32*f65a228fSRobert Mustacchi {
33*f65a228fSRobert Mustacchi 	return ("default,verbose");
34*f65a228fSRobert Mustacchi }
35*f65a228fSRobert Mustacchi 
36*f65a228fSRobert Mustacchi const char *
_umem_logging_init(void)37*f65a228fSRobert Mustacchi _umem_logging_init(void)
38*f65a228fSRobert Mustacchi {
39*f65a228fSRobert Mustacchi 	return ("fail,contents");
40*f65a228fSRobert Mustacchi }
41*f65a228fSRobert Mustacchi 
42*f65a228fSRobert Mustacchi static void
check_reopen(FILE * f,const char * variant)43*f65a228fSRobert Mustacchi check_reopen(FILE *f, const char *variant)
44*f65a228fSRobert Mustacchi {
45*f65a228fSRobert Mustacchi 	FILE *new = freopen(NULL, "r", f);
46*f65a228fSRobert Mustacchi 	if (new != NULL) {
47*f65a228fSRobert Mustacchi 		errx(EXIT_FAILURE, "TEST FAILED: was able to freopen %s",
48*f65a228fSRobert Mustacchi 		    variant);
49*f65a228fSRobert Mustacchi 	}
50*f65a228fSRobert Mustacchi 
51*f65a228fSRobert Mustacchi 	if (errno != EBADF) {
52*f65a228fSRobert Mustacchi 		errx(EXIT_FAILURE, "TEST FAILED: found wrong errno for %s: "
53*f65a228fSRobert Mustacchi 		    "expected %d, found %d", EBADF, errno);
54*f65a228fSRobert Mustacchi 	}
55*f65a228fSRobert Mustacchi 
56*f65a228fSRobert Mustacchi 	(void) printf("TEST PASSED: %s\n", variant);
57*f65a228fSRobert Mustacchi }
58*f65a228fSRobert Mustacchi 
59*f65a228fSRobert Mustacchi int
main(void)60*f65a228fSRobert Mustacchi main(void)
61*f65a228fSRobert Mustacchi {
62*f65a228fSRobert Mustacchi 	FILE *f;
63*f65a228fSRobert Mustacchi 	char *c;
64*f65a228fSRobert Mustacchi 	wchar_t *wc;
65*f65a228fSRobert Mustacchi 	size_t sz;
66*f65a228fSRobert Mustacchi 
67*f65a228fSRobert Mustacchi 	f = fmemopen(NULL, 16, "a+");
68*f65a228fSRobert Mustacchi 	if (f == NULL) {
69*f65a228fSRobert Mustacchi 		err(EXIT_FAILURE, "failed to create fmemopen() stream");
70*f65a228fSRobert Mustacchi 	}
71*f65a228fSRobert Mustacchi 	check_reopen(f, "fmemopen()");
72*f65a228fSRobert Mustacchi 
73*f65a228fSRobert Mustacchi 	f = open_memstream(&c, &sz);
74*f65a228fSRobert Mustacchi 	if (f == NULL) {
75*f65a228fSRobert Mustacchi 		err(EXIT_FAILURE, "failed to create open_memstream() stream");
76*f65a228fSRobert Mustacchi 	}
77*f65a228fSRobert Mustacchi 	check_reopen(f, "open_memstream()");
78*f65a228fSRobert Mustacchi 	free(c);
79*f65a228fSRobert Mustacchi 
80*f65a228fSRobert Mustacchi 	f = open_wmemstream(&wc, &sz);
81*f65a228fSRobert Mustacchi 	if (f == NULL) {
82*f65a228fSRobert Mustacchi 		err(EXIT_FAILURE, "failed to create open_wmemstream() stream");
83*f65a228fSRobert Mustacchi 	}
84*f65a228fSRobert Mustacchi 	check_reopen(f, "open_wmemstream()");
85*f65a228fSRobert Mustacchi 	free(wc);
86*f65a228fSRobert Mustacchi 
87*f65a228fSRobert Mustacchi 	return (0);
88*f65a228fSRobert Mustacchi }
89