]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/27_io/basic_filebuf/underflow/char/10097.cc
Update copyright years.
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 27_io / basic_filebuf / underflow / char / 10097.cc
CommitLineData
34f4edf8
MM
1// { dg-require-fork "" }
2// { dg-require-mkfifo "" }
3
23cac885
BK
4// 2001-05-21 Benjamin Kosnik <bkoz@redhat.com>
5
8d9254fc 6// Copyright (C) 2001-2020 Free Software Foundation, Inc.
23cac885
BK
7//
8// This file is part of the GNU ISO C++ Library. This library is free
9// software; you can redistribute it and/or modify it under the
10// terms of the GNU General Public License as published by the
748086b7 11// Free Software Foundation; either version 3, or (at your option)
23cac885
BK
12// any later version.
13
14// This library is distributed in the hope that it will be useful,
15// but WITHOUT ANY WARRANTY; without even the implied warranty of
16// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17// GNU General Public License for more details.
18
19// You should have received a copy of the GNU General Public License along
748086b7
JJ
20// with this library; see the file COPYING3. If not see
21// <http://www.gnu.org/licenses/>.
23cac885
BK
22
23// 27.8.1.4 Overridden virtual functions
24
25#include <fstream>
debac9f4 26#include <cstdlib>
23cac885
BK
27#include <unistd.h>
28#include <signal.h>
29#include <fcntl.h>
30#include <sys/types.h>
31#include <sys/stat.h>
9339bda8 32
23cac885
BK
33#include <testsuite_hooks.h>
34
35class UnderBuf : public std::filebuf
36{
37public:
38 int_type
39 pub_underflow()
40 { return underflow(); }
41
42 std::streamsize
43 pub_showmanyc()
44 { return showmanyc(); }
45};
46
47// libstdc++/10097
48// filebuf::underflow drops characters.
9339bda8 49bool test16()
23cac885
BK
50{
51 using namespace std;
ea1ea21a 52 using namespace __gnu_test;
118c8424 53 bool test = true;
23cac885
BK
54
55 const char* name = "tmp_fifo1";
56
57 signal(SIGPIPE, SIG_IGN);
58 unlink(name);
59
34f4edf8 60 if (0 != mkfifo(name, S_IRWXU))
23cac885 61 {
118c8424 62 test = false;
23cac885
BK
63 }
64
189cd505 65 semaphore s1, s2;
23cac885
BK
66 int fval = fork();
67 if (fval == -1)
68 {
69 unlink(name);
118c8424 70 test = false;
23cac885
BK
71 }
72 else if (fval == 0)
73 {
74 filebuf fbout;
f196bdc4 75 fbout.open(name, ios_base::in|ios_base::out);
118c8424 76 test &= bool( fbout.is_open() );
23cac885
BK
77 fbout.sputn("0123456789", 10);
78 fbout.pubsync();
189cd505 79 s1.wait();
23cac885 80 fbout.close();
189cd505 81 s2.signal();
23cac885
BK
82 exit(0);
83 }
84
85 UnderBuf fb;
86 fb.open(name, ios_base::in);
9339bda8 87
23cac885
BK
88 fb.sgetc();
89 streamsize n = fb.pub_showmanyc();
90
91 while (n > 0)
92 {
93 --n;
94
95 UnderBuf::int_type c = fb.pub_underflow();
118c8424
PC
96 test &= bool( c != UnderBuf::traits_type::eof() );
97
23cac885
BK
98 fb.sbumpc();
99 }
100
101 fb.close();
189cd505
HH
102 s1.signal();
103 s2.wait();
9339bda8
PC
104
105 return test;
23cac885
BK
106}
107
11f10e6b 108int main()
23cac885 109{
9339bda8 110 return !test16();
23cac885 111}