xref: /illumos-gate/usr/src/test/libc-tests/tests/stdio/ftell_ungetc.c (revision 6353250f8fb7d9f5b595f795d9f446e438685e2b)
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  * Regression test for illumos#12392. Here, ftello64 didn't correctly handle an
18cd62a92dSRobert Mustacchi  * ungetc() in the write path when it was unbuffered.
19cd62a92dSRobert Mustacchi  */
20cd62a92dSRobert Mustacchi 
21cd62a92dSRobert Mustacchi #include <stdio.h>
22cd62a92dSRobert Mustacchi #include <err.h>
23cd62a92dSRobert Mustacchi #include <stdlib.h>
24cd62a92dSRobert Mustacchi 
25cd62a92dSRobert Mustacchi static void
check_pos(FILE * f,long pos)26cd62a92dSRobert Mustacchi check_pos(FILE *f, long pos)
27cd62a92dSRobert Mustacchi {
28cd62a92dSRobert Mustacchi 	long l;
29cd62a92dSRobert Mustacchi 	off_t off;
30cd62a92dSRobert Mustacchi 	off64_t off64;
31cd62a92dSRobert Mustacchi 
32cd62a92dSRobert Mustacchi 	l = ftell(f);
33cd62a92dSRobert Mustacchi 	off = ftello(f);
34cd62a92dSRobert Mustacchi 	off64 = ftello64(f);
35cd62a92dSRobert Mustacchi 
36cd62a92dSRobert Mustacchi 	if (l != pos) {
37cd62a92dSRobert Mustacchi 		errx(EXIT_FAILURE, "ftell position mismatched: found %ld, "
38cd62a92dSRobert Mustacchi 		    "expected %ld", l, pos);
39cd62a92dSRobert Mustacchi 	}
40cd62a92dSRobert Mustacchi 
41cd62a92dSRobert Mustacchi 	if (off != pos) {
42cd62a92dSRobert Mustacchi 		errx(EXIT_FAILURE, "ftello position mismatched: found %ld, "
43cd62a92dSRobert Mustacchi 		    "expected %ld", off, pos);
44cd62a92dSRobert Mustacchi 	}
45cd62a92dSRobert Mustacchi 
46cd62a92dSRobert Mustacchi 	if (off64 != pos) {
47*6353250fSRobert Mustacchi 		errx(EXIT_FAILURE, "ftello64 position mismatched: found %"
48*6353250fSRobert Mustacchi 		    PRId64 " expected %ld", off64, pos);
49cd62a92dSRobert Mustacchi 	}
50cd62a92dSRobert Mustacchi }
51cd62a92dSRobert Mustacchi 
52cd62a92dSRobert Mustacchi static void
check_one(FILE * f)53cd62a92dSRobert Mustacchi check_one(FILE *f)
54cd62a92dSRobert Mustacchi {
55cd62a92dSRobert Mustacchi 	if (fputc('a', f) != 'a') {
56cd62a92dSRobert Mustacchi 		err(EXIT_FAILURE, "failed to write character");
57cd62a92dSRobert Mustacchi 	}
58cd62a92dSRobert Mustacchi 	check_pos(f, 1);
59cd62a92dSRobert Mustacchi 
60cd62a92dSRobert Mustacchi 	if (ungetc('b', f) != 'b') {
61cd62a92dSRobert Mustacchi 		err(EXIT_FAILURE, "failed to unget character");
62cd62a92dSRobert Mustacchi 	}
63cd62a92dSRobert Mustacchi 	check_pos(f, 0);
64cd62a92dSRobert Mustacchi }
65cd62a92dSRobert Mustacchi 
66cd62a92dSRobert Mustacchi int
main(void)67cd62a92dSRobert Mustacchi main(void)
68cd62a92dSRobert Mustacchi {
69cd62a92dSRobert Mustacchi 	FILE *f;
70cd62a92dSRobert Mustacchi 
71cd62a92dSRobert Mustacchi 	f = tmpfile();
72cd62a92dSRobert Mustacchi 	if (f == NULL) {
73cd62a92dSRobert Mustacchi 		err(EXIT_FAILURE, "failed to create temproary "
74cd62a92dSRobert Mustacchi 		    "file");
75cd62a92dSRobert Mustacchi 	}
76cd62a92dSRobert Mustacchi 
77cd62a92dSRobert Mustacchi 	if (setvbuf(f, NULL, _IONBF, 0) != 0) {
78cd62a92dSRobert Mustacchi 		err(EXIT_FAILURE, "failed to set non-buffering mode");
79cd62a92dSRobert Mustacchi 	}
80cd62a92dSRobert Mustacchi 	check_one(f);
81cd62a92dSRobert Mustacchi 	if (fclose(f) != 0) {
82cd62a92dSRobert Mustacchi 		err(EXIT_FAILURE, "failed to close temporary file");
83cd62a92dSRobert Mustacchi 	}
84cd62a92dSRobert Mustacchi 
85cd62a92dSRobert Mustacchi 	return (0);
86cd62a92dSRobert Mustacchi }
87