1// { dg-require-fork "" }
2// { dg-require-mkfifo "" }
3
4// Copyright (C) 2003 Free Software Foundation, Inc.
5//
6// This file is part of the GNU ISO C++ Library.  This library is free
7// software; you can redistribute it and/or modify it under the
8// terms of the GNU General Public License as published by the
9// Free Software Foundation; either version 2, or (at your option)
10// any later version.
11
12// This library is distributed in the hope that it will be useful,
13// but WITHOUT ANY WARRANTY; without even the implied warranty of
14// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15// GNU General Public License for more details.
16
17// You should have received a copy of the GNU General Public License along
18// with this library; see the file COPYING.  If not, write to the Free
19// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20// USA.
21
22// 27.8.1.4 Overridden virtual functions
23
24#include <unistd.h>
25#include <signal.h>
26#include <fcntl.h>
27#include <sys/types.h>
28#include <sys/stat.h>
29#include <fstream>
30#include <testsuite_hooks.h>
31
32// libstdc++/9533
33void test_01()
34{
35  using namespace std;
36  using namespace __gnu_test;
37  bool test __attribute__((unused)) = true;
38  const char* name = "tmp_fifo1";
39
40  const int count = 10000;
41
42  signal(SIGPIPE, SIG_IGN);
43  unlink(name);
44
45  if (0 != mkfifo(name, S_IRWXU))
46    {
47      VERIFY( false );
48    }
49
50  int fval = fork();
51  if (fval == -1)
52    {
53      unlink(name);
54      VERIFY( false );
55    }
56  else if (fval == 0)
57    {
58      filebuf ofbuf;
59      ofbuf.open(name, ios_base::in|ios_base::out);
60      VERIFY( ofbuf.is_open() );
61      sleep(1);
62
63      for (int i = 0; i < count; ++i)
64	ofbuf.sputc(i % 100);
65
66      ofbuf.pubsync();
67      sleep(1);
68      ofbuf.close();
69      exit(0);
70    }
71
72  filebuf ifbuf;
73  ifbuf.open(name, ios_base::in);
74  VERIFY( ifbuf.is_open() );
75
76  for (int j = 0; j < count; ++j)
77    {
78      filebuf::int_type c1 = ifbuf.sbumpc();
79      VERIFY( c1 == j % 100 );
80    }
81
82  filebuf::int_type c6 = ifbuf.sbumpc();
83  VERIFY( c6 == filebuf::traits_type::eof() );
84
85  sleep(2);
86  ifbuf.close();
87
88  unlink(name);
89}
90
91int
92main()
93{
94  test_01();
95  return 0;
96}
97
98