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