diff --git a/mythtv/libs/libmythbase/mythsystem.cpp b/mythtv/libs/libmythbase/mythsystem.cpp index 4d9d0da328e..382ba2b0d30 100644 --- a/mythtv/libs/libmythbase/mythsystem.cpp +++ b/mythtv/libs/libmythbase/mythsystem.cpp @@ -300,6 +300,8 @@ void MythSystem::ProcessFlags(uint flags) m_settings["AutoCleanup"] = true; if( flags & kMSAnonLog ) m_settings["AnonLog"] = true; + if( flags & kMSLowExitVal ) + m_settings["OnlyLowExitVal"] = true; } QByteArray MythSystem::Read(int size) diff --git a/mythtv/libs/libmythbase/mythsystem.h b/mythtv/libs/libmythbase/mythsystem.h index edb2d3b7c3d..5c4bcb13ae3 100644 --- a/mythtv/libs/libmythbase/mythsystem.h +++ b/mythtv/libs/libmythbase/mythsystem.h @@ -22,6 +22,7 @@ typedef enum MythSystemMask { kMSAbortOnJump = 0x00001000, //< abort this process on a jumppoint kMSSetPGID = 0x00002000, //< set the process group id kMSAutoCleanup = 0x00004000, //< automatically delete if backgrounded + kMSLowExitVal = 0x00008000, //< allow exit values 0-127 only } MythSystemFlag; #ifdef __cplusplus @@ -73,8 +74,9 @@ class MBASE_PUBLIC MythSystem : public QObject void JumpAbort(void); - bool isBackground() { return GetSetting("RunInBackground"); }; - bool doAutoCleanup() { return GetSetting("AutoCleanup"); }; + bool isBackground() { return GetSetting("RunInBackground"); }; + bool doAutoCleanup() { return GetSetting("AutoCleanup"); }; + bool onlyLowExitVal() { return GetSetting("OnlyLowExitVal"); }; void HandlePreRun(); void HandlePostRun(); diff --git a/mythtv/libs/libmythbase/system-unix.cpp b/mythtv/libs/libmythbase/system-unix.cpp index b2d3594b3b6..77ce404c0b1 100644 --- a/mythtv/libs/libmythbase/system-unix.cpp +++ b/mythtv/libs/libmythbase/system-unix.cpp @@ -315,6 +315,22 @@ void MythSystemManager::run(void) msList.append(ms); + // Deal with (primarily) Ubuntu which seems to consistently be + // screwing up and reporting the signalled case as an exit. This + // workaround will limit the valid exit value to 0 - 127. As all + // of our return values match that (other than the occasional 255) + // this shouldn't cause any issues + if (ms->m_parent->onlyLowExitVal() && WIFEXITED(status) && + WEXITSTATUS(status) != 255 && WEXITSTATUS(status) & 0x80) + { + // Just byte swap the status and it seems to be correctly done + uint16_t oldstatus = status; + status = ((status & 0x00FF) << 8) | ((status & 0xFF00) >> 8); + LOG(VB_SYSTEM, LOG_INFO, + QString("Odd return value: swapping from %1 to %2") + .arg(oldstatus) .arg(status)); + } + // handle normal exit if( WIFEXITED(status) ) { diff --git a/mythtv/libs/libmythtv/jobqueue.cpp b/mythtv/libs/libmythtv/jobqueue.cpp index 1291c405848..fdefb3e66f1 100644 --- a/mythtv/libs/libmythtv/jobqueue.cpp +++ b/mythtv/libs/libmythtv/jobqueue.cpp @@ -2296,7 +2296,7 @@ void JobQueue::DoFlagCommercialsThread(int jobID) LOG(VB_JOBQUEUE, LOG_INFO, LOC + QString("Running command: '%1'") .arg(command)); - breaksFound = myth_system(command); + breaksFound = myth_system(command, kMSLowExitVal); int priority = LOG_NOTICE; QString comment;