diff --git a/mythtv/libs/libmyth/mediamonitor-unix.cpp b/mythtv/libs/libmyth/mediamonitor-unix.cpp index 1d282c20704..90028220932 100644 --- a/mythtv/libs/libmyth/mediamonitor-unix.cpp +++ b/mythtv/libs/libmyth/mediamonitor-unix.cpp @@ -698,7 +698,7 @@ bool MediaMonitorUnix::AddDevice(struct fstab * mep) #endif if (parts[0].isEmpty()) return false; - pDevice = MythCDROM::get(this, qPrintable(dev), is_supermount, m_allowEject); + pDevice = MythCDROM::get(this, dev, is_supermount, m_allowEject); } if (pDevice) diff --git a/mythtv/libs/libmythbase/iso639.h b/mythtv/libs/libmythbase/iso639.h index 11bcca33e5f..521234db14c 100644 --- a/mythtv/libs/libmythbase/iso639.h +++ b/mythtv/libs/libmythbase/iso639.h @@ -45,12 +45,10 @@ MBASE_PUBLIC QString iso639_str2_to_str3(const QString &str2); static inline QString iso639_key_to_str3(int code) { - char str[4]; - str[0] = static_cast((code>>16) & 0xFF); - str[1] = static_cast((code>>8) & 0xFF); - str[2] = static_cast(code & 0xFF); - str[3] = 0; - return QString(str); + std::string str { static_cast((code>>16) & 0xFF), + static_cast((code>>8) & 0xFF), + static_cast(code & 0xFF) }; + return QString::fromStdString(str); } /// Returns true if the key is 0, 0xFFFFFF, or 'und' diff --git a/mythtv/libs/libmythbase/mythbaseutil.h b/mythtv/libs/libmythbase/mythbaseutil.h index c77eaa62a65..979415d0782 100644 --- a/mythtv/libs/libmythbase/mythbaseutil.h +++ b/mythtv/libs/libmythbase/mythbaseutil.h @@ -2,6 +2,7 @@ #define MYTH_BASE_UTIL_H // POSIX +#include #include // for checking errno #include // for fnctl #include // for fnctl @@ -12,16 +13,19 @@ // MythTV #include "mythlogging.h" +using pipe_fd_array = std::array; +using pipe_flag_array = std::array; + #ifdef _WIN32 -static inline void setup_pipe(int[2], long[2]) {} +static inline void setup_pipe(pipe_fd_array&, pipe_flag_array&) {} #else -static inline void setup_pipe(int mypipe[2], long myflags[2]) +static inline void setup_pipe(pipe_fd_array& mypipe, pipe_flag_array& myflags) { - int pipe_ret = pipe(mypipe); + int pipe_ret = pipe(mypipe.data()); if (pipe_ret < 0) { LOG(VB_GENERAL, LOG_ERR, "Failed to open pipes" + ENO); - mypipe[0] = mypipe[1] = -1; + mypipe.fill(-1); } else { diff --git a/mythtv/libs/libmythbase/mythcdrom-darwin.cpp b/mythtv/libs/libmythbase/mythcdrom-darwin.cpp index 17823aed74c..977352ccfcd 100644 --- a/mythtv/libs/libmythbase/mythcdrom-darwin.cpp +++ b/mythtv/libs/libmythbase/mythcdrom-darwin.cpp @@ -14,14 +14,14 @@ class MythCDROMDarwin: public MythCDROM { public: - MythCDROMDarwin(QObject* par, const char* DevicePath, + MythCDROMDarwin(QObject* par, const QString DevicePath, bool SuperMount, bool AllowEject): MythCDROM(par, DevicePath, SuperMount, AllowEject) {}; void setDeviceSpeed(const char *device, int speed) override; // MythMediaDevice }; -MythCDROM *GetMythCDROMDarwin(QObject* par, const char* devicePath, +MythCDROM *GetMythCDROMDarwin(QObject* par, const QString devicePath, bool SuperMount, bool AllowEject) { return new MythCDROMDarwin(par, devicePath, SuperMount, AllowEject); diff --git a/mythtv/libs/libmythbase/mythcdrom-darwin.h b/mythtv/libs/libmythbase/mythcdrom-darwin.h index 17d84c455c6..b546dd3f6fc 100644 --- a/mythtv/libs/libmythbase/mythcdrom-darwin.h +++ b/mythtv/libs/libmythbase/mythcdrom-darwin.h @@ -1,7 +1,7 @@ #ifndef MYTHCDROM_DARWIN_H_ #define MYTHCDROM_DARWIN_H_ -class MythCDROM *GetMythCDROMDarwin(class QObject* par, const char* devicePath, +class MythCDROM *GetMythCDROMDarwin(class QObject* par, const QString devicePath, bool SuperMount, bool AllowEject); #endif // MYTHCDROM_DARWIN_H_ diff --git a/mythtv/libs/libmythbase/mythcdrom-freebsd.cpp b/mythtv/libs/libmythbase/mythcdrom-freebsd.cpp index a0875533f80..4a2593d05e3 100644 --- a/mythtv/libs/libmythbase/mythcdrom-freebsd.cpp +++ b/mythtv/libs/libmythbase/mythcdrom-freebsd.cpp @@ -12,7 +12,7 @@ class MythCDROMFreeBSD: public MythCDROM { public: - MythCDROMFreeBSD(QObject* par, const char* DevicePath, bool SuperMount, + MythCDROMFreeBSD(QObject* par, const QString DevicePath, bool SuperMount, bool AllowEject): MythCDROM(par, DevicePath, SuperMount, AllowEject) { } @@ -23,7 +23,7 @@ class MythCDROMFreeBSD: public MythCDROM MythMediaError unlock(void) override; // MythMediaDevice }; -MythCDROM *GetMythCDROMFreeBSD(QObject* par, const char* devicePath, +MythCDROM *GetMythCDROMFreeBSD(QObject* par, const QString devicePath, bool SuperMount, bool AllowEject) { return new MythCDROMFreeBSD(par, devicePath, SuperMount, AllowEject); diff --git a/mythtv/libs/libmythbase/mythcdrom-freebsd.h b/mythtv/libs/libmythbase/mythcdrom-freebsd.h index d8cb355a15b..39d79310937 100644 --- a/mythtv/libs/libmythbase/mythcdrom-freebsd.h +++ b/mythtv/libs/libmythbase/mythcdrom-freebsd.h @@ -1,7 +1,7 @@ #ifndef MYTHCDROM_FREEBSD_H_ #define MYTHCDROM_FREEBSD_H_ -class MythCDROM *GetMythCDROMFreeBSD(class QObject* par, const char* devicePath, +class MythCDROM *GetMythCDROMFreeBSD(class QObject* par, const QString devicePath, bool SuperMount, bool AllowEject); #endif // MYTHCDROM_FREEBSD_H_ diff --git a/mythtv/libs/libmythbase/mythcdrom-linux.cpp b/mythtv/libs/libmythbase/mythcdrom-linux.cpp index e12dbb53979..3cdec7ffb65 100644 --- a/mythtv/libs/libmythbase/mythcdrom-linux.cpp +++ b/mythtv/libs/libmythbase/mythcdrom-linux.cpp @@ -35,6 +35,10 @@ using CDROMgenericCmd = struct cdrom_generic_command; // Some structures stolen from the __KERNEL__ section of linux/cdrom.h. +// Prevent clang-tidy modernize-avoid-c-arrays warnings in these +// kernel structures +extern "C" { + // This contains the result of a GPCMD_GET_EVENT_STATUS_NOTIFICATION. // It is the joining of a struct event_header and a struct media_event_desc struct CDROMeventStatus @@ -108,6 +112,9 @@ struct CDROMdiscInfo { uint8_t m_nOpc; }; +// end of kernel structures. +}; + enum CDROMdiscStatus { MEDIA_IS_EMPTY = 0x0, @@ -126,7 +133,7 @@ enum CDROMdiscStatus class MythCDROMLinux: public MythCDROM { public: - MythCDROMLinux(QObject* par, const char* DevicePath, bool SuperMount, + MythCDROMLinux(QObject* par, const QString& DevicePath, bool SuperMount, bool AllowEject): MythCDROM(par, DevicePath, SuperMount, AllowEject) { } @@ -151,7 +158,7 @@ class MythCDROMLinux: public MythCDROM int SCSIstatus(void); }; -MythCDROM *GetMythCDROMLinux(QObject* par, const char* devicePath, +MythCDROM *GetMythCDROMLinux(QObject* par, const QString& devicePath, bool SuperMount, bool AllowEject) { return new MythCDROMLinux(par, devicePath, SuperMount, AllowEject); @@ -187,17 +194,14 @@ int MythCDROMLinux::driveStatus() bool MythCDROMLinux::hasWritableMedia() { - unsigned char buffer[32]; - CDROMgenericCmd cgc; - - memset(buffer, 0, sizeof(buffer)); - memset(&cgc, 0, sizeof(cgc)); + std::array buffer {}; + CDROMgenericCmd cgc {}; cgc.cmd[0] = GPCMD_READ_DISC_INFO; - cgc.cmd[8] = sizeof(buffer); + cgc.cmd[8] = buffer.size(); cgc.quiet = 1; - cgc.buffer = buffer; - cgc.buflen = sizeof(buffer); + cgc.buffer = buffer.data(); + cgc.buflen = buffer.size(); cgc.data_direction = CGC_DATA_READ; if (ioctl(m_deviceHandle, CDROM_SEND_PACKET, &cgc) < 0) @@ -207,7 +211,7 @@ bool MythCDROMLinux::hasWritableMedia() return false; } - auto *di = (CDROMdiscInfo *) buffer; + auto *di = (CDROMdiscInfo *) buffer.data(); switch (di->m_discStatus) { case MEDIA_IS_EMPTY: @@ -237,22 +241,19 @@ bool MythCDROMLinux::hasWritableMedia() int MythCDROMLinux::SCSIstatus() { - unsigned char buffer[8]; - CDROMgenericCmd cgc; - - memset(buffer, 0, sizeof(buffer)); - memset(&cgc, 0, sizeof(cgc)); + std::array buffer {}; + CDROMgenericCmd cgc {}; cgc.cmd[0] = GPCMD_GET_EVENT_STATUS_NOTIFICATION; cgc.cmd[1] = 1; // Tell us immediately cgc.cmd[4] = 1 << 4; // notification class of media - cgc.cmd[8] = sizeof(buffer); + cgc.cmd[8] = buffer.size(); cgc.quiet = 1; - cgc.buffer = buffer; - cgc.buflen = sizeof(buffer); + cgc.buffer = buffer.data(); + cgc.buflen = buffer.size(); cgc.data_direction = CGC_DATA_READ; - auto *es = (CDROMeventStatus *) buffer; + auto *es = (CDROMeventStatus *) buffer.data(); if ((ioctl(m_deviceHandle, CDROM_SEND_PACKET, &cgc) < 0) || es->m_nea // drive does not support request @@ -337,10 +338,10 @@ MythMediaError MythCDROMLinux::ejectSCSI() { int k = 0; sg_io_hdr_t io_hdr; - unsigned char allowRmBlk[6] = {ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0}; - unsigned char startStop1Blk[6] = {START_STOP, 0, 0, 0, 1, 0}; // start - unsigned char startStop2Blk[6] = {START_STOP, 0, 0, 0, 2, 0}; // load eject - unsigned char sense_buffer[16]; + std::array allowRmBlk {ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0}; + std::array startStop1Blk {START_STOP, 0, 0, 0, 1, 0}; // start + std::array startStop2Blk {START_STOP, 0, 0, 0, 2, 0}; // load eject + std::array sense_buffer {}; const unsigned DID_OK = 0; const unsigned DRIVER_OK = 0; @@ -358,12 +359,12 @@ MythMediaError MythCDROMLinux::ejectSCSI() memset(&io_hdr, 0, sizeof(sg_io_hdr_t)); io_hdr.interface_id = 'S'; io_hdr.cmd_len = 6; - io_hdr.mx_sb_len = sizeof(sense_buffer); + io_hdr.mx_sb_len = sense_buffer.size(); io_hdr.dxfer_direction = SG_DXFER_NONE; - io_hdr.sbp = sense_buffer; + io_hdr.sbp = sense_buffer.data(); io_hdr.timeout = 10000; // millisecs - io_hdr.cmdp = allowRmBlk; + io_hdr.cmdp = allowRmBlk.data(); if (ioctl(fd, SG_IO, &io_hdr) < 0) { LOG(VB_MEDIA, LOG_DEBUG, "SG_IO allowRmBlk ioctl failed" + ENO); @@ -375,7 +376,7 @@ MythMediaError MythCDROMLinux::ejectSCSI() return MEDIAERR_FAILED; } - io_hdr.cmdp = startStop1Blk; + io_hdr.cmdp = startStop1Blk.data(); if (ioctl(fd, SG_IO, &io_hdr) < 0) { LOG(VB_MEDIA, LOG_DEBUG, "SG_IO START_STOP(start) ioctl failed" + ENO); @@ -387,7 +388,7 @@ MythMediaError MythCDROMLinux::ejectSCSI() return MEDIAERR_FAILED; } - io_hdr.cmdp = startStop2Blk; + io_hdr.cmdp = startStop2Blk.data(); if (ioctl(fd, SG_IO, &io_hdr) < 0) { LOG(VB_MEDIA, LOG_DEBUG, "SG_IO START_STOP(eject) ioctl failed" + ENO); @@ -756,9 +757,9 @@ bool MythCDROMLinux::isSameDevice(const QString &path) */ void MythCDROMLinux::setDeviceSpeed(const char *device, int speed) { - unsigned char buffer[28] {}; - unsigned char cmd[16] {}; - unsigned char sense[16] {}; + std::array buffer {}; + std::array cmd {}; + std::array sense {}; struct sg_io_hdr sghdr {}; struct stat st {}; int rate = 0; @@ -821,15 +822,15 @@ void MythCDROMLinux::setDeviceSpeed(const char *device, int speed) sghdr.interface_id = 'S'; sghdr.timeout = 5000; sghdr.dxfer_direction = SG_DXFER_TO_DEV; - sghdr.mx_sb_len = sizeof(sense); - sghdr.dxfer_len = sizeof(buffer); - sghdr.cmd_len = sizeof(cmd); - sghdr.sbp = sense; - sghdr.dxferp = buffer; - sghdr.cmdp = cmd; + sghdr.mx_sb_len = sense.size(); + sghdr.dxfer_len = buffer.size(); + sghdr.cmd_len = cmd.size(); + sghdr.sbp = sense.data(); + sghdr.dxferp = buffer.data(); + sghdr.cmdp = cmd.data(); cmd[0] = GPCMD_SET_STREAMING; - cmd[10] = sizeof(buffer); + cmd[10] = buffer.size(); buffer[8] = 0xff; buffer[9] = 0xff; diff --git a/mythtv/libs/libmythbase/mythcdrom-linux.h b/mythtv/libs/libmythbase/mythcdrom-linux.h index 01756d69c74..3c77a26d6df 100644 --- a/mythtv/libs/libmythbase/mythcdrom-linux.h +++ b/mythtv/libs/libmythbase/mythcdrom-linux.h @@ -1,7 +1,7 @@ #ifndef MYTHCDROM_LINUX_H #define MYTHCDROM_LINUX_H -class MythCDROM *GetMythCDROMLinux(class QObject* par, const char* devicePath, +class MythCDROM *GetMythCDROMLinux(class QObject* par, const QString& devicePath, bool SuperMount, bool AllowEject); #endif // MYTHCDROM_LINUX_H diff --git a/mythtv/libs/libmythbase/mythcdrom.cpp b/mythtv/libs/libmythbase/mythcdrom.cpp index 243e1d2ff86..647fffe818c 100644 --- a/mythtv/libs/libmythbase/mythcdrom.cpp +++ b/mythtv/libs/libmythbase/mythcdrom.cpp @@ -32,7 +32,7 @@ #define PATHTO_AUDIO_DETECT "/.TOC.plist" -MythCDROM* MythCDROM::get(QObject* par, const char* devicePath, +MythCDROM* MythCDROM::get(QObject* par, const QString& devicePath, bool SuperMount, bool AllowEject) { #if defined(linux) && !defined(Q_OS_ANDROID) @@ -46,7 +46,7 @@ MythCDROM* MythCDROM::get(QObject* par, const char* devicePath, #endif } -MythCDROM::MythCDROM(QObject* par, const char* DevicePath, bool SuperMount, +MythCDROM::MythCDROM(QObject* par, const QString& DevicePath, bool SuperMount, bool AllowEject) : MythMediaDevice(par, DevicePath, SuperMount, AllowEject) { diff --git a/mythtv/libs/libmythbase/mythcdrom.h b/mythtv/libs/libmythbase/mythcdrom.h index 04ce3bd3591..719ce370253 100644 --- a/mythtv/libs/libmythbase/mythcdrom.h +++ b/mythtv/libs/libmythbase/mythcdrom.h @@ -7,7 +7,7 @@ class MBASE_PUBLIC MythCDROM : public MythMediaDevice { Q_OBJECT protected: - MythCDROM(QObject* par, const char* DevicePath, bool SuperMount, + MythCDROM(QObject* par, const QString& DevicePath, bool SuperMount, bool AllowEject); public: ~MythCDROM() override = default; @@ -20,7 +20,7 @@ class MBASE_PUBLIC MythCDROM : public MythMediaDevice } void setDeviceSpeed(const char *devicePath, int speed) override; // MythMediaDevice - static MythCDROM* get(QObject* par, const char* devicePath, + static MythCDROM* get(QObject* par, const QString& devicePath, bool SuperMount, bool AllowEject); enum ImageType diff --git a/mythtv/libs/libmythbase/mythcommandlineparser.cpp b/mythtv/libs/libmythbase/mythcommandlineparser.cpp index 877205bf1bf..8bb8df2cd8a 100644 --- a/mythtv/libs/libmythbase/mythcommandlineparser.cpp +++ b/mythtv/libs/libmythbase/mythcommandlineparser.cpp @@ -1876,13 +1876,9 @@ QMap MythCommandLineParser::GetSettingsOverride(void) QFile f(filename); if (f.open(QIODevice::ReadOnly)) { - char buf[1024]; - int64_t len = f.readLine(buf, sizeof(buf) - 1); - while (len != -1) - { - if (len >= 1 && buf[len-1]=='\n') - buf[len-1] = 0; - QString line(buf); + QTextStream in(&f); + while (!in.atEnd()) { + QString line = in.readLine().trimmed(); #if QT_VERSION < QT_VERSION_CHECK(5,14,0) QStringList tokens = line.split("=", QString::SkipEmptyParts); @@ -1899,7 +1895,6 @@ QMap MythCommandLineParser::GetSettingsOverride(void) if (!tokens[0].isEmpty()) smap[tokens[0]] = tokens[1]; } - len = f.readLine(buf, sizeof(buf) - 1); } } else diff --git a/mythtv/libs/libmythbase/mythcoreutil.cpp b/mythtv/libs/libmythbase/mythcoreutil.cpp index 2ab3a18e164..4974e1982bf 100644 --- a/mythtv/libs/libmythbase/mythcoreutil.cpp +++ b/mythtv/libs/libmythbase/mythcoreutil.cpp @@ -174,8 +174,7 @@ QByteArray gzipCompress(const QByteArray& data) if (data.length() == 0) return QByteArray(); - static constexpr int kChunkSize = 1024; - char out[kChunkSize]; + std::array out {}; // allocate inflate state z_stream strm; @@ -200,8 +199,8 @@ QByteArray gzipCompress(const QByteArray& data) // run deflate() do { - strm.avail_out = kChunkSize; - strm.next_out = (Bytef*)(out); + strm.avail_out = out.size(); + strm.next_out = (Bytef*)(out.data()); ret = deflate(&strm, Z_FINISH); @@ -216,7 +215,7 @@ QByteArray gzipCompress(const QByteArray& data) return QByteArray(); } - result.append(out, kChunkSize - strm.avail_out); + result.append(out.data(), out.size() - strm.avail_out); } while (strm.avail_out == 0); @@ -232,8 +231,7 @@ QByteArray gzipUncompress(const QByteArray &data) if (data.length() == 0) return QByteArray(); - static constexpr int kChunkSize = 1024; - char out[kChunkSize]; + std::array out {}; // allocate inflate state z_stream strm; @@ -253,8 +251,8 @@ QByteArray gzipUncompress(const QByteArray &data) do { - strm.avail_out = kChunkSize; - strm.next_out = (Bytef*)out; + strm.avail_out = out.size(); + strm.next_out = (Bytef*)out.data(); ret = inflate(&strm, Z_NO_FLUSH); Q_ASSERT(ret != Z_STREAM_ERROR); // state not clobbered @@ -268,7 +266,7 @@ QByteArray gzipUncompress(const QByteArray &data) return QByteArray(); } - result.append(out, kChunkSize - strm.avail_out); + result.append(out.data(), out.size() - strm.avail_out); } while (strm.avail_out == 0); diff --git a/mythtv/libs/libmythbase/mythhdd.cpp b/mythtv/libs/libmythbase/mythhdd.cpp index 90e12bb2d24..656944b546f 100644 --- a/mythtv/libs/libmythbase/mythhdd.cpp +++ b/mythtv/libs/libmythbase/mythhdd.cpp @@ -27,7 +27,7 @@ MythHDD *MythHDD::Get(QObject* par, const char* devicePath, bool SuperMount, * \param AllowEject True if the user is allowed to eject the media. * \return new MythHDD instance. */ -MythHDD::MythHDD(QObject *par, const char *DevicePath, +MythHDD::MythHDD(QObject *par, const QString& DevicePath, bool SuperMount, bool AllowEject) : MythMediaDevice(par, DevicePath, SuperMount, AllowEject) { diff --git a/mythtv/libs/libmythbase/mythhdd.h b/mythtv/libs/libmythbase/mythhdd.h index e17c143fbca..fb9ce49c189 100644 --- a/mythtv/libs/libmythbase/mythhdd.h +++ b/mythtv/libs/libmythbase/mythhdd.h @@ -6,7 +6,7 @@ class MBASE_PUBLIC MythHDD : public MythMediaDevice { public: - MythHDD(QObject* par, const char* DevicePath, + MythHDD(QObject* par, const QString& DevicePath, bool SuperMount, bool AllowEject); MythMediaStatus checkMedia(void) override; // MythMediaDevice diff --git a/mythtv/libs/libmythbase/mythmedia.cpp b/mythtv/libs/libmythbase/mythmedia.cpp index f05fa4be9e7..357b1b95028 100644 --- a/mythtv/libs/libmythbase/mythmedia.cpp +++ b/mythtv/libs/libmythbase/mythmedia.cpp @@ -1,6 +1,7 @@ // C header #include #include +#include #include #include #include @@ -72,9 +73,9 @@ MythMediaEvent::~MythMediaEvent() ext_to_media_t MythMediaDevice::s_ext_to_media; -MythMediaDevice::MythMediaDevice(QObject* par, const char* DevicePath, +MythMediaDevice::MythMediaDevice(QObject* par, QString DevicePath, bool SuperMount, bool AllowEject) - : QObject(par), m_devicePath(DevicePath), + : QObject(par), m_devicePath(std::move(DevicePath)), m_allowEject(AllowEject), m_superMount(SuperMount) { m_realDevice = getSymlinkTarget(m_devicePath); diff --git a/mythtv/libs/libmythbase/mythmedia.h b/mythtv/libs/libmythbase/mythmedia.h index a609974c981..025898936ea 100644 --- a/mythtv/libs/libmythbase/mythmedia.h +++ b/mythtv/libs/libmythbase/mythmedia.h @@ -52,7 +52,7 @@ class MBASE_PUBLIC MythMediaDevice : public QObject friend class MonitorThreadDarwin; // and trigger posting of MythMediaEvents public: - MythMediaDevice(QObject* par, const char* DevicePath, bool SuperMount, + MythMediaDevice(QObject* par, QString DevicePath, bool SuperMount, bool AllowEject); const QString& getMountPath() const { return m_mountPath; } diff --git a/mythtv/libs/libmythbase/mythmiscutil.cpp b/mythtv/libs/libmythbase/mythmiscutil.cpp index 057a2768638..8ee3476ae1d 100644 --- a/mythtv/libs/libmythbase/mythmiscutil.cpp +++ b/mythtv/libs/libmythbase/mythmiscutil.cpp @@ -2,6 +2,7 @@ #include "mythmiscutil.h" // C++ headers +#include #include #include #include @@ -75,16 +76,14 @@ bool getUptime(time_t &uptime) #elif defined(__FreeBSD__) || CONFIG_DARWIN - int mib[2]; + std::array mib { CTL_KERN, KERN_BOOTTIME }; struct timeval bootTime; size_t len; // Uptime is calculated. Get this machine's boot time // and subtract it from the current machine time len = sizeof(bootTime); - mib[0] = CTL_KERN; - mib[1] = KERN_BOOTTIME; - if (sysctl(mib, 2, &bootTime, &len, nullptr, 0) == -1) + if (sysctl(mib.data(), 2, &bootTime, &len, nullptr, 0) == -1) { LOG(VB_GENERAL, LOG_ERR, "sysctl() error"); return false; @@ -633,10 +632,9 @@ QString FileHash(const QString& filename) bool WakeOnLAN(const QString& MAC) { - char msg[1024] = "\xFF\xFF\xFF\xFF\xFF\xFF"; - int msglen = 6; + std::vector msg(6, static_cast(0xFF)); + std::array macaddr {}; QStringList tokens = MAC.split(':'); - int macaddr[6]; if (tokens.size() != 6) { @@ -658,16 +656,17 @@ bool WakeOnLAN(const QString& MAC) } } + msg.reserve(1024); for (int x = 0; x < 16; x++) - for (int y : macaddr) - msg[msglen++] = y; + msg.insert(msg.end(), macaddr.cbegin(), macaddr.cend()); LOG(VB_NETWORK, LOG_INFO, QString("WakeOnLan(): Sending WOL packet to %1").arg(MAC)); QUdpSocket udp_socket; + qlonglong msglen = msg.size(); return udp_socket.writeDatagram( - msg, msglen, QHostAddress::Broadcast, 32767) == msglen; + msg.data(), msglen, QHostAddress::Broadcast, 32767) == msglen; } // Wake up either by command or by MAC address diff --git a/mythtv/libs/libmythbase/mythsystemlegacy.h b/mythtv/libs/libmythbase/mythsystemlegacy.h index a3c0a42f121..de41a99d2da 100644 --- a/mythtv/libs/libmythbase/mythsystemlegacy.h +++ b/mythtv/libs/libmythbase/mythsystemlegacy.h @@ -41,6 +41,7 @@ // review and some cleanup. // C headers +#include #include #include @@ -190,7 +191,7 @@ class MBASE_PUBLIC MythSystemLegacy : public QObject int m_ioprio {0}; Setting m_settings; - QBuffer m_stdbuff[3]; + std::array m_stdbuff; }; MBASE_PUBLIC uint myth_system(const QString &command, diff --git a/mythtv/libs/libmythbase/mythsystemunix.cpp b/mythtv/libs/libmythbase/mythsystemunix.cpp index 6f6c76fb50c..ff182109946 100644 --- a/mythtv/libs/libmythbase/mythsystemunix.cpp +++ b/mythtv/libs/libmythbase/mythsystemunix.cpp @@ -148,7 +148,7 @@ void MythSystemLegacyIOHandler::run(void) void MythSystemLegacyIOHandler::HandleRead(int fd, QBuffer *buff) { errno = 0; - int len = read(fd, &m_readbuf, 65536); + int len = read(fd, m_readbuf.data(), m_readbuf.size()); if( len <= 0 ) { if( errno != EAGAIN ) @@ -159,7 +159,7 @@ void MythSystemLegacyIOHandler::HandleRead(int fd, QBuffer *buff) } else { - buff->buffer().append(m_readbuf, len); + buff->buffer().append(m_readbuf.data(), len); // Get the corresponding MythSystemLegacy instance, and the stdout/stderr // type @@ -770,20 +770,18 @@ void MythSystemLegacyUnix::Fork(time_t timeout) QString LOC_ERR = QString("myth_system('%1'): Error: ").arg(GetLogCmd()); // For use in the child - char locerr[MAX_BUFLEN]; - strncpy(locerr, LOC_ERR.toUtf8().constData(), MAX_BUFLEN); - locerr[MAX_BUFLEN-1] = '\0'; + std::string locerr = qPrintable(LOC_ERR); LOG(VB_SYSTEM, LOG_DEBUG, QString("Launching: %1").arg(GetLogCmd())); - int p_stdin[] = {-1,-1}; - int p_stdout[] = {-1,-1}; - int p_stderr[] = {-1,-1}; + std::array p_stdin {-1,-1}; + std::array p_stdout {-1,-1}; + std::array p_stderr {-1,-1}; /* set up pipes */ if( GetSetting("UseStdin") ) { - if( pipe(p_stdin) == -1 ) + if( pipe(p_stdin.data()) == -1 ) { LOG(VB_SYSTEM, LOG_ERR, LOC_ERR + "stdin pipe() failed"); SetStatus( GENERIC_EXIT_NOT_OK ); @@ -811,7 +809,7 @@ void MythSystemLegacyUnix::Fork(time_t timeout) } if( GetSetting("UseStdout") ) { - if( pipe(p_stdout) == -1 ) + if( pipe(p_stdout.data()) == -1 ) { LOG(VB_SYSTEM, LOG_ERR, LOC_ERR + "stdout pipe() failed"); SetStatus( GENERIC_EXIT_NOT_OK ); @@ -839,7 +837,7 @@ void MythSystemLegacyUnix::Fork(time_t timeout) } if( GetSetting("UseStderr") ) { - if( pipe(p_stderr) == -1 ) + if( pipe(p_stderr.data()) == -1 ) { LOG(VB_SYSTEM, LOG_ERR, LOC_ERR + "stderr pipe() failed"); SetStatus( GENERIC_EXIT_NOT_OK ); diff --git a/mythtv/libs/libmythbase/mythsystemunix.h b/mythtv/libs/libmythbase/mythsystemunix.h index e4d06a1751b..d901ed51917 100644 --- a/mythtv/libs/libmythbase/mythsystemunix.h +++ b/mythtv/libs/libmythbase/mythsystemunix.h @@ -3,6 +3,7 @@ #ifndef MYTHSYSTEM_UNIX_H #define MYTHSYSTEM_UNIX_H +#include #include #include @@ -54,7 +55,7 @@ class MythSystemLegacyIOHandler: public MThread fd_set m_fds {}; int m_maxfd {-1}; bool m_read {true}; - char m_readbuf[65536] {0}; + std::array m_readbuf {}; }; // spawn separate thread for signals to prevent manager @@ -113,7 +114,7 @@ class MBASE_PUBLIC MythSystemLegacyUnix : public MythSystemLegacyPrivate pid_t m_pid {0}; time_t m_timeout {0}; - int m_stdpipe[3] {-1,-1, -1}; + std::array m_stdpipe {-1, -1, -1}; }; #endif // MYTHSYSTEM_UNIX_H diff --git a/mythtv/libs/libmythbase/signalhandling.cpp b/mythtv/libs/libmythbase/signalhandling.cpp index 0cbf72dbe7f..1d77945a4dd 100644 --- a/mythtv/libs/libmythbase/signalhandling.cpp +++ b/mythtv/libs/libmythbase/signalhandling.cpp @@ -7,6 +7,7 @@ #include #include // for free #include +#include #include #include #ifndef _WIN32 @@ -20,7 +21,7 @@ using namespace std; #include "exitcodes.h" #include "signalhandling.h" -int SignalHandler::s_sigFd[2]; +std::array SignalHandler::s_sigFd; volatile bool SignalHandler::s_exit_program = false; QMutex SignalHandler::s_singletonLock; SignalHandler *SignalHandler::s_singleton; @@ -28,31 +29,20 @@ SignalHandler *SignalHandler::s_singleton; // We may need to write out signal info using just the write() function // so we create an array of C strings + measure their lengths. #define SIG_STR_COUNT 256 -char *sig_str[SIG_STR_COUNT]; -uint sig_str_len[SIG_STR_COUNT]; +std::array sig_str; -static void sig_str_init(int sig, const char *name) +static void sig_str_init(size_t sig, const char *name) { - if (sig < SIG_STR_COUNT) - { - char line[128]; - - if (sig_str[sig]) - free(sig_str[sig]); - snprintf(line, 128, "Handling %s\n", name); - line[127] = '\0'; - sig_str[sig] = strdup(line); - sig_str_len[sig] = strlen(line); - } + if (sig >= sig_str.size()) + return; + + sig_str[sig] = qPrintable(QString("Handling %1\n").arg(name)); } static void sig_str_init(void) { - for (int i = 0; i < SIG_STR_COUNT; i++) - { - sig_str[i] = nullptr; + for (size_t i = 0; i < sig_str.size(); i++) sig_str_init(i, qPrintable(QString("Signal %1").arg(i))); - } } QList SignalHandler::s_defaultHandlerList; @@ -88,7 +78,7 @@ SignalHandler::SignalHandler(QList &signallist, QObject *parent) : s_defaultHandlerList << SIGRTMIN; #endif - if (::socketpair(AF_UNIX, SOCK_STREAM, 0, s_sigFd)) + if (::socketpair(AF_UNIX, SOCK_STREAM, 0, s_sigFd.data())) { cerr << "Couldn't create socketpair" << endl; return; @@ -266,8 +256,8 @@ void SignalHandler::signalHandler(int signum, siginfo_t *info, void *context) // we need to stick to system calls that are known to be // signal-safe. write is, the other two aren't. int d = 0; - if (signum < SIG_STR_COUNT) - d+=::write(STDERR_FILENO, sig_str[signum], sig_str_len[signum]); + if (signum < static_cast(sig_str.size())) + d+=::write(STDERR_FILENO, sig_str[signum].c_str(), sig_str[signum].size()); (void) d; // quiet ignoring return value warning. } diff --git a/mythtv/libs/libmythbase/signalhandling.h b/mythtv/libs/libmythbase/signalhandling.h index 6f9d99be683..f724a19b7c0 100644 --- a/mythtv/libs/libmythbase/signalhandling.h +++ b/mythtv/libs/libmythbase/signalhandling.h @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -47,7 +48,7 @@ class MBASE_PUBLIC SignalHandler: public QObject ~SignalHandler() override; void SetHandlerPrivate(int signum, SigHandlerFunc handler); - static int s_sigFd[2]; + static std::array s_sigFd; static volatile bool s_exit_program; QSocketNotifier *m_notifier {nullptr}; char *m_sigStack {nullptr}; diff --git a/mythtv/libs/libmythbase/unzip.cpp b/mythtv/libs/libmythbase/unzip.cpp index e610528cb27..0594c66c69a 100644 --- a/mythtv/libs/libmythbase/unzip.cpp +++ b/mythtv/libs/libmythbase/unzip.cpp @@ -1084,7 +1084,7 @@ UnZip::ErrorCode UnzipPrivate::extractFile(const QString& path, ZipEntryP& entry return UnZip::SeekFailed; // Encryption keys - quint32 keys[3]; + keyset keys; if (entry.isEncrypted()) { @@ -1289,7 +1289,7 @@ int UnzipPrivate::decryptByte(quint32 key2) /*! \internal Update the encryption keys with the next byte of plain text */ -void UnzipPrivate::updateKeys(quint32* keys, int c) const +void UnzipPrivate::updateKeys(keyset keys, int c) const { keys[0] = CRC32(keys[0], c); keys[1] += keys[0] & 0xff; @@ -1301,7 +1301,7 @@ void UnzipPrivate::updateKeys(quint32* keys, int c) const \internal Initialize the encryption keys and the random header according to the given password. */ -void UnzipPrivate::initKeys(const QString& pwd, quint32* keys) const +void UnzipPrivate::initKeys(const QString& pwd, keyset keys) const { keys[0] = 305419896L; keys[1] = 591751049L; @@ -1320,7 +1320,7 @@ void UnzipPrivate::initKeys(const QString& pwd, quint32* keys) const The \p file parameter can be used in the user interface or for debugging purposes as it is the name of the encrypted file for wich the password is being tested. */ -UnZip::ErrorCode UnzipPrivate::testPassword(quint32* keys, const QString& file, const ZipEntryP& header) +UnZip::ErrorCode UnzipPrivate::testPassword(keyset keys, const QString& file, const ZipEntryP& header) { Q_UNUSED(file); @@ -1339,7 +1339,7 @@ UnZip::ErrorCode UnzipPrivate::testPassword(quint32* keys, const QString& file, /*! \internal Tests a set of keys on the encryption header. */ -bool UnzipPrivate::testKeys(const ZipEntryP& header, quint32* keys) +bool UnzipPrivate::testKeys(const ZipEntryP& header, keyset keys) { char lastByte = 0; @@ -1358,7 +1358,7 @@ bool UnzipPrivate::testKeys(const ZipEntryP& header, quint32* keys) /*! \internal Decrypts an array of bytes long \p read. */ -void UnzipPrivate::decryptBytes(quint32* keys, char* buffer, qint64 read) const +void UnzipPrivate::decryptBytes(keyset keys, char* buffer, qint64 read) const { for (int i=0; i<(int)read; ++i) updateKeys(keys, buffer[i] ^= decryptByte(keys[2])); @@ -1367,7 +1367,7 @@ void UnzipPrivate::decryptBytes(quint32* keys, char* buffer, qint64 read) const /*! \internal Converts date and time values from ZIP format to a QDateTime object. */ -QDateTime UnzipPrivate::convertDateTime(const unsigned char date[2], const unsigned char time[2]) +QDateTime UnzipPrivate::convertDateTime(const std::array &date, const std::array &time) { QDateTime dt; diff --git a/mythtv/libs/libmythbase/unzip_p.h b/mythtv/libs/libmythbase/unzip_p.h index 5e12b01d42a..1598fdd21f3 100644 --- a/mythtv/libs/libmythbase/unzip_p.h +++ b/mythtv/libs/libmythbase/unzip_p.h @@ -44,6 +44,8 @@ #include +using keyset = std::array; + // zLib authors suggest using larger buffers (128K or 256K) for (de)compression (especially for inflate()) // we use a 256K buffer here - if you want to use this code on a pre-iceage mainframe please change it ;) #define UNZIP_READ_BUFFER (256*1024) @@ -92,21 +94,21 @@ class UnzipPrivate UnZip::ErrorCode extractFile(const QString& path, ZipEntryP& entry, const QDir& dir, UnZip::ExtractionOptions options); UnZip::ErrorCode extractFile(const QString& path, ZipEntryP& entry, QIODevice* device, UnZip::ExtractionOptions options); - UnZip::ErrorCode testPassword(quint32* keys, const QString& file, const ZipEntryP& header); - bool testKeys(const ZipEntryP& header, quint32* keys); + UnZip::ErrorCode testPassword(keyset keys, const QString& file, const ZipEntryP& header); + bool testKeys(const ZipEntryP& header, keyset keys); bool createDirectory(const QString& path); - inline void decryptBytes(quint32* keys, char* buffer, qint64 read) const; + inline void decryptBytes(keyset keys, char* buffer, qint64 read) const; static inline quint32 getULong(const unsigned char* data, quint32 offset) ; static inline quint64 getULLong(const unsigned char* data, quint32 offset) ; static inline quint16 getUShort(const unsigned char* data, quint32 offset) ; static inline int decryptByte(quint32 key2) ; - inline void updateKeys(quint32* keys, int c) const; - inline void initKeys(const QString& pwd, quint32* keys) const; + inline void updateKeys(keyset keys, int c) const; + inline void initKeys(const QString& pwd, keyset keys) const; - static inline QDateTime convertDateTime(const unsigned char date[2], const unsigned char time[2]) ; + static inline QDateTime convertDateTime(const std::array &date, const std::array &time) ; }; #endif // OSDAB_UNZIP_P_H diff --git a/mythtv/libs/libmythbase/zipentry_p.h b/mythtv/libs/libmythbase/zipentry_p.h index e82636da2e9..76ca23033e4 100644 --- a/mythtv/libs/libmythbase/zipentry_p.h +++ b/mythtv/libs/libmythbase/zipentry_p.h @@ -39,6 +39,8 @@ #ifndef OSDAB_ZIPENTRY_P_H #define OSDAB_ZIPENTRY_P_H +#include + #include #include @@ -49,10 +51,10 @@ class ZipEntryP { lhOffset = 0; dataOffset = 0; - gpFlag[0] = gpFlag[1] = 0; + gpFlag.fill(0); compMethod = 0; - modTime[0] = modTime[1] = 0; - modDate[0] = modDate[1] = 0; + modTime.fill(0); + modDate.fill(0); crc = 0; szComp = szUncomp = 0; lhEntryChecked = false; @@ -60,10 +62,10 @@ class ZipEntryP quint32 lhOffset; // Offset of the local header record for this entry quint32 dataOffset; // Offset of the file data for this entry - unsigned char gpFlag[2] {}; // General purpose flag + std::array gpFlag {}; // General purpose flag quint16 compMethod; // Compression method - unsigned char modTime[2] {}; // Last modified time - unsigned char modDate[2] {}; // Last modified date + std::array modTime {}; // Last modified time + std::array modDate {}; // Last modified date quint32 crc; // CRC32 quint32 szComp; // Compressed file size quint32 szUncomp; // Uncompressed file size diff --git a/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.cpp b/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.cpp index bd3d1653812..e707b44f4d7 100644 --- a/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.cpp +++ b/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.cpp @@ -3,7 +3,6 @@ using namespace std; #include "DeviceReadBuffer.h" #include "mythcorecontext.h" -#include "mythbaseutil.h" #include "mythlogging.h" #include "tspacket.h" #include "mthread.h" diff --git a/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.h b/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.h index 48eac44f658..d22b736e489 100644 --- a/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.h +++ b/mythtv/libs/libmythtv/recorders/DeviceReadBuffer.h @@ -10,6 +10,7 @@ #include #include +#include "mythbaseutil.h" #include "mythtimer.h" #include "tspacket.h" #include "mthread.h" @@ -84,8 +85,8 @@ class DeviceReadBuffer : protected MThread QString m_videoDevice; int m_streamFd {-1}; - mutable int m_wakePipe[2] {-1,-1}; - mutable long m_wakePipeFlags[2] {0,0}; + mutable pipe_fd_array m_wakePipe {-1,-1}; + mutable pipe_flag_array m_wakePipeFlags {0,0}; DeviceReaderCB *m_readerCB {nullptr};