From 5ef04827b21ace6f955c36c2cad86d6226b39a24 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Sat, 28 Jan 2017 17:55:14 +0100 Subject: [PATCH 01/18] src/gui/lua/lua_curl.cpp set dumb cookie for dumb 403 forbidden Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/293d32c776c4cb6e5e2c9f0914512f0e878b0cf1 Author: Jacek Jendrzej Date: 2017-01-28 (Sat, 28 Jan 2017) --- src/gui/lua/lua_curl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/lua/lua_curl.cpp b/src/gui/lua/lua_curl.cpp index 9bcf47ef5..fe1217512 100644 --- a/src/gui/lua/lua_curl.cpp +++ b/src/gui/lua/lua_curl.cpp @@ -267,7 +267,7 @@ Example: curl_easy_setopt(curl_handle, CURLOPT_SSL_VERIFYPEER, 0L); /* enable all supported built-in compressions */ curl_easy_setopt(curl_handle, CURLOPT_ACCEPT_ENCODING, ""); - + curl_easy_setopt(curl_handle, CURLOPT_COOKIE, ""); if (!userAgent.empty()) curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, userAgent.c_str()); From 61da024d6b1fede9e95e3d859d2d9123e011fa90 Mon Sep 17 00:00:00 2001 From: Michael Liebmann Date: Sun, 29 Jan 2017 04:29:47 +0100 Subject: [PATCH 02/18] install.sh: Preserve symlinks at update Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/bcf478ba67d63ffafb9ff756b6a91a898625ec00 Author: Michael Liebmann Date: 2017-01-29 (Sun, 29 Jan 2017) --- data/scripts/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/scripts/install.sh b/data/scripts/install.sh index 1e3dcb8ec..26238fa8a 100755 --- a/data/scripts/install.sh +++ b/data/scripts/install.sh @@ -21,7 +21,7 @@ update_file() fi echo "update $FILE_IMAGE" rm -f $FILE_IMAGE - cp $FILE_NEW $FILE_IMAGE + cp -d $FILE_NEW $FILE_IMAGE fi } From 542ba9679abae8fc607e94c997b88c06b6829b23 Mon Sep 17 00:00:00 2001 From: Jacek Jendrzej Date: Sun, 29 Jan 2017 20:54:35 +0100 Subject: [PATCH 03/18] fix uninitialised values Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/f76dda36df1478b928b92e39584ff0dec13d410c Author: Jacek Jendrzej Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/components/cc_frm_window.cpp | 2 +- src/gui/components/cc_item.cpp | 1 + src/gui/movieinfo.cpp | 1 + src/gui/widget/menue.cpp | 2 ++ 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/gui/components/cc_frm_window.cpp b/src/gui/components/cc_frm_window.cpp index 7137f76ab..80455a5ad 100644 --- a/src/gui/components/cc_frm_window.cpp +++ b/src/gui/components/cc_frm_window.cpp @@ -157,7 +157,7 @@ void CComponentsWindow::initVarWindow( const int& x_pos, const int& y_pos, const ccw_col_head = COL_MENUHEAD_PLUS_0; ccw_col_head_text = COL_MENUHEAD_TEXT; ccw_col_footer = COL_MENUFOOT_PLUS_0; - + cc_parent = NULL; page_scroll_mode = PG_SCROLL_M_OFF; //permanent disabled here, only in body used! initCCWItems(); diff --git a/src/gui/components/cc_item.cpp b/src/gui/components/cc_item.cpp index d695cbdf1..4a6f49faf 100644 --- a/src/gui/components/cc_item.cpp +++ b/src/gui/components/cc_item.cpp @@ -50,6 +50,7 @@ CComponentsItem::CComponentsItem(CComponentsForm* parent) cc_item_selected = false; cc_page_number = 0; cc_has_focus = true; + cc_parent = NULL; initParent(parent); } diff --git a/src/gui/movieinfo.cpp b/src/gui/movieinfo.cpp index 954c93cde..f06e68c9b 100644 --- a/src/gui/movieinfo.cpp +++ b/src/gui/movieinfo.cpp @@ -497,6 +497,7 @@ void MI_MOVIE_INFO::clear(void) timePlay.tm_year = 100; timePlay.tm_mday = 0; timePlay.tm_mon = 1; + timePlay.tm_isdst = -1; file.Name = ""; file.Url = ""; diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index 4a990afb1..5bf5010c3 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -550,6 +550,7 @@ CMenuWidget::CMenuWidget() info_box = NULL; header = NULL; nextShortcut = 1; + x = y = 0; } CMenuWidget::CMenuWidget(const neutrino_locale_t Name, const std::string & Icon, const int mwidth, const mn_widget_id_t &w_index) @@ -624,6 +625,7 @@ void CMenuWidget::Init(const std::string &Icon, const int mwidth, const mn_widge nextShortcut = 1; saveScreen_width = 0; saveScreen_height = 0; + x = y = 0; } void CMenuWidget::move(int xoff, int yoff) From e32ff6b40a40241e1707bdea2a6c6a3ca1038164 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 04/18] hintbox: restore proper handling of up/down keys When no scrollbar is present, just pass through up/down keys instead of only canceling the hintbox. This restores the behaviour before commit 11b3307251. Prominent examle is the "channel not available" popup which prevented further channel switching until canceled. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/5f93b57d847900999c245636bef3d706ccbdd74b Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/hintbox.cpp | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/gui/widget/hintbox.cpp b/src/gui/widget/hintbox.cpp index 9be2aae6f..8e513756a 100644 --- a/src/gui/widget/hintbox.cpp +++ b/src/gui/widget/hintbox.cpp @@ -219,16 +219,13 @@ int CHintBox::exec() { res = messages_return::cancel_all; } - else if ((msg == CRCInput::RC_up) || (msg == CRCInput::RC_down)) + else if (enable_txt_scroll && (msg == CRCInput::RC_up || msg == CRCInput::RC_down)) { - if (enable_txt_scroll){ - if (msg == CRCInput::RC_up) - this->scroll_up(); - else - this->scroll_down(); - } + /* if ! enable_txt_scroll, fall through to last else branch instead */ + if (msg == CRCInput::RC_up) + this->scroll_up(); else - res = messages_return::cancel_all; + this->scroll_down(); } else if (CNeutrinoApp::getInstance()->listModeKey(msg)){ // do nothing //TODO: if passed rc messages are ignored rc messaages: has no effect here too!! From 145e85ba56087779f3ed9cfef181c5a441cd6769 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 05/18] opkg_manager: use system-update script if available opkg has several problems with complex system updates, especially when having to update itself and with the package ordering during update To avoid hard coding the workarounds into neutrino, just call a script named "system-update" (if available) instead of "opkg upgrade". This script can be tuned to the specific target and its problems. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/fd9387a43ce1e0912c24d8caf40fe3690f7ef71c Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index 7c38b5f99..a23d698e7 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -11,7 +11,7 @@ Adaptions: Copyright (C) 2013 martii gitorious.org/neutrino-mp/martiis-neutrino-mp - Copyright (C) 2015-2016 Stefan Seyfried + Copyright (C) 2015-2017 Stefan Seyfried License: GPL @@ -71,6 +71,11 @@ #define OPKG_BAD_PATTERN_LIST_FILE CONFIGDIR "/bad_package_pattern.list" #define OPKG_CONFIG_FILE "/etc/opkg/opkg.conf" +/* script to call instead of "opkg upgrade" + * opkg fails to gracefully self-upgrade, and additionally has some ordering issues + */ +#define SYSTEM_UPDATE "system-update" + using namespace std; enum @@ -89,7 +94,7 @@ enum OM_MAX }; -static const string pkg_types[OM_MAX] = +static string pkg_types[OM_MAX] = { OPKG_CL " list ", OPKG_CL " list-installed ", @@ -614,6 +619,11 @@ bool COPKGManager::hasOpkgSupport() return false; } + if (! find_executable(SYSTEM_UPDATE).empty()) { + dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d] " SYSTEM_UPDATE " script found\n", __func__, __LINE__); + pkg_types[OM_UPGRADE] = SYSTEM_UPDATE; + } + #if 0 /* If directory /var/lib/opkg resp. /opt/opkg does not exist, it is created by opkg itself */ From a56e85336d96151b9de74a56b47c1cb9049aae3b Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 06/18] opkg_manager: avoid the zombie apocalypse, use waitpid() Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/1454d09a750d5614b3263d2a114d2523ca362bf2 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index a23d698e7..b32df8d78 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -781,6 +781,8 @@ void COPKGManager::getPkgData(const int pkg_content_id) } } + waitpid(pid, NULL, 0); /* beware of the zombie apocalypse! */ + fclose(f); } From 43a9c2f71d521ed9cbf528b5b62d351021bd53d9 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 07/18] shellwindow: use time_monotonic_ms() Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/9d5fc68b832a098ef07cc340fbf1d0b99e777d66 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/shellwindow.cpp | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index 78fa6d23e..ddd850351 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -7,7 +7,7 @@ Implementation: Copyright (C) 2013 martii gitorious.org/neutrino-mp/martiis-neutrino-mp - Copyright (C) 2015 Stefan Seyfried + Copyright (C) 2015-2017 Stefan Seyfried License: GPL @@ -35,6 +35,7 @@ #include #include #include +#include #include #include #include @@ -103,22 +104,19 @@ void CShellWindow::exec() fds.events = POLLIN | POLLHUP | POLLERR; fcntl(fds.fd, F_SETFL, fcntl(fds.fd, F_GETFL, 0) | O_NONBLOCK); - struct timeval tv; - gettimeofday(&tv,NULL); - uint64_t lastPaint = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000); + time_t lastPaint = time_monotonic_ms(); bool ok = true, nlseen = false, dirty = false, incomplete = false; char output[1024]; std::string txt = ""; std::string line = ""; do { - uint64_t now; + time_t now; fds.revents = 0; int r = poll(&fds, 1, 300); if (r > 0) { if (!feof(f)) { - gettimeofday(&tv,NULL); - now = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000); + now = time_monotonic_ms(); unsigned int lines_read = 0; while (fgets(output, sizeof(output), f)) { @@ -178,7 +176,7 @@ void CShellWindow::exec() first = false; txt += *it; } - if (((lines_read == lines_max) && (lastPaint + 100000 < now)) || (lastPaint + 250000 < now)) { + if (((lines_read >= lines_max) && (lastPaint + 100 < now)) || (lastPaint + 250 < now)) { textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) if (mode & VERBOSE) textBox->paint(); @@ -192,9 +190,8 @@ void CShellWindow::exec() } else if (r < 0) ok = false; - gettimeofday(&tv,NULL); - now = (uint64_t) tv.tv_usec + (uint64_t)((uint64_t) tv.tv_sec * (uint64_t) 1000000); - if (!ok || (r < 1 && dirty && lastPaint + 250000 < now)) { + now = time_monotonic_ms(); + if (!ok || (r < 1 && dirty && lastPaint + 250 < now)) { textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) if (mode & VERBOSE) textBox->paint(); From d7d787a05cb267910af0ebbb91328026c3ff7ea3 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 08/18] helpers: add run_pty() function This runs an external command inside a pty. Running inside a pty, external commands using stdio(3) will disable stdout buffering when running from a terminal, which is often desirable. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/85bb568d021ababe5163860402cffe12ca0f5ff4 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/Makefile.am | 1 + src/system/helpers.cpp | 19 ++++++++++++++++++- src/system/helpers.h | 1 + 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/Makefile.am b/src/Makefile.am index 7d67e67cb..dcf9c8196 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -123,6 +123,7 @@ neutrino_LDADD = \ $(PUGIXML_LIBS) \ -ldvbsi++ \ -ljpeg \ + -lutil \ -lOpenThreads \ -lrt -lpthread diff --git a/src/system/helpers.cpp b/src/system/helpers.cpp index 00a8bacbb..50a93901c 100644 --- a/src/system/helpers.cpp +++ b/src/system/helpers.cpp @@ -4,7 +4,7 @@ License: GPL (C) 2012-2013 the neutrino-hd developers - (C) 2012-2015 Stefan Seyfried + (C) 2012-2017 Stefan Seyfried This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -30,6 +30,7 @@ #include #include #include +#include /* forkpty*/ #include #include #include @@ -220,6 +221,22 @@ FILE* my_popen( pid_t& pid, const char *cmdstring, const char *type) } return(fp); } + +int run_pty(pid_t &pid, const char *cmdstring) +{ + int master = -1; + if ((pid = forkpty(&master, NULL, NULL, NULL)) < 0) + return -1; + else if (pid == 0) { + int maxfd = getdtablesize(); + for(int i = 3; i < maxfd; i++) + close(i); + execl("/bin/sh", "sh", "-c", cmdstring, (char *)0); + exit(0); + } + return master; +} + #if 0 int mkdirhier(const char *pathname, mode_t mode) { diff --git a/src/system/helpers.h b/src/system/helpers.h index 7cd1fef20..dd23280a3 100644 --- a/src/system/helpers.h +++ b/src/system/helpers.h @@ -41,6 +41,7 @@ int my_system(const char * cmd); int my_system(int argc, const char *arg, ...); /* argc is number of arguments including command */ FILE* my_popen( pid_t& pid, const char *cmdstring, const char *type); +int run_pty(pid_t &pid, const char *cmdstring); int safe_mkdir(const char * path); inline int safe_mkdir(std::string path) { return safe_mkdir(path.c_str()); } From f17233f682a5afa0b3040b8985f9615721142fd0 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 09/18] textbox: fix output for BOTTOM mode If more text is added to a textbox than fits into the window, the last lines are stripped. In BOTTOM (and non-SCROLL) mode, it makes more sense to strip the first lines. This is used by shellwindow, e.g. in package management menu. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/b623aad5c3fe567f157f187786787e7a932c2ddd Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/textbox.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index cb8bbb1e0..e669687ae 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -679,11 +679,14 @@ void CTextBox::refreshText(void) if (m_nMode & TOP) // move to top of frame y += m_nFontTextHeight + ((m_cFrameTextRel.iHeight - m_nFontTextHeight * m_nLinesPerPage) >> 1); - else if (m_nMode & BOTTOM) + else if (m_nMode & BOTTOM) { + /* if BOTTOM && !SCROLL, show the last lines if more than one page worth of text is in cLineArray */ + if (!(m_nMode & SCROLL) && (m_nNrOfLines > m_nLinesPerPage)) + m_nCurrentLine = m_nNrOfLines - m_nLinesPerPage; // move to bottom of frame y += m_cFrameTextRel.iHeight - (lines > 1 ? (lines - 1)*m_nFontTextHeight : 0) - text_Vborder_width; //m_nFontTextHeight + text_Vborder_width /*- ((m_cFrameTextRel.iHeight + m_nFontTextHeight*/ * m_nLinesPerPage/*) >> 1)*/; - else + } else // fit into mid of frame space y += m_nFontTextHeight + ((m_cFrameTextRel.iHeight - m_nFontTextHeight * lines) >> 1); From 199bf36a2814a2cc1b5cd228670f5390dfa89646 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 10/18] shellwindow: use run_pty() instead of my_popen() Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/046de91ce6c3cdf6069abb8b30b50310560528a4 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/shellwindow.cpp | 37 +++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index ddd850351..f4a1509aa 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -64,6 +64,24 @@ void CShellWindow::setCommand(const std::string &Command, const int Mode, int* R exec(); } +static int read_line(int fd, struct pollfd *fds, char *b, size_t sz) +{ + int ret; + size_t i = 0; + while ((ret = read(fd, b + i, 1)) > 0) { + i++; + if (b[i - 1] == '\n') + break; + if (i >= sz) + break; + fds->revents = 0; + if (poll(fds, 1, 300) < 1) + break; + } + b[i] = 0; + return i; +} + void CShellWindow::exec() { std::string cmd; @@ -81,11 +99,11 @@ void CShellWindow::exec() else { pid_t pid = 0; cmd = command + " 2>&1"; - FILE *f = my_popen(pid, cmd.c_str(), "r"); - if (!f) { + int f = run_pty(pid, cmd.c_str()); + if (f < 0) { if (res) *res = -1; - dprintf(DEBUG_NORMAL, "[CShellWindow] [%s:%d] Error! my_popen errno: %d command: %s\n", __func__, __LINE__, errno, cmd.c_str()); + dprintf(DEBUG_NORMAL, "[CShellWindow] [%s:%d] Error! run_pty errno: %d command: %s\n", __func__, __LINE__, errno, cmd.c_str()); return; } @@ -100,7 +118,7 @@ void CShellWindow::exec() textBox->enableSaveScreen(false); } struct pollfd fds; - fds.fd = fileno(f); + fds.fd = f; fds.events = POLLIN | POLLHUP | POLLERR; fcntl(fds.fd, F_SETFL, fcntl(fds.fd, F_GETFL, 0) | O_NONBLOCK); @@ -115,11 +133,9 @@ void CShellWindow::exec() fds.revents = 0; int r = poll(&fds, 1, 300); if (r > 0) { - if (!feof(f)) { - now = time_monotonic_ms(); - + if (fds.revents & POLLIN) { unsigned int lines_read = 0; - while (fgets(output, sizeof(output), f)) { + while (read_line(f, &fds, output, sizeof(output)-1)) { char *outputp = output; dirty = true; @@ -131,7 +147,9 @@ void CShellWindow::exec() *outputp = 0; break; case '\r': +#if 0 outputp = output; +#endif break; case '\n': lines_read++; @@ -166,6 +184,7 @@ void CShellWindow::exec() else dprintf(DEBUG_NORMAL, "[CShellWindow] [%s:%d] res=NULL ok=%d\n", __func__, __LINE__, ok); + now = time_monotonic_ms(); if (lines.size() > lines_max) lines.pop_front(); txt = ""; @@ -205,7 +224,7 @@ void CShellWindow::exec() textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); } - fclose(f); + close(f); int s; errno = 0; int r = waitpid(pid, &s, 0); From 1956eb6bba2009fa741d92570d6a896fce7ba76f Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 11/18] shellwindow: ensure text is set correctly and only when necessary Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/d372892ef5c67b092fd38ae7ca1b6a0024c43815 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/shellwindow.cpp | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index f4a1509aa..d8b69068a 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -82,6 +82,16 @@ static int read_line(int fd, struct pollfd *fds, char *b, size_t sz) return i; } +static std::string lines2txt(list &lines) +{ + std::string txt = ""; + for (std::list::const_iterator it = lines.begin(), end = lines.end(); it != end; ++it) { + txt += *it; + txt += '\n'; + } + return txt; +} + void CShellWindow::exec() { std::string cmd; @@ -187,15 +197,8 @@ void CShellWindow::exec() now = time_monotonic_ms(); if (lines.size() > lines_max) lines.pop_front(); - txt = ""; - bool first = true; - for (std::list::const_iterator it = lines.begin(), end = lines.end(); it != end; ++it) { - if (!first) - txt += '\n'; - first = false; - txt += *it; - } if (((lines_read >= lines_max) && (lastPaint + 100 < now)) || (lastPaint + 250 < now)) { + txt = lines2txt(lines); textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) if (mode & VERBOSE) textBox->paint(); @@ -211,6 +214,7 @@ void CShellWindow::exec() now = time_monotonic_ms(); if (!ok || (r < 1 && dirty && lastPaint + 250 < now)) { + txt = lines2txt(lines); textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) if (mode & VERBOSE) textBox->paint(); @@ -220,6 +224,7 @@ void CShellWindow::exec() } while(ok); if (mode & VERBOSE) { + txt = lines2txt(lines); txt += "\n...ready"; textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); } From b1a0ea602469e4d2ce2462173a04833713dd87c7 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 12/18] shellwindow: reduce update interval Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/edab27be9205177ac1736e682fe5e8c4d6b8a080 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/widget/shellwindow.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/widget/shellwindow.cpp b/src/gui/widget/shellwindow.cpp index d8b69068a..931390243 100644 --- a/src/gui/widget/shellwindow.cpp +++ b/src/gui/widget/shellwindow.cpp @@ -197,7 +197,7 @@ void CShellWindow::exec() now = time_monotonic_ms(); if (lines.size() > lines_max) lines.pop_front(); - if (((lines_read >= lines_max) && (lastPaint + 100 < now)) || (lastPaint + 250 < now)) { + if (((lines_read >= lines_max) && (lastPaint + 100 < now)) || (lastPaint + 500 < now)) { txt = lines2txt(lines); textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) @@ -213,7 +213,7 @@ void CShellWindow::exec() ok = false; now = time_monotonic_ms(); - if (!ok || (r < 1 && dirty && lastPaint + 250 < now)) { + if (!ok || (r < 1 && dirty && lastPaint + 500 < now)) { txt = lines2txt(lines); textBox->setText(&txt, textBox->getWindowsPos().iWidth, false); if (!textBox->isPainted()) From bbc7db1692ac48834b5c427cde414b2ae6022562 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 13/18] opkg_manager: don't set error flag for shellwindow The shellwindow exits if the "ok" flag is set to false, aborting further execution of more commands. This hurts with system-update script. Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/bbd7667ee9c953fea08a35d04bef51a44d1cf3f0 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index b32df8d78..61b41312f 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -915,13 +915,13 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) //download error: if (line.find("opkg_download:") != string::npos){ *res = OM_DOWNLOAD_ERR; - *ok = false; + //*ok = false; return; } //not enough space if (line.find("No space left on device") != string::npos){ *res = OM_OUT_OF_SPACE_ERR; - *ok = false; + //*ok = false; return; } //deps @@ -934,7 +934,7 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) if (*ok){ dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d] ERROR: unhandled error %s\n", __func__, __LINE__, line.c_str()); *res = OM_UNKNOWN_ERR; - *ok = false; + //*ok = false; return; } From 4bb0c81b9c50459bd4093bcc7f828e3d3f4c07e0 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 14/18] opkg_manager: make console output more useful Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/3956f06d3a7138ad568ea84a4d56ade60c1d4dd1 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index 61b41312f..3d0b2f7fb 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -888,9 +888,12 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) if (pos2 != string::npos) has_err = true; + dprintf(DEBUG_NORMAL, "[COPKGManager:%d] %s\n", __LINE__, line.c_str()); //check for collected errors and set res value if (has_err){ + /* all lines printed already dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d] result: %s\n", __func__, __LINE__, line.c_str()); + */ /*duplicate option cache: option is defined in OPKG_CL_CONFIG_OPTIONS, * NOTE: if found first cache option in the opkg.conf file, this will be preferred and it's not really an error! @@ -932,7 +935,7 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) } //unknown error if (*ok){ - dprintf(DEBUG_NORMAL, "[COPKGManager] [%s - %d] ERROR: unhandled error %s\n", __func__, __LINE__, line.c_str()); + dprintf(DEBUG_DEBUG, "[COPKGManager] [%s - %d] ERROR: unhandled error %s\n", __func__, __LINE__, line.c_str()); *res = OM_UNKNOWN_ERR; //*ok = false; return; From 9e0daa2de8d86c09d32a6ef36ff8a2a061ce54aa Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 15/18] opkg_manager: add magic string to reset error flags ... to be used by sytem-update script Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/8a6194a0470b47d5ce8efccf56190df3cb50f177 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index 3d0b2f7fb..64b70f154 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -933,6 +933,13 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) *ok = false; return; } + /* hack */ + if (line.find("system-update: err_reset") != string::npos) { + *res = OM_SUCCESS; + *ok = true; + has_err = false; + return; + } //unknown error if (*ok){ dprintf(DEBUG_DEBUG, "[COPKGManager] [%s - %d] ERROR: unhandled error %s\n", __func__, __LINE__, line.c_str()); From 5f0ada1b64fed648ab41853c803cde3f7591d557 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 16/18] opkg_manager: make error messages less cryptic the errno has nothing to do with the error that happened, so do not use it for the error message Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/3fb3f39be7b1c1fcc1b744871abf83865e5c2b53 Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index 64b70f154..ba4012fa7 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -213,7 +213,10 @@ int COPKGManager::exec(CMenuTarget* parent, const string &actionKey) { string pkg_name = fileBrowser.getSelectedFile()->Name; if (!installPackage(pkg_name)) + showError(g_Locale->getText(LOCALE_OPKG_FAILURE_INSTALL), "", pkg_name); + /* errno is never set properly, the string is totally useless. showError(g_Locale->getText(LOCALE_OPKG_FAILURE_INSTALL), strerror(errno), pkg_name); + */ *local_dir = fileBrowser.getCurrentDir(); refreshMenu(); @@ -225,7 +228,10 @@ int COPKGManager::exec(CMenuTarget* parent, const string &actionKey) parent->hide(); int r = execCmd(actionKey, CShellWindow::VERBOSE | CShellWindow::ACKNOWLEDGE_EVENT); if (r) { + /* errno is never set properly, the string is totally useless. showError(g_Locale->getText(LOCALE_OPKG_FAILURE_UPGRADE), strerror(errno), actionKey); + */ + showError(g_Locale->getText(LOCALE_OPKG_FAILURE_UPGRADE), "", actionKey); } else installed = true; refreshMenu(); @@ -999,7 +1005,10 @@ bool COPKGManager::installPackage(const string& pkg_name, string options, bool f break; } default: + showError(g_Locale->getText(LOCALE_OPKG_FAILURE_INSTALL), "", pkg_types[OM_INSTALL] + opts + pkg_name); + /* errno / strerror considered useless here showError(g_Locale->getText(LOCALE_OPKG_FAILURE_INSTALL), strerror(errno), pkg_types[OM_INSTALL] + opts + pkg_name); + */ } }else{ if (force_configure) From cb60c1659dbc97817d38e52f3058b7631376b8d2 Mon Sep 17 00:00:00 2001 From: Stefan Seyfried Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 17/18] upkg_manager: comment out stale code Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/fd52cd5023c433b84da67aaf075c1a27c2e2b02b Author: Stefan Seyfried Date: 2017-01-29 (Sun, 29 Jan 2017) --- src/gui/opkg_manager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gui/opkg_manager.cpp b/src/gui/opkg_manager.cpp index ba4012fa7..9da03a18e 100644 --- a/src/gui/opkg_manager.cpp +++ b/src/gui/opkg_manager.cpp @@ -954,10 +954,13 @@ void COPKGManager::handleShellOutput(string* cur_line, int* res, bool* ok) return; } +#if 0 + /* never reached */ if (!has_err){ *ok = true; *res = OM_SUCCESS; } +#endif } *res = _res; From 511a31dffc854502a0e74854f3688eaa212524c0 Mon Sep 17 00:00:00 2001 From: GetAway Date: Sun, 29 Jan 2017 21:27:45 +0100 Subject: [PATCH 18/18] neutrino: fix umount of netfs-drives in ExitRun() function Origin commit data ------------------ Commit: https://github.com/neutrino-images/ni-neutrino/commit/17b8e684e002e0899b1ee906f0b585f0e8c9c536 Author: GetAway Date: 2017-01-29 (Sun, 29 Jan 2017) Origin message was: ------------------ - neutrino: fix umount of netfs-drives in ExitRun() function --- src/neutrino.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/neutrino.cpp b/src/neutrino.cpp index 19593cbdd..458e3b25e 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -3614,6 +3614,7 @@ void CNeutrinoApp::ExitRun(const bool /*write_si*/, int retcode) my_system("/etc/init.d/rcK"); sync(); + CFSMounter::umount(); // unreachable NFS server my_system(2,"/bin/umount", "-a"); sleep(1);