00001
00002 #include <sys/types.h>
00003 #include <sys/stat.h>
00004 #include <fcntl.h>
00005 #include <signal.h>
00006
00007 #include <iostream>
00008 #include <fstream>
00009 #include <string>
00010 #include <unistd.h>
00011 #include <cstdlib>
00012 #include <cstdio>
00013 #include <ctime>
00014 #include <cmath>
00015
00016 #include <QCoreApplication>
00017 #include <QString>
00018 #include <QRegExp>
00019 #include <QFileInfo>
00020 #include <QDir>
00021
00022 #include "exitcodes.h"
00023 #include "mythcontext.h"
00024 #include "jobqueue.h"
00025 #include "mythdbcon.h"
00026 #include "mythversion.h"
00027 #include "commandlineparser.h"
00028 #include "compat.h"
00029 #include "mythsystemevent.h"
00030 #include "mythlogging.h"
00031
00032 #define LOC QString("MythJobQueue: ")
00033 #define LOC_WARN QString("MythJobQueue, Warning: ")
00034 #define LOC_ERR QString("MythJobQueue, Error: ")
00035
00036 using namespace std;
00037
00038 JobQueue *jobqueue = NULL;
00039 QString pidfile;
00040 QString logfile;
00041
00042 static void cleanup(void)
00043 {
00044 delete gContext;
00045 gContext = NULL;
00046
00047 if (pidfile.size())
00048 {
00049 unlink(pidfile.toAscii().constData());
00050 pidfile.clear();
00051 }
00052 }
00053
00054 namespace
00055 {
00056 class CleanupGuard
00057 {
00058 public:
00059 typedef void (*CleanupFunc)();
00060
00061 public:
00062 CleanupGuard(CleanupFunc cleanFunction) :
00063 m_cleanFunction(cleanFunction) {}
00064
00065 ~CleanupGuard()
00066 {
00067 m_cleanFunction();
00068 }
00069
00070 private:
00071 CleanupFunc m_cleanFunction;
00072 };
00073 }
00074
00075 int main(int argc, char *argv[])
00076 {
00077 MythJobQueueCommandLineParser cmdline;
00078 if (!cmdline.Parse(argc, argv))
00079 {
00080 cmdline.PrintHelp();
00081 return GENERIC_EXIT_INVALID_CMDLINE;
00082 }
00083
00084 if (cmdline.toBool("showhelp"))
00085 {
00086 cmdline.PrintHelp();
00087 return GENERIC_EXIT_OK;
00088 }
00089
00090 if (cmdline.toBool("showversion"))
00091 {
00092 cmdline.PrintVersion();
00093 return GENERIC_EXIT_OK;
00094 }
00095
00096 QCoreApplication a(argc, argv);
00097 QCoreApplication::setApplicationName(MYTH_APPNAME_MYTHJOBQUEUE);
00098
00099 int retval = cmdline.Daemonize();
00100 if (retval != GENERIC_EXIT_OK)
00101 return retval;
00102
00103 bool daemonize = cmdline.toBool("daemon");
00104 QString mask("general");
00105 if ((retval = cmdline.ConfigureLogging(mask, daemonize)) != GENERIC_EXIT_OK)
00106 return retval;
00107
00108 CleanupGuard callCleanup(cleanup);
00109
00110 gContext = new MythContext(MYTH_BINARY_VERSION);
00111 if (!gContext->Init(false))
00112 {
00113 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to init MythContext, exiting.");
00114 return GENERIC_EXIT_NO_MYTHCONTEXT;
00115 }
00116
00117 cmdline.ApplySettingsOverride();
00118
00119 if (!gCoreContext->ConnectToMasterServer())
00120 {
00121 LOG(VB_GENERAL, LOG_ERR, LOC + "Failed to connect to master server");
00122 return GENERIC_EXIT_CONNECT_ERROR;
00123 }
00124
00125 jobqueue = new JobQueue(false);
00126
00127 MythSystemEventHandler *sysEventHandler = new MythSystemEventHandler();
00128
00129 int exitCode = a.exec();
00130
00131 if (sysEventHandler)
00132 delete sysEventHandler;
00133
00134 return exitCode ? exitCode : GENERIC_EXIT_OK;
00135 }
00136
00137