Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / libstdc++-v3 / testsuite / 27_io / basic_filebuf / close / char / 9964.cc
1 // { dg-require-fork "" }
2 // { dg-require-mkfifo "" }
3
4 // Copyright (C) 2001-2013 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 3, 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 COPYING3.  If not see
19 // <http://www.gnu.org/licenses/>.
20
21 // 27.8.1.3 filebuf member functions
22 // @require@ %-*.tst %-*.txt
23 // @diff@ %-*.tst %-*.txt
24
25 // various tests for filebuf::open() and filebuf::close() including
26 // the non-portable functionality in the libstdc++-v3 IO library
27
28 #include <fstream>
29 #include <cstdlib>
30 #include <unistd.h>
31 #include <signal.h>
32 #include <fcntl.h>
33 #include <sys/types.h>
34 #include <sys/stat.h>
35
36 // No asserts, avoid leaking the semaphores if a VERIFY fails.
37 #undef _GLIBCXX_ASSERT
38
39 #include <testsuite_hooks.h>
40
41 // libstdc++/9964
42 bool test_07()
43 {
44   using namespace std;
45   using namespace __gnu_test;
46   bool test __attribute__((unused)) = true;
47   semaphore s1, s2;
48
49   const char* name = "tmp_fifo3";
50
51   signal(SIGPIPE, SIG_IGN);
52
53   unlink(name);  
54   mkfifo(name, S_IRWXU);
55   
56   int child = fork();
57   VERIFY( child != -1 );
58
59   if (child == 0)
60     {
61       filebuf fbin;
62       fbin.open(name, ios_base::in);
63       s1.wait();
64       fbin.close();
65       s2.signal();
66       exit(0);
67     }
68   
69   filebuf fb;
70   filebuf* ret = fb.open(name, ios_base::in | ios_base::out);
71   VERIFY( ret != 0 );
72   VERIFY( fb.is_open() );
73   s1.signal();
74   s2.wait();
75   fb.sputc('a');
76
77   ret = fb.close();
78   VERIFY( ret != 0 );
79   VERIFY( !fb.is_open() );
80
81   return test;
82 }
83
84 int
85 main()
86 {
87   return !test_07();
88 }