void eDebugImpl(int flags, const char* fmt, ...) { char buf[1024]; int pos = 0; if (! (flags & _DBGFLG_NOTIME)) { struct timespec tp; clock_gettime(CLOCK_MONOTONIC, &tp); pos = snprintf(buf, sizeof(buf), "<%6lu.%06lu> ", tp.tv_sec, tp.tv_nsec/1000); } va_list ap; va_start(ap, fmt); pos += vsnprintf(buf + pos, sizeof(buf) - pos, fmt, ap); va_end(ap); if (!(flags & _DBGFLG_NONEWLINE)) { /* buf will still be null-terminated here, so it is always safe * to do this. The remainder of this function does not rely * on buf being null terminated. */ buf[pos++] = '\n'; } { singleLock s(DebugLock); logOutput(buf, pos); } if (logOutputConsole) ::write(2, buf, pos); if (flags & _DBGFLG_FATAL) bsodFatal("enigma2"); }
int ePython::call(ePyObject pFunc, ePyObject pArgs) { int res = -1; ePyObject pValue; if (pFunc && PyCallable_Check(pFunc)) { pValue = PyObject_CallObject(pFunc, pArgs); if (pValue) { if (PyInt_Check(pValue)) res = PyInt_AsLong(pValue); else res = 0; Py_DECREF(pValue); } else { PyErr_Print(); ePyObject FuncStr = PyObject_Str(pFunc); ePyObject ArgStr = PyObject_Str(pArgs); eDebug("(PyObject_CallObject(%s,%s) failed)", PyString_AS_STRING(FuncStr), PyString_AS_STRING(ArgStr)); Py_DECREF(FuncStr); Py_DECREF(ArgStr); /* immediately show BSOD, so we have the actual error at the bottom */ bsodFatal(0); /* and make sure we quit (which would also eventually cause a bsod, but with useless termination messages) */ quitMainloop(5); } } return res; }
int ePython::call(ePyObject pFunc, ePyObject pArgs) { int res = -1; ePyObject pValue; if (pFunc && PyCallable_Check(pFunc)) { pValue = PyObject_CallObject(pFunc, pArgs); if (pValue) { if (PyInt_Check(pValue)) res = PyInt_AsLong(pValue); else res = 0; Py_DECREF(pValue); } else { PyErr_Print(); ePyObject FuncStr = PyObject_Str(pFunc); ePyObject ArgStr = PyObject_Str(pArgs); eDebug("(PyObject_CallObject(%s,%s) failed)", PyString_AS_STRING(FuncStr), PyString_AS_STRING(ArgStr)); Py_DECREF(FuncStr); Py_DECREF(ArgStr); bsodFatal(0); } } return res; }
void handleFatalSignal(int signum, siginfo_t *si, void *ctx) { #ifndef NO_OOPS_SUPPORT ucontext_t *uc = (ucontext_t*)ctx; oops(uc->uc_mcontext); #endif eDebug("-------FATAL SIGNAL"); bsodFatal("enigma2, signal"); }
void handleFatalSignal(int signum, siginfo_t *si, void *ctx) { #ifndef NO_OOPS_SUPPORT ucontext_t *uc = (ucontext_t*)ctx; oops(uc->uc_mcontext); #endif print_backtrace(); eLog(lvlFatal, "-------FATAL SIGNAL"); bsodFatal("enigma2, signal"); }
void handleFatalSignal(int signum, siginfo_t *si, void *ctx) { ucontext_t *uc = (ucontext_t*)ctx; eDebug("KILLED BY signal %d", signum); #ifndef NO_OOPS_SUPPORT oops(uc->uc_mcontext, signum == SIGSEGV || signum == SIGABRT); #endif eDebug("-------"); bsodFatal("enigma2, signal"); }
void _eFatal(const char *file, int line, const char *function, const char* fmt, ...) { char timebuffer[32]; char header[256]; char buf[1024]; char ncbuf[1024]; printtime(timebuffer, sizeof(timebuffer)); snprintf(header, sizeof(header), "%s %s:%d %s ", timebuffer, file, line, function); va_list ap; va_start(ap, fmt); vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); removeAnsiEsc(buf, ncbuf); singleLock s(DebugLock); logOutput(lvlFatal, std::string(header) + std::string(ncbuf) + "\n"); if (!logOutputColors) { if(m_erroroutput && m_erroroutput->eErrorOutput::pipe_fd[1] && m_erroroutput->eErrorOutput::threadrunning) { int n; char obuf[1024]; snprintf(obuf, sizeof(obuf), "FATAL: %s%s\n", header, ncbuf); n=write(m_erroroutput->eErrorOutput::pipe_fd[1], obuf, strlen(obuf)); if(n<0) fprintf(stderr, "[eerror] row %d error: %s\n", __LINE__,strerror(errno)); } else fprintf(stderr, "FATAL: %s%s\n", header, ncbuf); } else { snprintf(header, sizeof(header), \ "%s" /*newline*/ ANSI_RED "%s " /*color of timestamp*/\ ANSI_GREEN "%s:%d " /*color of filename and linenumber*/\ ANSI_BGREEN "%s " /*color of functionname*/\ ANSI_BWHITE /*color of debugmessage*/\ , inNoNewLine?"\n":"", timebuffer, file, line, function); if(m_erroroutput && m_erroroutput->eErrorOutput::pipe_fd[1] && m_erroroutput->eErrorOutput::threadrunning) { int n; char obuf[1024]; snprintf(obuf, sizeof(obuf), "FATAL: %s%s\n"ANSI_RESET, header , buf); n=write(m_erroroutput->eErrorOutput::pipe_fd[1], obuf, strlen(obuf)); if(n<0) fprintf(stderr, "[eerror] row %d error: %s\n", __LINE__,strerror(errno)); } else fprintf(stderr, "FATAL: %s%s\n"ANSI_RESET, header , buf); } bsodFatal("enigma2"); inNoNewLine = false; }
void eFatal(const char* fmt, ...) { char buf[1024]; va_list ap; va_start(ap, fmt); vsnprintf(buf, 1024, fmt, ap); va_end(ap); { singleLock s(DebugLock); logOutput(lvlFatal, "FATAL: " + std::string(buf) + "\n"); fprintf(stderr, "FATAL: %s\n",buf ); } bsodFatal("enigma2"); }
ePyObject::operator PyObject*() { if (m_ob) { if (!m_erased && m_ob->ob_refcnt > 0) return m_ob; eDebug("invalid access PyObject %s with refcount <= 0 %d", m_erased ? "deleted" : "undeleted", m_ob->ob_refcnt); if (m_file) eDebug("last modified in file %s line %d from %d to %d", m_file, m_line, m_from, m_to); bsodFatal("enigma2, refcnt"); } return 0; }
void eFatal(const char* fmt, ...) { char buf[1024]; struct timespec tp; clock_gettime(CLOCK_MONOTONIC, &tp); snprintf(buf, 1024, "<%6lu.%06lu> FATAL: ", tp.tv_sec, tp.tv_nsec/1000); va_list ap; va_start(ap, fmt); vsnprintf(buf + strlen(buf), 1024-strlen(buf), fmt, ap); va_end(ap); { singleLock s(DebugLock); logOutput(lvlFatal, std::string(buf) + "\n"); fprintf(stderr, "%s\n", buf); } bsodFatal("enigma2"); }
int main(int argc, char **argv) { #ifdef MEMLEAK_CHECK atexit(DumpUnfreed); #endif #ifdef OBJECT_DEBUG atexit(object_dump); #endif gst_init(&argc, &argv); // set pythonpath if unset setenv("PYTHONPATH", eEnv::resolve("${libdir}/enigma2/python").c_str(), 0); printf("PYTHONPATH: %s\n", getenv("PYTHONPATH")); bsodLogInit(); ePython python; eMain main; #if 1 ePtr<gMainDC> my_dc; gMainDC::getInstance(my_dc); //int double_buffer = my_dc->haveDoubleBuffering(); ePtr<gLCDDC> my_lcd_dc; gLCDDC::getInstance(my_lcd_dc); /* ok, this is currently hardcoded for arabic. */ /* some characters are wrong in the regular font, force them to use the replacement font */ for (int i = 0x60c; i <= 0x66d; ++i) eTextPara::forceReplacementGlyph(i); eTextPara::forceReplacementGlyph(0xfdf2); for (int i = 0xfe80; i < 0xff00; ++i) eTextPara::forceReplacementGlyph(i); // eWidgetDesktop dsk(eSize(720, 576)); eWidgetDesktop dsk(eSize(1280, 720)); eWidgetDesktop dsk_lcd(my_lcd_dc->size()); dsk.setStyleID(0); dsk_lcd.setStyleID(my_lcd_dc->size().width() == 96 ? 2 : 1); /* if (double_buffer) { eDebug(" - double buffering found, enable buffered graphics mode."); dsk.setCompositionMode(eWidgetDesktop::cmBuffered); } */ wdsk = &dsk; lcddsk = &dsk_lcd; dsk.setDC(my_dc); dsk_lcd.setDC(my_lcd_dc); dsk.setBackgroundColor(gRGB(0,0,0,0xFF)); #endif /* redrawing is done in an idle-timer, so we have to set the context */ dsk.setRedrawTask(main); dsk_lcd.setRedrawTask(main); eDebug("Loading spinners..."); { int i; #define MAX_SPINNER 64 ePtr<gPixmap> wait[MAX_SPINNER]; for (i=0; i<MAX_SPINNER; ++i) { char filename[64]; std::string rfilename; snprintf(filename, sizeof(filename), "${datadir}/enigma2/skin_default/spinner/wait%d.png", i + 1); rfilename = eEnv::resolve(filename); loadPNG(wait[i], rfilename.c_str()); if (!wait[i]) { if (!i) eDebug("failed to load %s! (%m)", rfilename.c_str()); else eDebug("found %d spinner!\n", i); break; } } if (i) my_dc->setSpinner(eRect(ePoint(100, 100), wait[0]->size()), wait, i); else my_dc->setSpinner(eRect(100, 100, 0, 0), wait, 1); } gRC::getInstance()->setSpinnerDC(my_dc); eRCInput::getInstance()->keyEvent.connect(slot(keyEvent)); printf("executing main\n"); bsodCatchSignals(); setIoPrio(IOPRIO_CLASS_BE, 3); // python.execute("mytest", "__main__"); python.execFile(eEnv::resolve("${libdir}/enigma2/python/mytest.py").c_str()); extern void setFullsize(); // definend in lib/gui/evideo.cpp setFullsize(); if (exit_code == 5) /* python crash */ { eDebug("(exit code 5)"); bsodFatal(0); } dsk.paint(); dsk_lcd.paint(); { gPainter p(my_lcd_dc); p.resetClip(eRect(ePoint(0, 0), my_lcd_dc->size())); p.clear(); p.flush(); } return exit_code; }
int main(int argc, char **argv) { #ifdef MEMLEAK_CHECK atexit(DumpUnfreed); #endif #ifdef OBJECT_DEBUG atexit(object_dump); #endif #ifndef ENABLE_LIBEPLAYER3 gst_init(&argc, &argv); #endif // set pythonpath if unset setenv("PYTHONPATH", eEnv::resolve("${libdir}/enigma2/python").c_str(), 0); printf("PYTHONPATH: %s\n", getenv("PYTHONPATH")); printf("DVB_API_VERSION %d DVB_API_VERSION_MINOR %d\n", DVB_API_VERSION, DVB_API_VERSION_MINOR); bsodLogInit(); CheckPrintkLevel(); ePython python; eMain main; #if 1 ePtr<gMainDC> my_dc; gMainDC::getInstance(my_dc); //int double_buffer = my_dc->haveDoubleBuffering(); ePtr<gLCDDC> my_lcd_dc; gLCDDC::getInstance(my_lcd_dc); /* ok, this is currently hardcoded for arabic. */ /* some characters are wrong in the regular font, force them to use the replacement font */ for (int i = 0x60c; i <= 0x66d; ++i) eTextPara::forceReplacementGlyph(i); eTextPara::forceReplacementGlyph(0xfdf2); for (int i = 0xfe80; i < 0xff00; ++i) eTextPara::forceReplacementGlyph(i); eWidgetDesktop dsk(my_dc->size()); eWidgetDesktop dsk_lcd(my_lcd_dc->size()); dsk.setStyleID(0); #ifdef HAVE_GRAPHLCD dsk_lcd.setStyleID(my_lcd_dc->size().width() == 320 ? 1 : 2); #else dsk_lcd.setStyleID(my_lcd_dc->size().width() == 96 ? 2 : 1); #endif /* if (double_buffer) { eDebug("[MAIN] - double buffering found, enable buffered graphics mode."); dsk.setCompositionMode(eWidgetDesktop::cmBuffered); } */ wdsk = &dsk; lcddsk = &dsk_lcd; dsk.setDC(my_dc); dsk_lcd.setDC(my_lcd_dc); dsk.setBackgroundColor(gRGB(0,0,0,0xFF)); #endif /* redrawing is done in an idle-timer, so we have to set the context */ dsk.setRedrawTask(main); dsk_lcd.setRedrawTask(main); eDebug("[MAIN] Loading spinners..."); { unsigned int i = 0; bool def = false; const char *path = "${sysconfdir}/enigma2"; #define MAX_SPINNER 64 ePtr<gPixmap> wait[MAX_SPINNER]; while(i < MAX_SPINNER) { char filename[64]; std::string rfilename; snprintf(filename, sizeof(filename), "%s/spinner/wait%d.png", path, i + 1); rfilename = eEnv::resolve(filename); loadPNG(wait[i], rfilename.c_str()); if (!wait[i]) { if (!i) { if (def) eDebug("[MAIN] failed to load %s! (%m)", rfilename.c_str()); else { def = true; path = "${datadir}/enigma2/skin_default"; continue; } } else eDebug("[MAIN] found %d spinner!", i); break; } i++; } if (i) my_dc->setSpinner(eRect(ePoint(100, 100), wait[0]->size()), wait, i); else my_dc->setSpinner(eRect(100, 100, 0, 0), wait, 1); } gRC::getInstance()->setSpinnerDC(my_dc); #ifdef ENABLE_SIGC2 eRCInput::getInstance()->keyEvent.connect(sigc::ptr_fun(keyEvent)); #else eRCInput::getInstance()->keyEvent.connect(slot(keyEvent)); #endif #if defined(__sh__) // initialise the vfd class evfd * vfd = new evfd; vfd->init(); delete vfd; #endif printf("[MAIN] executing main\n"); bsodCatchSignals(); catchTermSignal(); setIoPrio(IOPRIO_CLASS_BE, 3); /* start at full size */ eVideoWidget::setFullsize(true); // python.execute("mytest", "__main__"); python.execFile(eEnv::resolve("${libdir}/enigma2/python/mytest.py").c_str()); /* restore both decoders to full size */ eVideoWidget::setFullsize(true); if (exit_code == 5) /* python crash */ { eDebug("[MAIN] (exit code 5)"); bsodFatal(0); } dsk.paint(); dsk_lcd.paint(); { gPainter p(my_lcd_dc); p.resetClip(eRect(ePoint(0, 0), my_lcd_dc->size())); p.clear(); p.flush(); } return exit_code; }
int main(int argc, char **argv) { #ifdef MEMLEAK_CHECK atexit(DumpUnfreed); #endif #ifdef OBJECT_DEBUG atexit(object_dump); #endif #ifdef HAVE_GSTREAMER gst_init(&argc, &argv); #endif // set pythonpath if unset setenv("PYTHONPATH", LIBDIR "/enigma2/python", 0); printf("PYTHONPATH: %s\n", getenv("PYTHONPATH")); bsodLogInit(); ePython python; eMain main; #if 1 #ifdef WITH_SDL ePtr<gSDLDC> my_dc; gSDLDC::getInstance(my_dc); #else ePtr<gFBDC> my_dc; gFBDC::getInstance(my_dc); int double_buffer = my_dc->haveDoubleBuffering(); #endif ePtr<gLCDDC> my_lcd_dc; gLCDDC::getInstance(my_lcd_dc); /* ok, this is currently hardcoded for arabic. */ /* some characters are wrong in the regular font, force them to use the replacement font */ for (int i = 0x60c; i <= 0x66d; ++i) eTextPara::forceReplacementGlyph(i); eTextPara::forceReplacementGlyph(0xfdf2); for (int i = 0xfe80; i < 0xff00; ++i) eTextPara::forceReplacementGlyph(i); eWidgetDesktop dsk(eSize(720, 576)); eWidgetDesktop dsk_lcd(eSize(132, 64)); dsk.setStyleID(0); dsk_lcd.setStyleID(1); /* if (double_buffer) { eDebug(" - double buffering found, enable buffered graphics mode."); dsk.setCompositionMode(eWidgetDesktop::cmBuffered); } */ wdsk = &dsk; lcddsk = &dsk_lcd; dsk.setDC(my_dc); dsk_lcd.setDC(my_lcd_dc); ePtr<gPixmap> m_pm; loadPNG(m_pm, DATADIR "/enigma2/skin_default/pal.png"); if (!m_pm) { eFatal("pal.png not found!"); } else dsk.setPalette(*m_pm); dsk.setBackgroundColor(gRGB(0,0,0,0xFF)); #endif /* redrawing is done in an idle-timer, so we have to set the context */ dsk.setRedrawTask(main); dsk_lcd.setRedrawTask(main); eDebug("Loading spinners..."); { int i; #define MAX_SPINNER 64 ePtr<gPixmap> wait[MAX_SPINNER]; for (i=0; i<MAX_SPINNER; ++i) { char filename[strlen(DATADIR) + 41]; sprintf(filename, DATADIR "/enigma2/skin_default/spinner/wait%d.png", i + 1); loadPNG(wait[i], filename); if (!wait[i]) { if (!i) eDebug("failed to load %s! (%m)", filename); else eDebug("found %d spinner!\n", i); break; } } if (i) my_dc->setSpinner(eRect(ePoint(100, 100), wait[0]->size()), wait, i); else my_dc->setSpinner(eRect(100, 100, 0, 0), wait, 1); } gRC::getInstance()->setSpinnerDC(my_dc); eRCInput::getInstance()->keyEvent.connect(slot(keyEvent)); #if defined(__sh__) evfd * vfd = new evfd; vfd->init(); delete vfd; #endif printf("executing main\n"); bsodCatchSignals(); setIoPrio(IOPRIO_CLASS_BE, 3); // python.execute("mytest", "__main__"); python.execFile("/usr/lib/enigma2/python/mytest.py"); if (exit_code == 5) /* python crash */ { eDebug("(exit code 5)"); bsodFatal(0); } dsk.paint(); dsk_lcd.paint(); { gPainter p(my_lcd_dc); p.resetClip(eRect(0, 0, 132, 64)); p.clear(); } return exit_code; }
int main(int argc, char **argv) { #ifdef MEMLEAK_CHECK atexit(DumpUnfreed); #endif #ifdef OBJECT_DEBUG atexit(object_dump); #endif gst_init(&argc, &argv); for (int i = 0; i < argc; i++) { if (!(strcmp(argv[i], "--debug-no-color")) or !(strcmp(argv[i], "--nc"))) { logOutputColors = 0; } } m_erroroutput = new eErrorOutput(); m_erroroutput->run(); // set pythonpath if unset setenv("PYTHONPATH", eEnv::resolve("${libdir}/enigma2/python").c_str(), 0); printf("PYTHONPATH: %s\n", getenv("PYTHONPATH")); printf("DVB_API_VERSION %d DVB_API_VERSION_MINOR %d\n", DVB_API_VERSION, DVB_API_VERSION_MINOR); bsodLogInit(); ePython python; eMain main; #if 1 ePtr<gMainDC> my_dc; gMainDC::getInstance(my_dc); //int double_buffer = my_dc->haveDoubleBuffering(); ePtr<gLCDDC> my_lcd_dc; gLCDDC::getInstance(my_lcd_dc); /* ok, this is currently hardcoded for arabic. */ /* some characters are wrong in the regular font, force them to use the replacement font */ for (int i = 0x60c; i <= 0x66d; ++i) eTextPara::forceReplacementGlyph(i); eTextPara::forceReplacementGlyph(0xfdf2); for (int i = 0xfe80; i < 0xff00; ++i) eTextPara::forceReplacementGlyph(i); eWidgetDesktop dsk(my_dc->size()); eWidgetDesktop dsk_lcd(my_lcd_dc->size()); dsk.setStyleID(0); dsk_lcd.setStyleID(my_lcd_dc->size().width() == 96 ? 2 : 1); /* if (double_buffer) { eDebug(" - double buffering found, enable buffered graphics mode."); dsk.setCompositionMode(eWidgetDesktop::cmBuffered); } */ wdsk = &dsk; lcddsk = &dsk_lcd; dsk.setDC(my_dc); dsk_lcd.setDC(my_lcd_dc); dsk.setBackgroundColor(gRGB(0,0,0,0xFF)); #endif /* redrawing is done in an idle-timer, so we have to set the context */ dsk.setRedrawTask(main); dsk_lcd.setRedrawTask(main); eDebug("Checking box..."); FILE *infile; char line[100]; char command[64]; if((infile = fopen("/proc/stb/info/boxtype", "r")) != NULL) { fgets(line, sizeof(line), infile); if(strcmp(line, "ini-5000sv\n") == 0) { eDebug("Miraclebox Premium Twin detected"); } else if(strcmp(line, "ini-1000sv\n") == 0) { eDebug("Miraclebox Premium Mini detected"); } else if(strcmp(line, "ini-2000sv\n") == 0) { eDebug("Miraclebox Premium Mini+ detected"); } else if(strcmp(line, "ini-8000sv\n") == 0) { eDebug("Miraclebox Premium Ultra detected"); } else if(strcmp(line, "7000S\n") == 0) { eDebug("Miraclebox Premium Micro detected"); } else if(strcmp(line, "7005S\n") == 0) { eDebug("Miraclebox Premium Micro v2 detected"); } else if(strcmp(line, "g300\n") == 0) { eDebug("Miraclebox Premium Twin+ detected"); } else { eDebug("Wrong HW, this image can be only run on Miraclbox Premium Series"); sprintf(command, "showiframe /usr/share/enigma2/box.mvi > /dev/null"); system(command); //sprintf(command, "flash_erase /dev/mtd/2 0 0"); //system(command); //sprintf(command, "flash_erase /dev/mtd/4 0 0"); //system(command); sprintf(command, "sleep 5;reboot -f"); } fclose(infile); } std::string active_skin = getConfigCurrentSpinner("config.skin.primary_skin"); eDebug("Loading spinners..."); { int i; #define MAX_SPINNER 64 ePtr<gPixmap> wait[MAX_SPINNER]; for (i=0; i<MAX_SPINNER; ++i) { char filename[64]; std::string rfilename; snprintf(filename, sizeof(filename), "${datadir}/enigma2/%s/wait%d.png", active_skin.c_str(), i + 1); rfilename = eEnv::resolve(filename); loadPNG(wait[i], rfilename.c_str()); if (!wait[i]) { if (!i) eDebug("failed to load %s! (%m)", rfilename.c_str()); else eDebug("found %d spinner!", i); break; } } if (i) my_dc->setSpinner(eRect(ePoint(100, 100), wait[0]->size()), wait, i); else my_dc->setSpinner(eRect(100, 100, 0, 0), wait, 1); } gRC::getInstance()->setSpinnerDC(my_dc); eRCInput::getInstance()->keyEvent.connect(slot(keyEvent)); printf("executing main\n"); bsodCatchSignals(); catchTermSignal(); setIoPrio(IOPRIO_CLASS_BE, 3); /* start at full size */ eVideoWidget::setFullsize(true); // python.execute("mytest", "__main__"); python.execFile(eEnv::resolve("${libdir}/enigma2/python/mytest.py").c_str()); /* restore both decoders to full size */ eVideoWidget::setFullsize(true); if (exit_code == 5) /* python crash */ { eDebug("(exit code 5)"); bsodFatal(0); } dsk.paint(); dsk_lcd.paint(); { gPainter p(my_lcd_dc); p.resetClip(eRect(ePoint(0, 0), my_lcd_dc->size())); p.clear(); p.flush(); } m_erroroutput = NULL; return exit_code; }