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