From 5b5cd277ef1b94a16c1c4f064bd989d8065132c9 Mon Sep 17 00:00:00 2001 From: wfjm Date: Sat, 13 Jul 2019 08:41:53 +0200 Subject: [PATCH] use RfileFd in Rw11VirtTapeTap - RfileFd: add Open(fnam,flags,mode,emsg) - Rw11VirtTape: remove dtor - Rw11VirtTapeTap: use RfileFd; remove dtor --- tools/src/librtools/RfileFd.cpp | 16 ++++- tools/src/librtools/RfileFd.hpp | 6 +- tools/src/librw11/Rw11VirtDiskFile.cpp | 7 +- tools/src/librw11/Rw11VirtTape.cpp | 22 ++---- tools/src/librw11/Rw11VirtTape.hpp | 17 ++--- tools/src/librw11/Rw11VirtTapeTap.cpp | 93 +++++++------------------- tools/src/librw11/Rw11VirtTapeTap.hpp | 21 ++---- tools/src/librw11/Rw11VirtTapeTap.ipp | 13 +--- 8 files changed, 62 insertions(+), 133 deletions(-) diff --git a/tools/src/librtools/RfileFd.cpp b/tools/src/librtools/RfileFd.cpp index a5727c0c..5fc18c02 100644 --- a/tools/src/librtools/RfileFd.cpp +++ b/tools/src/librtools/RfileFd.cpp @@ -1,9 +1,10 @@ -// $Id: RfileFd.cpp 1167 2019-06-20 10:17:11Z mueller $ +// $Id: RfileFd.cpp 1180 2019-07-08 15:46:59Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2019- by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.1 add Open(fnam,flags,mode,emsg) // 2019-06-15 1163 1.0 Initial version // --------------------------------------------------------------------------- @@ -54,6 +55,19 @@ bool RfileFd::Open(const char* fname, int flags, RerrMsg& emsg) //------------------------------------------+----------------------------------- //! FIXME_docs +bool RfileFd::Open(const char* fname, int flags, mode_t mode, RerrMsg& emsg) +{ + Close(); + if (!SetFd(::open(fname, flags, mode))) { + emsg.InitErrno(fCnam+"Open()", + string("open() for '") + fname + "' failed: ", errno); + } + return IsOpen(); +} + +//------------------------------------------+----------------------------------- +//! FIXME_docs + bool RfileFd::Stat(struct stat *sbuf, RerrMsg& emsg) { if (::fstat(fFd, sbuf) < 0) { diff --git a/tools/src/librtools/RfileFd.hpp b/tools/src/librtools/RfileFd.hpp index bde90f78..d44cdfd4 100644 --- a/tools/src/librtools/RfileFd.hpp +++ b/tools/src/librtools/RfileFd.hpp @@ -1,9 +1,10 @@ -// $Id: RfileFd.hpp 1167 2019-06-20 10:17:11Z mueller $ +// $Id: RfileFd.hpp 1180 2019-07-08 15:46:59Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2019- by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.1 add Open(fnam,flags,mode,emsg) // 2019-06-15 1163 1.0 Initial version // --------------------------------------------------------------------------- @@ -35,12 +36,13 @@ namespace Retro { RfileFd& operator=(const RfileFd&) = delete; // noncopyable bool Open(const char* fname, int flags, RerrMsg& emsg); + bool Open(const char* fname, int flags, mode_t mode, + RerrMsg& emsg); bool Stat(struct stat *sbuf, RerrMsg& emsg); off_t Seek(off_t offset, int whence, RerrMsg& emsg); bool Truncate(off_t length, RerrMsg& emsg); ssize_t Read(void *buf, size_t count, RerrMsg& emsg); bool WriteAll(const void *buf, size_t count, RerrMsg& emsg); - }; } // end namespace Retro diff --git a/tools/src/librw11/Rw11VirtDiskFile.cpp b/tools/src/librw11/Rw11VirtDiskFile.cpp index c9b8e828..eeaaa96a 100644 --- a/tools/src/librw11/Rw11VirtDiskFile.cpp +++ b/tools/src/librw11/Rw11VirtDiskFile.cpp @@ -1,4 +1,4 @@ -// $Id: Rw11VirtDiskFile.cpp 1167 2019-06-20 10:17:11Z mueller $ +// $Id: Rw11VirtDiskFile.cpp 1180 2019-07-08 15:46:59Z mueller $ // SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2013-2019 by Walter F.J. Mueller // @@ -19,11 +19,6 @@ \brief Implemenation of Rw11VirtDiskFile. */ -#include -#include -#include -#include - #include "librtools/RosFill.hpp" #include "Rw11VirtDiskFile.hpp" diff --git a/tools/src/librw11/Rw11VirtTape.cpp b/tools/src/librw11/Rw11VirtTape.cpp index 8973aa8e..8be4cf22 100644 --- a/tools/src/librw11/Rw11VirtTape.cpp +++ b/tools/src/librw11/Rw11VirtTape.cpp @@ -1,18 +1,10 @@ -// $Id: Rw11VirtTape.cpp 1090 2018-12-21 12:17:35Z mueller $ -// -// Copyright 2015-2018 by Walter F.J. Mueller -// -// This program is free software; you may redistribute and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3, or (at your option) any later version. -// -// This program 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 complete details. +// $Id: Rw11VirtTape.cpp 1180 2019-07-08 15:46:59Z mueller $ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2015-2019 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.2.2 remove dtor // 2018-12-19 1090 1.2.1 use RosPrintf(bool) // 2018-12-02 1076 1.2 use unique_ptr for New() // 2017-04-07 868 1.1.1 Dump(): add detail arg @@ -71,12 +63,6 @@ Rw11VirtTape::Rw11VirtTape(Rw11Unit* punit) fStats.Define(kStatNVTRewind, "NVTRewind", "Rewind() calls"); } -//------------------------------------------+----------------------------------- -//! Destructor - -Rw11VirtTape::~Rw11VirtTape() -{} - //------------------------------------------+----------------------------------- //! FIXME_docs diff --git a/tools/src/librw11/Rw11VirtTape.hpp b/tools/src/librw11/Rw11VirtTape.hpp index cec8f1f4..c37ed311 100644 --- a/tools/src/librw11/Rw11VirtTape.hpp +++ b/tools/src/librw11/Rw11VirtTape.hpp @@ -1,18 +1,10 @@ -// $Id: Rw11VirtTape.hpp 1076 2018-12-02 12:45:49Z mueller $ -// -// Copyright 2015-2018 by Walter F.J. Mueller -// -// This program is free software; you may redistribute and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3, or (at your option) any later version. -// -// This program 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 complete details. +// $Id: Rw11VirtTape.hpp 1180 2019-07-08 15:46:59Z mueller $ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2015-2019 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.2.1 remove dtor // 2018-12-02 1076 1.2 use unique_ptr for New() // 2017-04-07 868 1.1.1 Dump(): add detail arg // 2017-04-02 864 1.1 move fWProt,WProt() to Rw11Virt base @@ -38,7 +30,6 @@ namespace Retro { class Rw11VirtTape : public Rw11Virt { public: explicit Rw11VirtTape(Rw11Unit* punit); - ~Rw11VirtTape(); void SetCapacity(size_t nbyte); size_t Capacity() const; diff --git a/tools/src/librw11/Rw11VirtTapeTap.cpp b/tools/src/librw11/Rw11VirtTapeTap.cpp index 525ae81a..4d734741 100644 --- a/tools/src/librw11/Rw11VirtTapeTap.cpp +++ b/tools/src/librw11/Rw11VirtTapeTap.cpp @@ -1,18 +1,10 @@ -// $Id: Rw11VirtTapeTap.cpp 1161 2019-06-08 11:52:01Z mueller $ -// -// Copyright 2015-2018 by Walter F.J. Mueller -// -// This program is free software; you may redistribute and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3, or (at your option) any later version. -// -// This program 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 complete details. +// $Id: Rw11VirtTapeTap.cpp 1180 2019-07-08 15:46:59Z mueller $ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2015-2019 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.1 use RfileFd; remove dtor // 2018-12-19 1090 1.0.4 use RosPrintf(bool) // 2018-09-22 1048 1.0.3 BUGFIX: coverity (resource leak; bad expression) // 2017-04-15 875 1.0.2 Open(): set default scheme @@ -26,11 +18,6 @@ \brief Implemenation of Rw11VirtTapeTap. */ -#include -#include -#include -#include - #include "librtools/RosFill.hpp" #include "librtools/RosPrintf.hpp" #include "librtools/Rtools.hpp" @@ -61,7 +48,7 @@ const uint32_t Rw11VirtTapeTap::kMeta_B_Rlen; Rw11VirtTapeTap::Rw11VirtTapeTap(Rw11Unit* punit) : Rw11VirtTape(punit), - fFd(0), + fFd("Rw11VirtTapeTap::fFd."), fSize(0), fPos(0), fBad(true), @@ -69,14 +56,6 @@ Rw11VirtTapeTap::Rw11VirtTapeTap(Rw11Unit* punit) fTruncPend(false) {} -//------------------------------------------+----------------------------------- -//! Destructor - -Rw11VirtTapeTap::~Rw11VirtTapeTap() -{ - if (fFd > 2) ::close(fFd); -} - //------------------------------------------+----------------------------------- //! FIXME_docs @@ -125,25 +104,17 @@ bool Rw11VirtTapeTap::Open(const std::string& url, RerrMsg& emsg) } } - int fd = ::open(fUrl.Path().c_str(), fWProt ? O_RDONLY : O_CREAT|O_RDWR, - S_IRUSR|S_IWUSR|S_IRGRP); - if (fd < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Open()", - string("open() for '") + fUrl.Path() + "' failed: ", errno); - return false; - } + if (!fFd.Open(fUrl.Path().c_str(), fWProt ? O_RDONLY : O_CREAT|O_RDWR, + S_IRUSR|S_IWUSR|S_IRGRP, emsg)) return false; struct stat sbuf; - if (::fstat(fd, &sbuf) < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Open()", - string("stat() for '") + fUrl.Path() + "' failed: ", errno); - ::close(fd); + if (!fFd.Stat(&sbuf, emsg)) { + fFd.Close(); return false; } - + if ((sbuf.st_mode & S_IWUSR) == 0) fWProt = true; - fFd = fd; fSize = sbuf.st_size; fPos = 0; fBad = false; @@ -162,7 +133,7 @@ bool Rw11VirtTapeTap::Open(const std::string& url, RerrMsg& emsg) //! FIXME_docs bool Rw11VirtTapeTap::ReadRecord(size_t nbyt, uint8_t* data, size_t& ndone, - int& opcode, RerrMsg& emsg) + int& opcode, RerrMsg& emsg) { fStats.Inc(kStatNVTReadRec); @@ -242,7 +213,7 @@ bool Rw11VirtTapeTap::ReadRecord(size_t nbyt, uint8_t* data, size_t& ndone, //! FIXME_docs bool Rw11VirtTapeTap::WriteRecord(size_t nbyt, const uint8_t* data, - int& opcode, RerrMsg& emsg) + int& opcode, RerrMsg& emsg) { fStats.Inc(kStatNVTWriteRec); fStats.Inc(kStatNVTWriteByt, nbyt); @@ -301,7 +272,7 @@ bool Rw11VirtTapeTap::WriteEof(RerrMsg& emsg) //! FIXME_docs bool Rw11VirtTapeTap::SpaceForw(size_t nrec, size_t& ndone, - int& opcode, RerrMsg& emsg) + int& opcode, RerrMsg& emsg) { fStats.Inc(kStatNVTSpaForw); @@ -360,7 +331,7 @@ bool Rw11VirtTapeTap::SpaceForw(size_t nrec, size_t& ndone, //! FIXME_docs bool Rw11VirtTapeTap::SpaceBack(size_t nrec, size_t& ndone, - int& opcode, RerrMsg& emsg) + int& opcode, RerrMsg& emsg) { fStats.Inc(kStatNVTSpaBack); @@ -450,7 +421,7 @@ void Rw11VirtTapeTap::Dump(std::ostream& os, int ind, const char* text, RosFill bl(ind); os << bl << (text?text:"--") << "Rw11VirtTapeTap @ " << this << endl; - os << bl << " fFd: " << fFd << endl; + os << bl << " fFd: " << fFd.Fd() << endl; os << bl << " fSize: " << fSize << endl; os << bl << " fPos: " << fPos << endl; os << bl << " fBad: " << RosPrintf(fBad) << endl; @@ -473,10 +444,7 @@ bool Rw11VirtTapeTap::Seek(size_t seekpos, int dir, RerrMsg& emsg) whence = SEEK_CUR; offset = -offset; } - if (::lseek(fFd, offset, whence) < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Seek()", "seek() failed: ", errno); - return false; - } + if (!fFd.Seek(offset, whence, emsg)) return false; UpdatePos(seekpos, dir); @@ -488,11 +456,8 @@ bool Rw11VirtTapeTap::Seek(size_t seekpos, int dir, RerrMsg& emsg) bool Rw11VirtTapeTap::Read(size_t nbyt, uint8_t* data, RerrMsg& emsg) { - ssize_t irc = ::read(fFd, data, nbyt); - if (irc < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Read()", "read() failed: ", errno); - return false; - } + ssize_t irc = fFd.Read(data, nbyt, emsg); + if (irc < 0) return false; UpdatePos(nbyt, +1); return true; } @@ -501,23 +466,15 @@ bool Rw11VirtTapeTap::Read(size_t nbyt, uint8_t* data, RerrMsg& emsg) //! FIXME_docs bool Rw11VirtTapeTap::Write(size_t nbyt, const uint8_t* data, bool back, - RerrMsg& emsg) + RerrMsg& emsg) { if (fTruncPend) { - if (::ftruncate(fFd, fPos) < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Write()", "ftruncate() failed: ", errno); - return false; - } + if (!fFd.Truncate(fPos, emsg)) return false; fTruncPend = false; fSize = fPos; } - ssize_t irc = ::write(fFd, data, nbyt); - if (irc < 0) { - emsg.InitErrno("Rw11VirtTapeTap::Write()", "write() failed: ", errno); - return false; - } - + if (!fFd.WriteAll(data, nbyt, emsg)) return false; UpdatePos(nbyt, +1); if (fPos > fSize) fSize = fPos; @@ -532,7 +489,7 @@ bool Rw11VirtTapeTap::Write(size_t nbyt, const uint8_t* data, bool back, //! FIXME_docs bool Rw11VirtTapeTap::CheckSizeForw(size_t nbyt, const char* text, - RerrMsg& emsg) + RerrMsg& emsg) { if (fPos+nbyt <= fSize) return true; emsg.Init("Rw11VirtTapeTap::CheckSizeForw()", text); @@ -542,8 +499,8 @@ bool Rw11VirtTapeTap::CheckSizeForw(size_t nbyt, const char* text, //------------------------------------------+----------------------------------- //! FIXME_docs -bool Rw11VirtTapeTap::CheckSizeBack(size_t nbyt, const char* text, - RerrMsg& emsg) +bool Rw11VirtTapeTap::CheckSizeBack(size_t nbyt, const char* text, + RerrMsg& emsg) { if (nbyt <= fPos) return true; emsg.Init("Rw11VirtTapeTap::CheckSizeBack()", text); @@ -573,7 +530,7 @@ void Rw11VirtTapeTap::UpdatePos(size_t nbyt, int dir) //! FIXME_docs bool Rw11VirtTapeTap::ParseMeta(uint32_t meta, size_t& rlen, bool& perr, - RerrMsg& emsg) + RerrMsg& emsg) { rlen = meta & kMeta_B_Rlen; perr = meta & kMeta_M_Perr; diff --git a/tools/src/librw11/Rw11VirtTapeTap.hpp b/tools/src/librw11/Rw11VirtTapeTap.hpp index 8473ed36..01a1bae5 100644 --- a/tools/src/librw11/Rw11VirtTapeTap.hpp +++ b/tools/src/librw11/Rw11VirtTapeTap.hpp @@ -1,18 +1,10 @@ -// $Id: Rw11VirtTapeTap.hpp 983 2018-01-02 20:35:59Z mueller $ -// -// Copyright 2015-2017 by Walter F.J. Mueller -// -// This program is free software; you may redistribute and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3, or (at your option) any later version. -// -// This program 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 complete details. +// $Id: Rw11VirtTapeTap.hpp 1180 2019-07-08 15:46:59Z mueller $ +// SPDX-License-Identifier: GPL-3.0-or-later +// Copyright 2015-2019 by Walter F.J. Mueller // // Revision History: // Date Rev Version Comment +// 2019-07-08 1180 1.1 use RfileFd; remove dtor // 2017-04-07 868 1.0.1 Dump(): add detail arg // 2015-06-04 686 1.0 Initial version // 2015-05-17 683 0.1 First draft @@ -27,6 +19,8 @@ #ifndef included_Retro_Rw11VirtTapeTap #define included_Retro_Rw11VirtTapeTap 1 +#include "librtools/RfileFd.hpp" + #include "Rw11VirtTape.hpp" namespace Retro { @@ -35,7 +29,6 @@ namespace Retro { public: explicit Rw11VirtTapeTap(Rw11Unit* punit); - ~Rw11VirtTapeTap(); virtual bool Open(const std::string& url, RerrMsg& emsg); @@ -76,7 +69,7 @@ namespace Retro { void IncPosRecord(int delta); protected: - int fFd; //!< file number + RfileFd fFd; //!< file number size_t fSize; //!< file size size_t fPos; //!< file position bool fBad; //!< BAD file format flag diff --git a/tools/src/librw11/Rw11VirtTapeTap.ipp b/tools/src/librw11/Rw11VirtTapeTap.ipp index 0aec66c2..7a2720ab 100644 --- a/tools/src/librw11/Rw11VirtTapeTap.ipp +++ b/tools/src/librw11/Rw11VirtTapeTap.ipp @@ -1,15 +1,6 @@ -// $Id: Rw11VirtTapeTap.ipp 983 2018-01-02 20:35:59Z mueller $ -// +// $Id: Rw11VirtTapeTap.ipp 1180 2019-07-08 15:46:59Z mueller $ +// SPDX-License-Identifier: GPL-3.0-or-later // Copyright 2015- by Walter F.J. Mueller -// -// This program is free software; you may redistribute and/or modify it under -// the terms of the GNU General Public License as published by the Free -// Software Foundation, either version 3, or (at your option) any later version. -// -// This program 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 complete details. // // Revision History: // Date Rev Version Comment