/*
* fdstream.cc
*
* This file is part of NEST.
*
* Copyright (C) 2004 The NEST Initiative
*
* NEST is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* NEST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with NEST. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "config.h"
#include "fdstream.h"
#ifdef HAVE_ISTREAM
std::streamsize const fdbuf::s_bufsiz;
fdbuf* fdbuf::open(const char* s, std::ios_base::openmode mode)
{
if (is_open())
{
// std::cerr<<"Is already open!"<<std::endl;
return NULL;
}
// bool success=true;
int oflag;
std::ios_base::openmode open_mode =
(mode&~std::ios_base::ate&~std::ios_base::binary);
// the corresponding O_*-flags are as described in Josuttis Chap. 13 (p.632)
if (open_mode == std::ios_base::out) // corresponds to "w"
oflag = (O_WRONLY | O_TRUNC | O_CREAT);
else if (open_mode == (std::ios_base::out|std::ios_base::app))// corresponds to "a"
oflag = (O_WRONLY | O_APPEND| O_CREAT);
else if (open_mode == (std::ios_base::out|std::ios_base::trunc))// corresponds to "w"
oflag = (O_WRONLY | O_TRUNC | O_CREAT);
else if (open_mode == std::ios_base::in)// corresponds to "r"
oflag = O_RDONLY;
else if (open_mode == (std::ios_base::in|std::ios_base::out))// corresponds to "r+"
oflag = O_RDWR;
else if (open_mode == (std::ios_base::in|std::ios_base::out|std::ios_base::trunc))// corresponds to "w+"
oflag = (O_RDWR | O_TRUNC | O_CREAT);
else
{
//std::cerr<<"bad flags!"<<std::endl;
return NULL;
}
m_fd=::open(s, oflag, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); // these file permissions are required by POSIX.1 (see Stevens 5.5)
if (m_fd==-1)
{
// std::cerr<<"::open failed!"<<std::endl;
// perror(NULL);
return NULL;
}
// beware of operator precedence --- HEP
if ( ( mode & std::ios_base::ate ) != 0)
{
if (lseek(m_fd, 0, SEEK_END) == -1)
{
close();
// std::cerr<<"seek failed!"<<std::endl;
// perror(NULL);
return NULL;
}
};
m_isopen=true;
return this;
}
fdbuf* fdbuf::close()
{
if (!is_open())
{
// std::cerr<<"File was not open."<<std::endl;
return NULL;
}
bool success=true;
if (overflow(traits_type::eof()) == traits_type::eof())
{
// std::cerr<<"overflow failed!"<<std::endl;
success=false;
}
if (::close(m_fd)==-1)
{
// std::cerr<<"::close failed: "<<std::endl;perror(NULL);
success=false;
}
m_isopen=false;
return (success ? this : NULL);
}
void ofdstream::close()
{
if (rdbuf()->close() == NULL)
{
setstate(failbit);
}
}
void ifdstream::close()
{
if (rdbuf()->close() == NULL)
{
setstate(failbit);
}
}
void fdstream::close()
{
if (rdbuf()->close() == NULL)
{
setstate(failbit);
}
}
#endif