00001 #ifndef _WIN32
00002 #include <QCoreApplication>
00003 #else
00004 #include <QApplication>
00005 #endif
00006
00007 #include <QFileInfo>
00008 #include <QRegExp>
00009 #include <QFile>
00010 #include <QDir>
00011 #include <QMap>
00012
00013 #include "commandlineparser.h"
00014 #include "scheduledrecording.h"
00015 #include "previewgenerator.h"
00016 #include "mythcorecontext.h"
00017 #include "mythsystemevent.h"
00018 #include "backendcontext.h"
00019 #include "main_helpers.h"
00020 #include "storagegroup.h"
00021 #include "housekeeper.h"
00022 #include "mediaserver.h"
00023 #include "mythlogging.h"
00024 #include "mythversion.h"
00025 #include "programinfo.h"
00026 #include "autoexpire.h"
00027 #include "mainserver.h"
00028 #include "remoteutil.h"
00029 #include "exitcodes.h"
00030 #include "scheduler.h"
00031 #include "jobqueue.h"
00032 #include "dbcheck.h"
00033 #include "compat.h"
00034 #include "mythdb.h"
00035 #include "tv_rec.h"
00036
00037
00038 #define LOC QString("MythBackend: ")
00039 #define LOC_WARN QString("MythBackend, Warning: ")
00040 #define LOC_ERR QString("MythBackend, Error: ")
00041
00042 #ifdef Q_OS_MACX
00043
00044 #define UNUSED_FILENO 5
00045 #else
00046 #define UNUSED_FILENO 3
00047 #endif
00048
00049 static void qt_exit(int)
00050 {
00051 signal(SIGINT, SIG_DFL);
00052 QCoreApplication::exit(0);
00053 }
00054
00055 int main(int argc, char **argv)
00056 {
00057 MythBackendCommandLineParser cmdline;
00058 if (!cmdline.Parse(argc, argv))
00059 {
00060 cmdline.PrintHelp();
00061 return GENERIC_EXIT_INVALID_CMDLINE;
00062 }
00063
00064 if (cmdline.toBool("showhelp"))
00065 {
00066 cmdline.PrintHelp();
00067 return GENERIC_EXIT_OK;
00068 }
00069
00070 if (cmdline.toBool("showversion"))
00071 {
00072 cmdline.PrintVersion();
00073 return GENERIC_EXIT_OK;
00074 }
00075
00076 #ifndef _WIN32
00077 for (int i = UNUSED_FILENO; i < sysconf(_SC_OPEN_MAX) - 1; ++i)
00078 close(i);
00079 QCoreApplication a(argc, argv);
00080 #else
00081
00082
00083 QApplication a(argc, argv);
00084 #endif
00085 QCoreApplication::setApplicationName(MYTH_APPNAME_MYTHBACKEND);
00086
00087 pidfile = cmdline.toString("pidfile");
00088 int retval = cmdline.Daemonize();
00089 if (retval != GENERIC_EXIT_OK)
00090 return retval;
00091
00092 bool daemonize = cmdline.toBool("daemon");
00093 QString mask("general");
00094 if ((retval = cmdline.ConfigureLogging(mask, daemonize)) != GENERIC_EXIT_OK)
00095 return retval;
00096
00097 if (daemonize)
00098
00099 close(0);
00100
00101 CleanupGuard callCleanup(cleanup);
00102 signal(SIGINT, qt_exit);
00103 signal(SIGTERM, qt_exit);
00104
00105 gContext = new MythContext(MYTH_BINARY_VERSION);
00106 if (!gContext->Init(false))
00107 {
00108 LOG(VB_GENERAL, LOG_CRIT, "Failed to init MythContext.");
00109 return GENERIC_EXIT_NO_MYTHCONTEXT;
00110 }
00111
00112 setHttpProxy();
00113
00114 cmdline.ApplySettingsOverride();
00115
00116 if (cmdline.toBool("event") || cmdline.toBool("systemevent") ||
00117 cmdline.toBool("setverbose") || cmdline.toBool("printsched") ||
00118 cmdline.toBool("testsched") || cmdline.toBool("resched") ||
00119 cmdline.toBool("scanvideos") || cmdline.toBool("clearcache") ||
00120 cmdline.toBool("printexpire") || cmdline.toBool("setloglevel"))
00121 {
00122 gCoreContext->SetBackend(false);
00123 return handle_command(cmdline);
00124 }
00125
00126 gCoreContext->SetBackend(true);
00127 retval = run_backend(cmdline);
00128 return retval;
00129 }
00130
00131