1// { dg-require-mkfifo "" }
2
3// Copyright (C) 2001-2015 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
8// Free Software Foundation; either version 3, or (at your option)
9// any later version.
10
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License along
17// with this library; see the file COPYING3.  If not see
18// <http://www.gnu.org/licenses/>.
19
20// 27.8.1.3 filebuf member functions
21// @require@ %-*.tst %-*.txt
22// @diff@ %-*.tst %-*.txt
23
24// various tests for filebuf::open() and filebuf::close() including
25// the non-portable functionality in the libstdc++-v3 IO library
26
27#include <fstream>
28#include <unistd.h>
29#include <signal.h>
30#include <fcntl.h>
31#include <sys/types.h>
32#include <sys/stat.h>
33#include <testsuite_hooks.h>
34
35// libstdc++/9507
36void test_06()
37{
38  using namespace __gnu_test;
39  bool test __attribute__((unused)) = true;
40  const char* name = "tmp_fifo2";
41
42  signal(SIGPIPE, SIG_IGN);
43
44  unlink(name);
45  mkfifo(name, S_IRWXU);
46
47  std::filebuf fbuf;
48  // The use of ios_base::ate implies an attempt to seek on the file
49  // descriptor.  The seek will fail.  Thus, at the OS level, this
50  // call to "fbuf.open" will result in a call to "open" (which will
51  // succeed), a call to "lseek" (which will fail), and, finally, a
52  // call to "close" (which will succeed).  Thus, after this call, the
53  // file should be closed.
54  std::filebuf* r = fbuf.open(name,
55			      std::ios_base::in
56			      | std::ios_base::out
57			      | std::ios_base::ate);
58  if (!r)
59    VERIFY( !fbuf.is_open() );
60  else
61    VERIFY( fbuf.is_open() );
62}
63
64int
65main()
66{
67  test_06();
68  return 0;
69}
70
71
72