Kobo-UNCaGED icon indicating copy to clipboard operation
Kobo-UNCaGED copied to clipboard

Web UI and NickelMenu early feedback request

Open shermp opened this issue 4 years ago • 109 comments

Over the past week or so, I've been working on a UI overhaul of KU. Namely, I've ripped out all the fbink "UI", and replaced it with a new web based UI that is actually interactive.

I'm also ditching kfmon in favor of NickelMenu (sorry @NiLuJe , but I don't think this whole thing would work with kfmon).

And I'm ditching the whole "do stuff behind Nickel's back" approach. I think it adds a lot of complexity for little gain. Yes that means using the DB while Nickel is also using it, but it seems looking at sqlite docs, with the right connection settings, it should be pretty safe, although one might want to backup their DB before testing, just in case. FWIW, I haven't seen any DB corruption with the new code.

I think I'm about ready for some early feedback if anyone is willing to give it a go. NickelMenu is required to launch it. I'm currently using the following NickelMenu config:

menu_item :main :Kobo UNCaGED :cmd_spawn :/mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh
chain  :nickel_extras :web_browser
menu_item :main :Book Scan :nickel_misc :rescan_books_full
chain :nickel_misc :rescan_books_full

Although this could use some refinement. @geek1011 do you know if the rescan_books actions are synchronous or not? I'm not really sure. Sometimes tapping "Book Scan" once works, other times I need to tap it a second time. Also, the non-full variant doesn't appear to populate series?

Once the browser is launched, you will need to navigate to localhost:8181. I would recommend setting this to your home page, or add it as a favorite.

Please be aware, there is still plenty of jank. Lots of jank. First, the web UI is a retrofit. Second, I'm not experienced with writing web apps. Third, the Kobo browser is truly awful. Fourth, I suck at web design, which makes point three even worse.

Pinging @tmjwid as well, as this might solve your Wifi issues when it's release worthy. Mainly because I'm letting Nickel handle all the wifi stuff via the web browser.

My main areas of concern are it's still possible for KU to get "stuck", requiring killing the process(es). Also, there's currently nothing stopping multiple launches. Probably need to deal with that in the startup script, any ideas on that @NiLuJe ? Other than that, I want to try and reduce the jank. I won't say no to any help if there's any interest.

The new code is in the webui-nm branch. I'm afraid there's no fancy CI/CD setup with build artifacts 😭 On a sidenote, anyone interested in dockerizing koxtoolchain? I could use NickelTC I suppose, but KU doesn't need such an old toolchain...

EDIT: A couple of features of the new Web UI.

  • Change settings without needing to edit the config file.
  • Enter password via browser UI, if required instead if hardcoding them in the config file. Passwords are also now associated with their respective Calibre library UUID, instead of using a dumb list.

shermp avatar May 07 '20 12:05 shermp

On a sidenote, anyone interested in dockerizing koxtoolchain

I've been working on that on and off over the last week (the thing is, I rarely use the other TCs myself, so it's not a priority). For this specific scenario, you should be able to just use the existing Dockerfile, dump the sysroot stuff, and switch the ct-ng target. Something like this:

FROM debian:buster-slim AS base

USER root

RUN apt-get update -qqy && \
    DEBIAN_FRONTEND=noninteractive apt-get install -qqy \
        autoconf autoconf-archive automake bash bison build-essential \
        busybox-static bsdutils bzip2 coreutils curl diffutils file findutils \
        flex gawk git gperf grep gzip jq libtool make nano openssh-client perl \
        rsync sed unzip wget xz-utils zip && \
    rm -rf /var/lib/apt/lists

RUN mkdir -p /tc/x-tools

FROM base AS build

ENV HOME=/tc

# note: downloads to /tc/ctng-src
RUN git init /tc/ctng-src && \
    git -C /tc/ctng-src remote add origin https://github.com/NiLuJe/crosstool-ng.git && \
    git -C /tc/ctng-src fetch origin && \
    git -C /tc/ctng-src checkout --recurse-submodules 23ba174c7ebdefc09dc610286c92619c610e4d27 && \
    git -C /tc/ctng-src submodule update --init --recursive

# note: builds to /tc/ctng-out
RUN cd /tc/ctng-src && \
    ./bootstrap && \
    ./configure --prefix="/tc/ctng-out" && \
    make -j12 && \
    make install && \
    rm -rf /tc/ctng-src

# note: downloads to /tc/tc-cache, mount as a Docker volume for offline builds
#       later (files will only be downloaded if needed)
RUN mkdir /tc/tc-src /tc/tc-cache && \
    /tc/ctng-out/bin/ct-ng -C /tc/tc-src arm-kobo-linux-gnueabihf && \
    echo 'CT_SAVE_TARBALLS=y' >> /tc/tc-src/.config && \
    echo 'CT_LOCAL_TARBALLS_DIR="/tc/tc-cache"' >> /tc/tc-src/.config && \
    echo 'CT_EXPERIMENTAL=y' >> /tc/tc-src/.config && \
    echo 'CT_ALLOW_BUILD_AS_ROOT=y' >> /tc/tc-src/.config && \
    echo 'CT_ALLOW_BUILD_AS_ROOT_SURE=y' >> /tc/tc-src/.config && \
    echo 'CT_LOG_PROGRESS_BAR=n' >> /tc/tc-src/.config && \
    /tc/ctng-out/bin/ct-ng -C /tc/tc-src oldconfig && \
    /tc/ctng-out/bin/ct-ng -C /tc/tc-src updatetools && \
    /tc/ctng-out/bin/ct-ng -C /tc/tc-src build CT_ONLY_DOWNLOAD=y

# note: builds to /tc/x-tools/arm-kobo-linux-gnueabihf, should be relocatable
RUN /tc/ctng-out/bin/ct-ng -C /tc/tc-src build CT_FORBID_DOWNLOAD=y && \
    rm -rf /tc/tc-src

FROM base AS toolchain

COPY --from=build /tc/x-tools/arm-kobo-linux-gnueabihf/ /tc/arm-kobo-linux-gnueabihf/
ENV PATH="/tc/arm-kobo-linux-gnueabihf/bin:${PATH}"

CMD ["/bin/bash"]

pgaskin avatar May 07 '20 13:05 pgaskin

do you know if the rescan_books actions are synchronous or not? I'm not really sure. Sometimes tapping "Book Scan" once works, other times I need to tap it a second time. Also, the non-full variant doesn't appear to populate series?

Mostly; that may be due to the UI updating (see if it works after opening and closing a book instead of doing another scan); and yes, that's correct.

pgaskin avatar May 07 '20 13:05 pgaskin

Please be aware, there is still plenty of jank. Lots of jank. First, the web UI is a retrofit. Second, I'm not experienced with writing web apps. Third, the Kobo browser is truly awful. Fourth, I suck at web design, which makes point three even worse.

I'll take a look. I'm mainly a backend or systems person, but I sometimes do frontend web stuff if needed.

Edit: It's not too bad, but some of the JS is slightly more dated than it needs to be, some of the code needs to be formatted, and it really needs some more CSS. Do you want me to make it look similar to Nickel, or like something else entirely (I'll work on it sometime in the next week and a half)?

pgaskin avatar May 07 '20 13:05 pgaskin

Oh, and I suggest you ship a NM config with KU (put it in .adds/nm/ku or something like that).

pgaskin avatar May 07 '20 14:05 pgaskin

Concurrent writes should be much less annoying since the switch to WAL.

As long as you yourself are not doing threading, even a simple single-threaded build of SQLite will do just fine.

(In fact, the threading modes & open flags make no differences as far as cross-process concurrency is involved, that's handled via Posix advisory locks, no matter what).

NiLuJe avatar May 07 '20 16:05 NiLuJe

As far as avoiding duplicate processes, you can check if a process by that name already exists via (p)kill -0, c.f., https://github.com/NiLuJe/kfmon/blob/a17f3060513748d8d9903afe979a118347bc9427/scripts/on-animator.sh#L5

(And kill(2) for why this works).

EDIT: Since this is a shell script, and we don't have exec -a to alter process names, you'll probably want to go w/ pkill -f ;).

Or, since we're on Linux, you can also check if /proc/<PID> exists, assuming you know the PID (or tried to get it via pidof/pgrep, and confirmed that you got an int out of it).

Or you can even create a pidfile if you want to go the extra mile ;). (IIRC, the stock busybox build might even support the start-stop-daemon applet).

NiLuJe avatar May 07 '20 16:05 NiLuJe

Thanks for the feedback guys!

Edit: It's not too bad, but some of the JS is slightly more dated than it needs to be, some of the code needs to be formatted, and it really needs some more CSS. Do you want me to make it look similar to Nickel, or like something else entirely (I'll work on it sometime in the next week and a half)?

Yeah, I know it needs more CSS. The default form element styling in particular is horrible (especially the checkboxes!). It's difficult to figure out what exactly is supported, as old qtwebkit isn't exactly a common target, so it's difficult to consult compatibility matrices. I tend to err on the side of stuff that works on early safari, or maybe early chrome.

Also, the CSS for the password modal doesn't really work 😞 It looks fine when it opens, but as soon as one taps the password entry field to enter the password, all the text disappears. Maybe I need to add some JS to refresh the content on activating the input field?

Oh, and I suggest you ship a NM config with KU (put it in .adds/nm/ku or something like that).

I'm planning on it! Just need to nail down the exact config I'm going to use.

...

My main issue with killing KU is identifying the processes. There's three of them. The shell process which QProcess spawns. The startup script, then the KU binary. eg:

1336 root       0:00 /bin/sh -c /mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh
1337 root       0:00 {nm-start-ku.sh} /bin/sh /mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh
1341 root       0:00 /mnt/onboard/.adds/kobo-uncaged/bin/kobo-uncaged

shermp avatar May 07 '20 20:05 shermp

My main issue with killing KU is identifying the processes. There's three of them. The shell process which QProcess spawns. The startup script, then the KU binary. eg:

1336 root       0:00 /bin/sh -c /mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh
1337 root       0:00 {nm-start-ku.sh} /bin/sh /mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh
1341 root       0:00 /mnt/onboard/.adds/kobo-uncaged/bin/kobo-uncaged

If the only issue is preventing concurrent startups, discriminating between those is not really necessary, right?

If any of 'em are up, it's a trip to an early abort, and that's it.

If you did need to actually SIGTERM one of 'em, I'd try with the earliest one. pgrep has fancy filtering options, including by PPID. The QProcess one will be reparented to init, so pgrep -f nm-start-ku.sh -P 1 ought to do the trick ;).

NiLuJe avatar May 07 '20 20:05 NiLuJe

Also, I imagine using exec in the cmd_spawn would get rid of one of those ;).

NiLuJe avatar May 08 '20 17:05 NiLuJe

You can also anchor the pkill -f to the start of the command with ^, as it's a regexp.

pgaskin avatar May 08 '20 18:05 pgaskin

Another thought, any ideas where I should save the cached passwords? Currently just saving them to the KU directory for now, but I would like to make it at leas a little harder for "little johnny" to find.

I was thinking of saving them somewhere on rootfs, but where? Traditionally, one would use the home directory but kobo... /etc perhaps?

Probably not going to bother protecting it further with encoding/encryption. The password is saved in plaintext on calibres end anyway.

shermp avatar May 08 '20 22:05 shermp

Arrrgh, I hate JavaScript sometimes.

Trying to generate a clickable list of instances (if there are multiple Calibre instances running on the network). I can generate and show the list fine. Problem is in firefox the onclick event never fires 😞

function getInstances() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', instancePath);
        xhr.onload = function() {
            if (xhr.status === 200) {
                instList = JSON.parse(xhr.responseText);
                for (var i = 0; i < instList.length; i++) {
                    var instNode = document.createElement('div');
                    instNode.dataset.instanceId = i;
                    var pAddr = document.createElement('p');
                    var pDesc = document.createElement('p');
                    pAddr.innerHTML = instList[i].Addr;
                    pDesc.innerHTML = instList[i].Description;
                    instNode.append(pAddr, pDesc);
                    instNode.id = 'cal_instance_' + i;
                    instNode.onclick = function() {setInstance(instNode.id);};
                    instanceContainer.append(instNode);
                }
                instanceModal.style.display = "block";
            }
            else {
                console.log('Request failed.  Returned status of ' + xhr.status);
            }
        };
        xhr.send();
    }
    function setInstance(id) {
        var el = document.getElementById(id)
        var xhr = new XMLHttpRequest();
        xhr.open('POST', instancePath);
        var instance = instList[el.dataset.instanceId];
        xhr.onload = function() {
            if (xhr.status === 205) {
                instanceModal.style.display = "none";
            } else {
                console.log('Unexpected status code. Expected 205, got ' + xhr.status);
            }
        }
        xhr.send(JSON.stringify(instance));
    }

Any ideas?

shermp avatar May 09 '20 03:05 shermp

First, you don't need to set the ID. You can just pass the node itself. Second, you should be using addEventListener instead of onclick.

Overall, I actually suggest you use Vue + a es6 promise polyfill + a fetch polyfill instead of all this JavaScript, as it will make this kind of UI trivial to implement.

pgaskin avatar May 14 '20 03:05 pgaskin

I guess at the end of the day, My aim was/is to minimize any external dependencies. Also, trying to do as little as possible in JS, because crappy qtwebkit. But I'm open to the idea of other alternatives.

shermp avatar May 14 '20 04:05 shermp

I've been looking at Vue.js (and similar frameworks) and ugh, I was really hoping to avoid stuff like npm (or yarn), transpilers and the like.

No matter what I end up doing frontend wise though, I'm definitely thinking of doing most of the rendering client-side and making the Go side of things simpler. The Go code can then just serve JSON, rather than rendering HTML/JS templates.

Maybe I can boil down the API to something like:

/ # render the main application. Single Page App perhaps?
/config # to get and set the configuration using GET/POST
/exit # To exit the application at the config screen
/disconnect # to disconnect from Calibre
/messages # Subscribe to Server Sent Events
/auth # get and set Calibre auth info

shermp avatar May 20 '20 07:05 shermp

Hey sorry I've been MIA, I'll have a play with this new build when I get the chance. I'm guessing I'll need to build the toolchain and compile for this version yeah? I'll spin up a VM just in case.

tmjwid avatar May 26 '20 10:05 tmjwid

Hey sorry I've been MIA, I'll have a play with this new build when I get the chance. I'm guessing I'll need to build the toolchain and compile for this version yeah? I'll spin up a VM just in case.

Don't be in too much of a hurry. I'm currently in the middle of a major refactor of this particular functionality. There was a reason I haven't yet made it a PR :)

shermp avatar May 26 '20 10:05 shermp

And don't worry about setting up a toolchain. I'll attach a build to this thread when I have one ready.

shermp avatar May 26 '20 11:05 shermp

Right, WebUI, take two. Out goes the horrible mess of templates and page redirection. In comes the single page app (SPA).

I decided against using a UI framework like VueJS, because a) I didn't feel like learning another new framework, and b) I like the fact that one can jump in and tinker with the code (on device even!) without needing to install any javascript dev tools like node/npn/yarn etc.

There still needs to be more work done. Styling is still shite (the default Kobo styles are truly horrid). Now that config is done graphically, I'm thinking of ditching the toml config file, and just saving settings a JSON. Also, need to work on proper NickelMenu integration.

And speaking of NickelMenu, I managed to break Nickel when I went to rescan. For some reason, the database was still locked when Nickel tried to use it. Needless to say, Nickel was Not Happy. I had to reboot using telnet, because the power button was unresponsive.

So yeah, I need to REALLY make sure the database is not locked before doing a library scan.

New code lives in the webui-refactor branch.

shermp avatar May 27 '20 09:05 shermp

IIRC, the only way the database will be (write) locked on a WAL db is if someone (i.e., Nickel) is actively writing to it (possibly just committing, actually?).

IIRC, there's also no 100% proof way to check if the DB is locked, because it might get locked between the check and the action you wanted to make sure wouldn't happen on a locked DB.

(The sane approach is to have every db action sanely handle a locked db (i.e., via sqlite3_busy_*), which, err, might be tricky here ^^).

NiLuJe avatar May 27 '20 15:05 NiLuJe

https://sqlite.org/rescode.html#busy mentions using BEGIN IMMEDIATE to at least avoid getting a write lock in the middle of a transaction, which sounds neat/useful ;).

NiLuJe avatar May 27 '20 15:05 NiLuJe

Forcing WAL checkpointing (https://www.sqlite.org/c3ref/wal_checkpoint_v2.html) might also help?

NiLuJe avatar May 27 '20 18:05 NiLuJe

Note, I'm using go-sqlite3 to access the database, and accessing it through Go's SQL interface, so I don't have direct control over the DB connection.

My main issue I think is the very rudimentary NM config I'm using doesn't do any checks. Probably the safest thing to do is to check all the KU processes has ended before triggering the book scan.

If @geek1011 ever manages to get series parsing for epubs working, I may end up skipping database writes altogether.

It does highlight what I think MIGHT be a NM weakness though. If a blocking process like rescan_books_full freezes, it might be possible for the Kobo to get into an unusable state. Note, I could not trigger a reboot by pressing the power button for over 30s. Thankfully, I had telnet access at the time...

I don't know if there's a way to mitigate this risk. Perhaps "don't play with Nickel's DB" might be the only option.

shermp avatar May 27 '20 22:05 shermp

sickel should be murdering a hung or busy-looping Nickel, AFAIK? (I don't recall the exact details of how the sickel -> nickel ping works :s).

What did things look like over telnet at the time?

NiLuJe avatar May 27 '20 23:05 NiLuJe

Apart from Nickel using around 60-80% CPU usage (via top) and the DB errors in the syslog, it was otherwise normal.

Initially, I didn't think anything was wrong, but when the "Importing Content" screen never appeared, I started to get a bit worried. It was then I noticed the UI was completely frozen.

shermp avatar May 27 '20 23:05 shermp

Re: sickel

Possibly a dbus ping?

In any case, if I SIGSTOP nickel, sickel will reboot after ~1 minute:

01:13:45.975967 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=980000000}, {NULL, 8}) = 1 (in [6], left {tv_sec=4, tv_nsec=996720260})
01:13:50.961220 [2c15756c] recvmsg(6<socket:[1831]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\0\1\0\0\0\0\31\3\0\0}\0\0\0\1\1o\0\1\0\0\0/\0\0\0\0\0\0\0\6\1s\0\30\0\0\0com.kobo.watchdog.Sickel\0\0\0\0\0\0\0\0\2\1s\0\30\0\0\0com.kobo.watchdog.Sickel\0\0\0\0\0\0\0\0\3\1s\0\4\0\0\0Ping\0\0\0\0"..., iov_len=2048}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 144
01:13:50.985238 [2c15756c] recvmsg(6<socket:[1831]>, {msg_namelen=0}, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
01:13:50.986004 [2c3aaebc] write(3<anon_inode:[eventfd]>, "\1\0\0\0\0\0\0\0", 8) = 8
01:13:50.986402 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=31833426}) = 0
01:13:50.986718 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=32143926}) = 0
01:13:50.987047 [2c1576cc] sendmsg(6<socket:[1831]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\2\1\1\0\0\0\0\372\2\0\0\30\0\0\0\6\1s\0\4\0\0\0:1.0\0\0\0\0\5\1u\0\31\3\0\0", iov_len=40}, {iov_base="", iov_len=0}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 40
01:13:50.988767 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=34228926}) = 0
01:13:50.988987 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=34394926}) = 0
01:13:50.989125 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=34524926}) = 0
01:13:50.989247 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=966000000}, {NULL, 8}) = 1 (in [3], left {tv_sec=9, tv_nsec=965986375})
01:13:50.989862 [2c3aae2c] read(3<anon_inode:[eventfd]>, "\1\0\0\0\0\0\0\0", 8) = 8
01:13:50.990069 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=35478676}) = 0
01:13:50.990221 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=35624051}) = 0
01:13:50.990348 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=35743051}) = 0
01:13:50.990469 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3446, tv_nsec=35861801}) = 0
01:13:50.990597 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=965000000}, {NULL, 8}) = 0 (Timeout)
01:14:00.966806 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3456, tv_nsec=12660049}) = 0
01:14:00.967939 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3456, tv_nsec=13635896}) = 0
01:14:00.968709 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3456, tv_nsec=14331839}) = 0
01:14:00.969383 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3456, tv_nsec=15003530}) = 0
01:14:00.970037 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=987000000}, {NULL, 8}) = 0 (Timeout)
01:14:10.970130 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3466, tv_nsec=15977184}) = 0
01:14:10.971253 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3466, tv_nsec=16938867}) = 0
01:14:10.972006 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3466, tv_nsec=17632818}) = 0
01:14:10.972691 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3466, tv_nsec=18319769}) = 0
01:14:10.973347 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=984000000}, {NULL, 8}) = 0 (Timeout)
01:14:20.972931 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3476, tv_nsec=18772896}) = 0
01:14:20.974054 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3476, tv_nsec=19749701}) = 0
01:14:20.977097 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3476, tv_nsec=22909174}) = 0
01:14:20.978023 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3476, tv_nsec=24788058}) = 0
01:14:20.979895 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=981000000}, {NULL, 8}) = 0 (Timeout)
01:14:30.978288 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3486, tv_nsec=24150431}) = 0
01:14:30.979425 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3486, tv_nsec=25115459}) = 0
01:14:30.980184 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3486, tv_nsec=25811979}) = 0
01:14:30.980865 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3486, tv_nsec=26499125}) = 0
01:14:30.981539 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=975000000}, {NULL, 8}) = 0 (Timeout)
01:14:40.969587 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3496, tv_nsec=15438765}) = 0
01:14:40.970721 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3496, tv_nsec=16401139}) = 0
01:14:40.971494 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3496, tv_nsec=17120764}) = 0
01:14:40.972189 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3496, tv_nsec=17816138}) = 0
01:14:40.972855 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=984000000}, {NULL, 8}) = 0 (Timeout)
01:14:50.963426 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3506, tv_nsec=9265370}) = 0
01:14:50.964533 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3506, tv_nsec=12455270}) = 0
01:14:50.968532 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3506, tv_nsec=17051751}) = 0
01:14:50.972262 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3506, tv_nsec=18024739}) = 0
01:14:50.979396 [2c3b2f44] pselect6(7, [3<anon_inode:[eventfd]> 6<socket:[1831]>], [], [], {tv_sec=9, tv_nsec=988000000}, {NULL, 8}) = 0 (Timeout)
01:15:00.980738 [2c3c831c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=3516, tv_nsec=26600410}) = 0
01:15:00.984481 [2c37544c] gettimeofday({tv_sec=1590621300, tv_usec=987055}, NULL) = 0
01:15:00.989173 [2c3531dc] open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 7</etc/zoneinfo/Europe/Paris>
01:15:00.991482 [2c3aa29c] fstat64(7</etc/zoneinfo/Europe/Paris>, {st_dev=makedev(0xb3, 0x1), st_ino=33452, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=6, st_size=2945, st_atime=1590595171 /* 2020-05-27T17:59:31+0200 */, st_atime_nsec=0, st_mtime=1288665484 /* 2010-11-02T03:38:04+0100 */, st_mtime_nsec=0, st_ctime=1420991891 /* 2015-01-11T16:58:11+0100 */, st_ctime_nsec=0}) = 0
01:15:00.994378 [2c3aa29c] fstat64(7</etc/zoneinfo/Europe/Paris>, {st_dev=makedev(0xb3, 0x1), st_ino=33452, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=6, st_size=2945, st_atime=1590595171 /* 2020-05-27T17:59:31+0200 */, st_atime_nsec=0, st_mtime=1288665484 /* 2010-11-02T03:38:04+0100 */, st_mtime_nsec=0, st_ctime=1420991891 /* 2015-01-11T16:58:11+0100 */, st_ctime_nsec=0}) = 0
01:15:00.999343 [2c3b6598] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aad3000
01:15:01.000330 [2c352cd8] read(7</etc/zoneinfo/Europe/Paris>, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\f\0\0\0\f\0\0\0\0\0\0\0\267\0\0\0\f\0\0\0\33\221`P\213\233Gx\360\233\327,p\234\274\221p\235\300H\360\236\211\376p\237\240*\360\240`\245\360\241\200\f\360\242.\22\360\243zL\360\2445\201\360\245^#p\246%5\360\247'\233\360\250X&p\251\7}\360\251\3564p\252\347_\360\253\327P\360\254\307A\360"..., 1024) = 1024
01:15:01.004034 [2c352cd8] read(7</etc/zoneinfo/Europe/Paris>, "\21\0\0\16\20\0\rPMT\0WEST\0WET\0CET\0CEST\0WEMT\0\0\1\1\0\0\1\1\0\0\0\1\1\0\0\0\0\0\0\0\0\0\0\1\1TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\r\0\0\0\r\0\0\0\0\0\0\0\270\0\0\0\r\0\0\0\37\377\377\377\377k\310J\213\377\377\377\377\221`P\213\377\377\377\377\233Gx\360\377\377"..., 1024) = 1024
01:15:01.008933 [2c3b9fd4] _llseek(7</etc/zoneinfo/Europe/Paris>, 869, [2917], SEEK_CUR) = 0
01:15:01.011348 [2c352cd8] read(7</etc/zoneinfo/Europe/Paris>, "\nCET-1CEST,M3.5.0,M10.5.0/3\n", 1024) = 28
01:15:01.012597 [2c351acc] close(7</etc/zoneinfo/Europe/Paris>) = 0
01:15:01.013418 [2c3b662c] munmap(0x2aad3000, 4096) = 0
01:15:01.016852 [2c3baf2c] socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 7<socket:[9204]>
01:15:01.020543 [2c3baa4c] connect(7<socket:[9204]>, {sa_family=AF_UNIX, sun_path="/dev/log"}, 110) = 0
01:15:01.029627 [2c3bad3c] send(7<socket:[9204]>, "<15>May 28 01:15:00 sickel: void SickelService::reboot() rebooting ", 67, MSG_NOSIGNAL) = 67
01:15:01.037090 [2c3b31b0] reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART

NiLuJe avatar May 27 '20 23:05 NiLuJe

I'll see if I can trigger it again, or if it was just a fluke.

shermp avatar May 27 '20 23:05 shermp

Also, random comment about something that came up at the beginning of this thread: I imagine the koreader images could effectively serve as a "dockerized" variant of every koxtoolchain TC (except nickel & kobomk7, which KOReader doesn't use).

I don't do docker so I have no clue how this stuff works, but looking at the KOReader CI build matrix should make this clear ;).

NiLuJe avatar May 27 '20 23:05 NiLuJe

Yep. You can basically have one Dockerfile which uses build arguments to determine which toolchain to create an image for. Alternatively, one could have a Dockerfile for each toolchain version. But I think one would probably make more sense.

Once you have an image, it can then be pushed to Docker Hub. It also looks like you can get Docker Hub to automatically build images for you on each commit.

I guess one could use the example Dockerfile @geek1011 posted upthread as a starter. Alternatively, one could have a Dockerfile which clones the koxtoolchain repo, and runs gen-tc.sh.

EDIT: One is fond of using the term 'one'...

shermp avatar May 28 '20 00:05 shermp

I have one suspicion (a guess, I haven't checked any part of it yet) as to the cause of the power button freeze. I'll check this myself later, but sickel may not be active while Nickel is in USBMS mode. Also, USBMS mode may have implications related to the power button.

pgaskin avatar May 28 '20 00:05 pgaskin

Note that Docker Hub is too slow for building toolchains (see my comments in the kobo-plugin-experiments for more on the other available options).

pgaskin avatar May 28 '20 00:05 pgaskin

I have one suspicion (a guess, I haven't checked any part of it yet) as to the cause of the power button freeze. I'll check this myself later, but sickel may not be active while Nickel is in USBMS mode. Also, USBMS mode may have implications related to the power button.

Note, this new version of KU no longer enters USBMS mode. I'm trying to see if I can use it safely without USBMS, because that adds its own hurdles (dealing with wifi, and filesystem mounts)

shermp avatar May 28 '20 00:05 shermp

Note that Docker Hub is too slow for building toolchains (see my comments in the kobo-plugin-experiments for more on the other available options).

I wondered about that. Good to know!

shermp avatar May 28 '20 00:05 shermp

The KOReader images are definitely taking the "one image per TC" approach ^^.

c.f., https://hub.docker.com/u/koreader

NiLuJe avatar May 28 '20 00:05 NiLuJe

First, I've identified the fact that I'm simply showing the "all done" message too early. It's being shown before the database is closed. 99 times out of a 100, it probably won't be an issue, but if there are any cover resize stragglers...

That's an issue I'm going to fix for sure!

I've also been thinking about switching to a less elegant, but probably safer solution. Make KU only perform read only access on the DB (and open the DB in ro mode), and save out writes to a SQL file, that can then be executed in a separate NickelMenu action using the sqlite CLI tool. That way I can hopefully do the DB update in a blocking fashion, which hopefully avoids any issues with Nickel.

shermp avatar May 28 '20 00:05 shermp

The KOReader images are definitely taking the "one image per TC" approach ^^.

c.f., https://hub.docker.com/u/koreader

Yeah, but each image can (and probably is?) generated from one Dockerfile, using build arguments/environment variables to control which variant is built.

shermp avatar May 28 '20 01:05 shermp

IIRC, Kobo doesn't ship the SQLite CLI tool.

(It certainly didn't use to, as I deemed it safe to ship a symlink to mine in the Python packages. [As for why SQLite ships w/ Python and not the core shell tools, the short answer is: ICU ^^]).

NiLuJe avatar May 28 '20 01:05 NiLuJe

IIRC, Kobo doesn't ship the SQLite CLI tool.

(It certainly didn't use to, as I deemed it safe to ship a symlink to mine in the Python packages. [As for why SQLite ships w/ Python and not the core shell tools, the short answer is: ICU ^^]).

I was planning on shipping my own, assuming it's small enough, and can be statically linked.

shermp avatar May 28 '20 01:05 shermp

Short of the (optional) ICU dependency, it can be built without readline (IIRC), and there's no longer any third-party deps at that point ;).

(Short of a build dep: tcl which might be needed for modular builds).

NiLuJe avatar May 28 '20 03:05 NiLuJe

Yeah, looking at the docs, a minimal build looks to be as simple as

gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl

shermp avatar May 28 '20 03:05 shermp

Ok, KU now delays its "Done" user messages to the very last possible moment, and crucially, after the database is closed. Also added a basic NickelMenu config.

I need to add more safety to the startup script (by killing any previous KU instances). And only allow the rescan_books_full to occur if no KU process is running.

The only thing I'm worried about now is the possibility of a Nickel DB write during KU operation. I hope being in browser helps here, but who knows?

shermp avatar May 28 '20 07:05 shermp

You'll get thrown a SQLITE_BUSY if Nickel is actively writing somewhere for some reason, so, providing both sides have a sane busy handler, it should behave ;).

EDIT: And it's apparently handled via Open query parameters in go-sqlite3 (for the stock busy_timeout handler).

EDIT²: Which you're already using ;p. There's also the _txlock parameter for the IMMEDIATE stuff from earlier ;).

NiLuJe avatar May 28 '20 15:05 NiLuJe

You'll get thrown a SQLITE_BUSY if Nickel is actively writing somewhere for some reason, so, providing both sides have a sane busy handler, it should behave ;).

We ARE talking about Nickel you know ^ ^

shermp avatar May 28 '20 19:05 shermp

Sidebar about SQLITE_BUSY: I find the human-readable variant from sqlite3_errstr/sqlite3_errmsg so incredibly confusing when compared to SQLITE_LOCKED, when the two actually mean very different things, that I kind of jumped the gun and went for the internal API in KFMon to get at the constant name instead: https://github.com/NiLuJe/kfmon/blob/1958fba1bec3ecf203742e242f66d4850ffca0d1/kfmon.c#L2785 -> https://github.com/sqlite/sqlite/blob/d63c76fb31a0e262fb12a93b171e95a4e30c1a2e/src/main.c#L1447-L1451

(That said, there's approximately 0% chance we'll ever hit SQLITE_LOCKED unless we've seriously screwed the pooch ^^. (Single thread, synchronous, single db connection. Which is also why a no-mutex, no shared cache, single-threaded SQLite build/connection works just fine).)

NiLuJe avatar May 28 '20 20:05 NiLuJe

The more I think about it, the more I want to use the sqlite cli method of updating the DB. I'm kind of uncomfortable leaving a rw connection open for an arbitrarily length of time, especially if the user can navigate away from the browser at any time, and access any of the library views, or start a sync, or...

With CLI approach, KU can can open the DB read-only, get a current list of books, then close the DB, and never connect to it again. I can then run the DB update in a UI blocking manner, which should hopefully minimize any potential whoopsies.

Looking around, it's difficult to find resources on how to create a safe SQL query, but it seems for sqlite, escaping ' in strings should be enough for my purposes. Everyone shouts about using prepared statements/parameters, but that won't work for the CLI.

shermp avatar May 28 '20 22:05 shermp

Awww, the rescan_books_full really doesn't appear to be blocking :( Testing with the following config:

menu_item :main :KU - Import Books :dbg_toast :Starting replacement SQL
chain :cmd_output :5000:/mnt/onboard/.adds/kobo-uncaged/scripts/sql-replacements.sh
chain  :dbg_toast :Starting Lib Scan 1
chain  :nickel_misc :rescan_books_full
chain  :dbg_toast :Starting Update SQL
chain  :cmd_output     :5000:/mnt/onboard/.adds/kobo-uncaged/scripts/sql-updates.sh
chain  :dbg_toast :Starting Lib Scan 2
chain  :nickel_misc :rescan_books_full

I get the Starting Update SQL and :Starting Lib Scan 2 toasts appearing while the first 'Importing Content' screen is still showing.

@geek1011 do you have any ideas on how I might be able to deal with this in NM?

shermp avatar May 29 '20 22:05 shermp

Crappy workaround ideas ahead:

Hmmm, something something SQL (inside a blocking shell script)?

Along the lines of periodically checking if a specific TRIGGER has fired based on whatever the full_scan is supposed to do with the new data?

Or waiting for the database not to be held in a write lock for more than n seconds?

(... or parsing the syslog output :D. I feel dirty.)

NiLuJe avatar May 29 '20 23:05 NiLuJe

(... or parsing the syslog output :D. I feel dirty.)

Don't worry. I've had that particular thought as well. Doesn't make it any less dirty though...

shermp avatar May 29 '20 23:05 shermp

I'm wondering the sync/scan process emits some sort of signal that one could wait for using QEventLoop?

shermp avatar May 29 '20 23:05 shermp

I'm wondering the sync/scan process emits some sort of signal that one could wait for using QEventLoop?

Well, we are already inside of it, so I can't exactly block it. I could add a hidden option to run the remaining options in another thread, but I'd rather not if there's a better way.

pgaskin avatar May 29 '20 23:05 pgaskin

If I looked at the code, I can see why the rescan isn't blocking :p It looks like you basically do the old plug & unplug trick, although a little more... elegantly.

I take it there's no way to wait after PlugWorkflowManager_unplugged(wf);? The actual content import must happen on another thread surely?

shermp avatar May 29 '20 23:05 shermp

So, looking at the logs, the last thing that appears to happen when doing the content import is May 30 12:22:24 nickel: ( 463.949 @ 0x17d9ab0 / sync.debug) virtual void CheckDatabaseCommand::execute()

Is there anything we can do with this, aside from looking for it in the logs?

shermp avatar May 30 '20 00:05 shermp

The issue isn't so much detecting it, but that we are running inside the event loop, so we can't really block.

pgaskin avatar May 30 '20 00:05 pgaskin

Fair enough. Thanks for the input. Trying to check database side might be the way to go, if I/we can come up with a robust enough solution.

shermp avatar May 30 '20 00:05 shermp

You could also make something like NM, but for UNCaGED specifically. The downside would be cross-version compatibility.

pgaskin avatar May 30 '20 00:05 pgaskin

That also means that you can't actually block in a cmd_spawn/cmd_output action that isn't backgrounded (and if it is backgrounded, it means it can't be followed by a chain), right?

I haven't checked, but I'm guessing if you were to try a simple cmd_spawn: sleep 120, sickel would murder nickel after about a minute, right?

EDIT: Oh, yeah, duh, cmd_spawn is already backgrounded by nature ;).

NiLuJe avatar May 30 '20 00:05 NiLuJe

It depends on how the sickel pings are implemented. I haven't checked it myself yet.

Also, I think you mean cmd_output:120000:sleep 120 instead.

pgaskin avatar May 30 '20 00:05 pgaskin

It looks like Nickel adds a record to the Activity table when content is added, so that's probably easily detectable. It's when no content is added that appears to be the difficult one to detect.

Unless CheckDatabaseCommand performs a PRAGMA that's detectable?

shermp avatar May 30 '20 00:05 shermp

Also, I think you mean cmd_output:120000:sleep 120 instead.

Nah... NM will complain if you try that! 10s timeout limit.

shermp avatar May 30 '20 00:05 shermp

IIRC, the issue with the Activity table is that it isn't "live": it's updated in batch according to arcane rules that no-one actually groks, I think?

NiLuJe avatar May 30 '20 00:05 NiLuJe

IIRC, the issue with the Activity table is that it isn't "live": it's updated in batch according to arcane rules that no-one actually groks, I think?

The couple of times I've tried it this morning, the debug log shows that it does the following after inserting content/shortcover rows:

"INSERT OR REPLACE INTO Activity (Action, Data, Date, Enabled, Id, Type) VALUES (1, '', '2020-05-30T12:21:46', 'true', NULL, 'Library')"

shermp avatar May 30 '20 00:05 shermp

I'll admit that it's been a good long while (as in, years) since I checked, but I remember abandoning that avenue quickly when I looked into it as a means to detect opening a "book" for KFMon because that specific event (there's one, IIRC) didn't make it to the table until "later" ;).

NiLuJe avatar May 30 '20 00:05 NiLuJe

It would probably be a better idea to make another mod based on NM to emit custom events when functions are called.

pgaskin avatar May 30 '20 01:05 pgaskin

Yay, my first baby steps into hooking functions/methods worked! And my H2O didn't blow up!

Attempting to hook CheckDatabaseCommand::execute() didn't work. It must not have a concrete implementation in libnickel? Hooking CheckDatabaseCommand::checkDB() does work however, and just as I thought, it seems to get executed at the end of a content import.

Not that I really know what I'm doing. Was heavily inspired by @geek1011 's series experiments...

shermp avatar Jun 06 '20 00:06 shermp

Side-note: yes, Sickel does appear to murder Nickel if it freezes...

(I err.. managed to introduce a deadlock using FIFO's... oops?)

shermp avatar Jun 06 '20 02:06 shermp

@shermp, I think there are more accurate ways of detecting when syncs are finished. IIRC, for the import ones, you should be able to hook the PlugManager functions, and check after they return.

Also, as a general note about hooking, it's safe to return a void* if you don't know what or if the original function returns.

pgaskin avatar Jun 06 '20 15:06 pgaskin

Having no idea of the call/flow order, PlugWorkflowManager::onDoneProcessing() and/or PlugWorkflowManager::doneProcessing() looks promising... One must experiment :)

It's surprising how much info one can glean just by looking at a list of strings...

shermp avatar Jun 06 '20 23:06 shermp

Yes, that's right. Note that one of those just does the Qt metacall to the other (IIRC, doneProcessing is the real one).

It's surprising how much info one can glean just by looking at a list of strings...

Now, imagine if you looked at the assembly itself... it's really not that hard after a bit of practice (the ARM and Qt references are quite useful).

pgaskin avatar Jun 07 '20 00:06 pgaskin

And yep, PlugWorkflowManager::doneProcessing() works. Now to decide what to do with it.

While currently using NickelMenu to experiment, a better solution would probably be to separate it into it's own shared library, although I'd probably wait for when/if you decide to create a standalone hook framework.

shermp avatar Jun 07 '20 01:06 shermp

While currently using NickelMenu to experiment, a better solution would probably be to separate it into it's own shared library, although I'd probably wait for when/if you decide to create a standalone hook framework.

I've decided against doing it for now for multiple reasons. The way I'd suggest doing it for now is to symlink the parts of NM you need from a git submodule.

pgaskin avatar Jun 07 '20 01:06 pgaskin

I've decided against doing it for now for multiple reasons. The way I'd suggest doing it for now is to symlink the parts of NM you need from a git submodule.

Good to know. Thanks for the heads up.

Currently thinking about the IPC side of this. I don't think named pipes will work, due to it's blocking nature. Sockets are probably overkill. Maybe a normal file in /tmp might do the job.

shermp avatar Jun 07 '20 02:06 shermp

Who's doing the reading, and who's doing the writing?

If I get what you're trying to do, the frankenstein'ed NM is responsible for notifying about an event, so, it'd be the writer. Which makes KU the reader, and, there, polling/blocking is exactly what you want, right?

(PIPE_BUF is 4K on Linux, so you're unlikely to ever block on the writer).

So a FIFO would work just fine, right (it preserves order, but not message boundaries)?

(There are a few quirks involved in the "one listener, one FIFO, many writers" workflow, c.f., the comments & links in FBInk).

NiLuJe avatar Jun 07 '20 16:06 NiLuJe

My original attempt was to try and block rescan_books_full until the content import finished. Obviously that didn't work.

Note, a named pipe blocks on OPENING until both writer AND reader have opened the pipe.

shermp avatar Jun 07 '20 20:06 shermp

@shermp: Hence the trickery with having the listener set it up first, opening it nonblock & rw ;).

(See the stack overflow link in the FBInk comment for the full details of the madness involved ^^).

NiLuJe avatar Jun 07 '20 20:06 NiLuJe

At long last, I'm coming back to this after my (not so little) NickelDBus diversion.

The webui-refactor branch now has initial NickelDBus integration. The NickelMenu configuration is a bit broken though, I may need some advice on that.

With the following NM config:

# This is the config file to launch Kobo UNCaGED using NickelMenu
menu_item :main :Kobo UNCaGED :cmd_output :1000:quiet: /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -f "4.13.12638"
    chain_success : skip       : 2
        chain_failure : dbg_error : Firmware 4.13.12638 or newer is required.
        chain_always  : skip      : -1
    chain_success : cmd_output :1000:quiet: /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -n
    chain_success : skip       : 4
        chain_failure : dbg_toast   : Installing NickelDBus...
        chain_success : cmd_output  :1000:quiet: cp /mnt/onboard/.adds/kobo-uncaged/NickelDBus/KoboRoot.tgz /mnt/onboard/.kobo/KoboRoot.tgz
        chain_success : nickel_misc : rescan_books_full
        chain_always  : skip        : -1
    chain_success : dbg_toast   : Starting Kobo UNCaGED
    chain_success : cmd_spawn   : exec /mnt/onboard/.adds/kobo-uncaged/nm-start-ku.sh

It takes the chain_failure : dbg_toast : Installing NickelDBus... branch, despite the fact the return code of /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -n is 0, Not quite sure what I've done wrong.

Also broken is replacing existing books, it's something I need to look into.

shermp avatar Sep 10 '20 08:09 shermp

Also broken is replacing existing books, it's something I need to look into.

Fixed. I don't think I was opening book files correctly. More specifically, I think the way I was opening book files wasn't truncating existing files.

Switching to the higher level os.Create(path) function solves the issue.

shermp avatar Sep 10 '20 08:09 shermp

@shermp: Does the script actually return 0? Does NM actually get the right return code?

@pgaskin: That made me double-check NM's doc re: chain: it reads like a chain can only chain a menu_item, while it can actually cascade into another chain, as the toggle examples show. I'm not sure how gnarly that can get to put into words, so, just throwing it out there ;p.

NiLuJe avatar Sep 10 '20 12:09 NiLuJe

@shermp:

https://github.com/shermp/Kobo-UNCaGED/blob/466f8ba92b54abd72df9c5565191c23eac62fecb/scripts/ku-lib.sh#L80

oldifs -> $oldifs?

NiLuJe avatar Sep 10 '20 12:09 NiLuJe

That one's harmless, but, eh, while I'm here ;p

https://github.com/shermp/Kobo-UNCaGED/blob/466f8ba92b54abd72df9c5565191c23eac62fecb/scripts/ku-lib.sh#L102

which -> command -v

NiLuJe avatar Sep 10 '20 12:09 NiLuJe

That made me double-check NM's doc re: chain: it reads like a chain can only chain a menu_item, while it can actually cascade into another chain, as the toggle examples show. I'm not sure how gnarly that can get to put into words, so, just throwing it out there ;p.

I was thinking of implementation details when writing that (a chain is implemented as a nm_menu_action_t, but with the on_success/on_failure flags set)...

https://github.com/pgaskin/NickelMenu/blob/c2d26181b9d87b2d8b8d24ec32cb19ff851366df/src/nickelmenu.cc#L409-L426

https://github.com/pgaskin/NickelMenu/blob/c2d26181b9d87b2d8b8d24ec32cb19ff851366df/src/nickelmenu.cc#L458-L466

pgaskin avatar Sep 10 '20 12:09 pgaskin

@shermp: Does the script actually return 0? Does NM actually get the right return code?

Yeah, the script does return 0:

[root@(none) scripts]# /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -n
[root@(none) scripts]# echo $?
0

And when I deliberately make it fail:

[root@(none) scripts]# /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -n
NickelDBus not found or unable to get version
[root@(none) scripts]# echo $?
1

shermp avatar Sep 10 '20 20:09 shermp

Huh.

A quick check with placeholder scripts behaves properly over here:

Sep 10 22:51:10 nickel: (NickelMenu) item 'Kobo UNCaGED' pressed... (src/nickelmenu.cc:323)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: /mnt/onboard/.foo/zero.sh :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=1 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=0 msg='(null)', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b25 with argument 2 :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...not updating success flag (value=1) for skip result (src/nickelmenu.cc:432)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=3 msg='(null)', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping next 2 actions (src/nickelmenu.cc:466)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9ae5 with argument Firmware 4.13.12638 or newer is required. :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=0 on_failure=1 skip=2 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=2) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b25 with argument -1 :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=1 skip=1 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=1) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: /mnt/onboard/.foo/zero.sh :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=0 msg='(null)', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b25 with argument 4 :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...not updating success flag (value=1) for skip result (src/nickelmenu.cc:432)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=3 msg='(null)', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping next 4 actions (src/nickelmenu.cc:466)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b15 with argument Installing NickelDBus... :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=0 on_failure=1 skip=4 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=4) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: fbink -Mm "Installing NickelDBus" :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=3 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=3) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327cf049 with argument rescan_books_full :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=2 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=2) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b25 with argument -1 :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=1 skip=1 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=1) (src/nickelmenu.cc:419)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327c9b15 with argument Starting Kobo UNCaGED :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=2 msg='Starting Kobo UNCaGED', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) action 0x327cf965 with argument fbink -Mm "Starting Kobo UNCaGED" :  (src/nickelmenu.cc:415)
Sep 10 22:51:10 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:51:10 nickel: (NickelMenu) ...result: type=2 msg='Successfully started process with PID 2585.', handling... (src/nickelmenu.cc:441)
Sep 10 22:51:10 nickel: (NickelMenu) done (src/nickelmenu.cc:325)
# This is the config file to launch Kobo UNCaGED using NickelMenu
menu_item :main :Kobo UNCaGED :cmd_output :1000:quiet: /mnt/onboard/.foo/zero.sh
    chain_success : skip       : 2
        chain_failure : dbg_error : Firmware 4.13.12638 or newer is required.
        chain_always  : skip      : -1
    chain_success : cmd_output :1000:quiet: /mnt/onboard/.foo/zero.sh
    chain_success : skip       : 4
        chain_failure : dbg_toast   : Installing NickelDBus...
        chain_success : cmd_output  :1000:quiet: fbink -Mm "Installing NickelDBus"
        chain_success : nickel_misc : rescan_books_full
        chain_always  : skip        : -1
    chain_success : dbg_toast   : Starting Kobo UNCaGED
    chain_success : cmd_spawn   : fbink -Mm "Starting Kobo UNCaGED"
#!/bin/sh
exit 0

NiLuJe avatar Sep 10 '20 20:09 NiLuJe

And conversely:

Sep 10 22:53:06 nickel: (NickelMenu) item 'Kobo UNCaGED' pressed... (src/nickelmenu.cc:323)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: /mnt/onboard/.foo/one.sh :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=1 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...error: 'could not run process: process exited with status 1 (src/action_cc.cc:848)' (src/nickelmenu.cc:434)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b25 with argument 2 :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to condition flags (src/nickelmenu.cc:424)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9ae5 with argument Firmware 4.13.12638 or newer is required. :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=0 on_failure=1 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...error: 'Firmware 4.13.12638 or newer is required. (src/action_c.c:13)' (src/nickelmenu.cc:434)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b25 with argument -1 :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=1 skip=0 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...not updating success flag (value=0) for skip result (src/nickelmenu.cc:432)
Sep 10 22:53:06 nickel: (NickelMenu) ...result: type=3 msg='(null)', handling... (src/nickelmenu.cc:441)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping remaining actions (src/nickelmenu.cc:464)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: /mnt/onboard/.foo/zero.sh :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b25 with argument 4 :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b15 with argument Installing NickelDBus... :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=0 on_failure=1 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327cfcb9 with argument 1000:quiet: fbink -Mm "Installing NickelDBus" :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327cf049 with argument rescan_books_full :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b25 with argument -1 :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=1 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327c9b15 with argument Starting Kobo UNCaGED :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) action 0x327cf965 with argument fbink -Mm "Starting Kobo UNCaGED" :  (src/nickelmenu.cc:415)
Sep 10 22:53:06 nickel: (NickelMenu) ...success=0 ; on_success=1 on_failure=0 skip=-1 (src/nickelmenu.cc:416)
Sep 10 22:53:06 nickel: (NickelMenu) ...skipping action due to skip flag (remaining=-1) (src/nickelmenu.cc:419)
Sep 10 22:53:06 nickel: (NickelMenu) done (src/nickelmenu.cc:325)
# This is the config file to launch Kobo UNCaGED using NickelMenu
menu_item :main :Kobo UNCaGED :cmd_output :1000:quiet: /mnt/onboard/.foo/one.sh
    chain_success : skip       : 2
        chain_failure : dbg_error : Firmware 4.13.12638 or newer is required.
        chain_always  : skip      : -1
    chain_success : cmd_output :1000:quiet: /mnt/onboard/.foo/zero.sh
    chain_success : skip       : 4
        chain_failure : dbg_toast   : Installing NickelDBus...
        chain_success : cmd_output  :1000:quiet: fbink -Mm "Installing NickelDBus"
        chain_success : nickel_misc : rescan_books_full
        chain_always  : skip        : -1
    chain_success : dbg_toast   : Starting Kobo UNCaGED
    chain_success : cmd_spawn   : fbink -Mm "Starting Kobo UNCaGED"
#!/bin/sh
exit 1

NiLuJe avatar Sep 10 '20 20:09 NiLuJe

Ok, this appears to be the culprit:

Sep 10 21:02:41 nickel: (NickelMenu) action 0x338643e9 with argument 1000:quiet: /mnt/onboard/.adds/kobo-uncaged/scripts/ku-prereq-check.sh -n :  (src/nickelmenu.cc:418)
Sep 10 21:02:41 nickel: (NickelMenu) ...success=1 ; on_success=1 on_failure=0 skip=0 (src/nickelmenu.cc:419)
Sep 10 21:02:42 nickel: ( 87272.719 @ 0x9db9f0) QProcess: Destroyed while process ("/bin/sh") is still running.
Sep 10 21:02:42 nickel: (NickelMenu) ...error: 'could not run process: timed out (src/action_cc.cc:840)' (src/nickelmenu.cc:437)

The question is why? The script doesn't take anything like 1 second to execute when I run it from the shell (or by using /bin/sh -c. And the previous firmware test succeeded, which uses the same wrapper script.

shermp avatar Sep 10 '20 21:09 shermp

My guess would be qndb is hanging when launched from NM, for some reason?

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

I'd try with a larger timeout and attach strace to it as a first look see ;)

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

Hmm. could be. It's about the only thing I can think of. I'll run a quick test to see.

shermp avatar Sep 10 '20 21:09 shermp

Yeah, definitely something screwy with qndb and QProcess()

Using the following NM config: menu_item :main :QNDB Test :cmd_output :5000: qndb -m mwcToast 5000 "Test message"

The behavior is rather strange. It blocks for 5 seconds, then fails with a could not run process: timed out message. But then the toast shows!

Interestingly, if I spawn qndb as another process (by adding & to the end of the command), it works perfectly.

shermp avatar Sep 10 '20 21:09 shermp

The poll is screwy, for... reasons.

4276  23:26:04.343572 [2ab8f5d0] execve("/usr/bin/qndb", ["qndb", "-m", "ndbVersion"], ["USER=root", "UBOOT_MMC=/etc/u-boot/mx50-ntx/u"..., "prevlevel=N", "SHLVL=7", "LD_LIBRARY_PATH=/usr/local/Kobo", "HOME=/", "runlevel=S", "NICKEL_HOME=/mnt/onboard/.kobo", "DBUS_SESSION_BUS_ADDRESS=unix:pa"..., "UBOOT_RECOVERY=/etc/u-boot/mx50-"..., "boot_port=2", "TERM=vt102", "waveform_p=0x8f989800", "hwcfg_p=0x8ffffe00", "PATH=/sbin:/bin:/usr/sbin:/usr/b"..., "PLATFORM=mx50-ntx", "WIFI_MODULE=dhd", "RUNLEVEL=mx50_1GHz", "LANG=en_US.UTF-8", "waveform_sz=6776288", "hwcfg_sz=110", "SHELL=/bin/sh", "PRODUCT=dahlia", "INTERFACE=eth0", "PWD=/", "LIBC_FATAL_STDERR_=1"]) = 0
4276  23:26:04.346329 [2aac2e8c] brk(NULL) = 0x2f000
4276  23:26:04.346557 [2aac477c] uname({sysname="Linux", nodename="kobo", release="2.6.35.3-850-gbc67621+", version="#3032 PREEMPT Mon Jan 9 13:37:40 CST 2017", machine="armv7l", domainname="(none)"}) = 0
4276  23:26:04.347404 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aacb000
4276  23:26:04.347708 [2aac45bc] access("/etc/ld.so.preload", R_OK) = 0
4276  23:26:04.347938 [2aac44bc] open("/etc/ld.so.preload", O_RDONLY|O_CLOEXEC) = 3</etc/ld.so.preload>
4276  23:26:04.348508 [2aac4420] fstat64(3</etc/ld.so.preload>, {st_dev=makedev(0xb3, 0x1), st_ino=34533, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=2, st_size=22, st_atime=1599504514 /* 2020-09-07T20:48:34+0200 */, st_atime_nsec=0, st_mtime=1579030988 /* 2020-01-14T20:43:08+0100 */, st_mtime_nsec=0, st_ctime=1598357494 /* 2020-08-25T14:11:34+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.349034 [2aac46b8] mmap2(NULL, 22, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3</etc/ld.so.preload>, 0) = 0x2aacc000
4276  23:26:04.349200 [2aac465c] close(3</etc/ld.so.preload>) = 0
4276  23:26:04.349428 [2aac44bc] open("/lib/libarmmem-v7l.so", O_RDONLY|O_CLOEXEC) = 3</lib/libarmmem-v7l.so>
4276  23:26:04.349664 [2aac44fc] read(3</lib/libarmmem-v7l.so>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\20\5\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.349900 [2aac4420] fstat64(3</lib/libarmmem-v7l.so>, {st_dev=makedev(0xb3, 0x1), st_ino=510, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=30, st_size=15076, st_atime=1599504514 /* 2020-09-07T20:48:34+0200 */, st_atime_nsec=0, st_mtime=1579030947 /* 2020-01-14T20:42:27+0100 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.350327 [2aac46b8] mmap2(NULL, 79308, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libarmmem-v7l.so>, 0) = 0x2aadc000
4276  23:26:04.350486 [2aac473c] mprotect(0x2aae0000, 61440, PROT_NONE) = 0
4276  23:26:04.350626 [2aac46b8] mmap2(0x2aaef000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libarmmem-v7l.so>, 0x3000) = 0x2aaef000
4276  23:26:04.350851 [2aac465c] close(3</lib/libarmmem-v7l.so>) = 0
4276  23:26:04.351016 [2aac46fc] munmap(0x2aacc000, 22) = 0
4276  23:26:04.351184 [2aac44bc] open("/usr/local/Kobo/tls/v7l/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.351652 [2aac43d0] stat64("/usr/local/Kobo/tls/v7l/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.351874 [2aac44bc] open("/usr/local/Kobo/tls/v7l/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.352091 [2aac43d0] stat64("/usr/local/Kobo/tls/v7l/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.352271 [2aac44bc] open("/usr/local/Kobo/tls/v7l/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.352469 [2aac43d0] stat64("/usr/local/Kobo/tls/v7l/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.352649 [2aac44bc] open("/usr/local/Kobo/tls/v7l/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.352834 [2aac43d0] stat64("/usr/local/Kobo/tls/v7l", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.352996 [2aac44bc] open("/usr/local/Kobo/tls/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.353230 [2aac43d0] stat64("/usr/local/Kobo/tls/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.353402 [2aac44bc] open("/usr/local/Kobo/tls/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.353597 [2aac43d0] stat64("/usr/local/Kobo/tls/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.353762 [2aac44bc] open("/usr/local/Kobo/tls/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.353944 [2aac43d0] stat64("/usr/local/Kobo/tls/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.354104 [2aac44bc] open("/usr/local/Kobo/tls/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.354281 [2aac43d0] stat64("/usr/local/Kobo/tls", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.354431 [2aac44bc] open("/usr/local/Kobo/v7l/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.354626 [2aac43d0] stat64("/usr/local/Kobo/v7l/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.354795 [2aac44bc] open("/usr/local/Kobo/v7l/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.354982 [2aac43d0] stat64("/usr/local/Kobo/v7l/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.355147 [2aac44bc] open("/usr/local/Kobo/v7l/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.355329 [2aac43d0] stat64("/usr/local/Kobo/v7l/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.355484 [2aac44bc] open("/usr/local/Kobo/v7l/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.355660 [2aac43d0] stat64("/usr/local/Kobo/v7l", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.355809 [2aac44bc] open("/usr/local/Kobo/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.356001 [2aac43d0] stat64("/usr/local/Kobo/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.356164 [2aac44bc] open("/usr/local/Kobo/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.356346 [2aac43d0] stat64("/usr/local/Kobo/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.356502 [2aac44bc] open("/usr/local/Kobo/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.356678 [2aac43d0] stat64("/usr/local/Kobo/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.356828 [2aac44bc] open("/usr/local/Kobo/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.357006 [2aac43d0] stat64("/usr/local/Kobo", {st_dev=makedev(0xb3, 0x1), st_ino=527, st_mode=S_IFDIR|0755, st_nlink=12, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=6, st_size=3072, st_atime=1597771533 /* 2020-08-18T19:25:33+0200 */, st_atime_nsec=0, st_mtime=1598357835 /* 2020-08-25T14:17:15+0200 */, st_mtime_nsec=0, st_ctime=1598357835 /* 2020-08-25T14:17:15+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.357409 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.357642 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.357843 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.358059 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.358250 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.358603 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.358813 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/v7l/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.359024 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/v7l", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.359209 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.359427 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.359617 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.359833 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.360021 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.360227 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.360407 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/tls/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.360604 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/tls", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.360776 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/v7l/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.360998 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/v7l/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.361192 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/v7l/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.361401 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/v7l/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.361585 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/v7l/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.361790 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/v7l/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.361969 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/v7l/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.362165 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/v7l", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.362336 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/neon/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.362547 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/neon/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.362732 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/neon/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.362934 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/neon", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.363110 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/vfp/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.363305 [2aac43d0] stat64("/usr/local/Qt-5.2.1-arm/lib/vfp", 0x7ed012f8) = -1 ENOENT (No such file or directory)
4276  23:26:04.363476 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libQt5Core.so.5", O_RDONLY|O_CLOEXEC) = 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>
4276  23:26:04.363743 [2aac44fc] read(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \211\5\0004\0\0\0"..., 512) = 512
4276  23:26:04.363970 [2aac4420] fstat64(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>, {st_dev=makedev(0xb3, 0x1), st_ino=389, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=7566, st_size=3873576, st_atime=1597771534 /* 2020-08-18T19:25:34+0200 */, st_atime_nsec=0, st_mtime=1597771534 /* 2020-08-18T19:25:34+0200 */, st_mtime_nsec=0, st_ctime=1598357501 /* 2020-08-25T14:11:41+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.364422 [2aac46b8] mmap2(NULL, 3941868, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>, 0) = 0x2aaf0000
4276  23:26:04.364598 [2aac473c] mprotect(0x2ae9c000, 65536, PROT_NONE) = 0
4276  23:26:04.364721 [2aac46b8] mmap2(0x2aeac000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>, 0x3ac000) = 0x2aeac000
4276  23:26:04.364967 [2aac46b8] mmap2(0x2aeb2000, 1516, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2aeb2000
4276  23:26:04.365158 [2aac465c] close(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtCore.so.4.6.2>) = 0
4276  23:26:04.365352 [2aac44bc] open("/usr/local/Kobo/libQt5DBus.so.5", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.365583 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libQt5DBus.so.5", O_RDONLY|O_CLOEXEC) = 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>
4276  23:26:04.365853 [2aac44fc] read(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\240\346\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.366073 [2aac4420] fstat64(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>, {st_dev=makedev(0xb3, 0x1), st_ino=376, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=772, st_size=394688, st_atime=1597771534 /* 2020-08-18T19:25:34+0200 */, st_atime_nsec=0, st_mtime=1597771534 /* 2020-08-18T19:25:34+0200 */, st_mtime_nsec=0, st_ctime=1598357499 /* 2020-08-25T14:11:39+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.366498 [2aac46b8] mmap2(NULL, 459772, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>, 0) = 0x2aeb3000
4276  23:26:04.366664 [2aac473c] mprotect(0x2af12000, 65536, PROT_NONE) = 0
4276  23:26:04.366788 [2aac46b8] mmap2(0x2af22000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>, 0x5f000) = 0x2af22000
4276  23:26:04.367055 [2aac465c] close(3</usr/local/Trolltech/QtEmbedded-4.6.2-arm/lib/libQtDBus.so.4.6.2>) = 0
4276  23:26:04.367249 [2aac44bc] open("/usr/local/Kobo/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.367480 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.367701 [2aac44bc] open("/usr/local/Kobo/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.367889 [2aac44bc] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.368072 [2aac44bc] open("/lib/tls/v7l/neon/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.368262 [2aac43d0] stat64("/lib/tls/v7l/neon/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.368511 [2aac44bc] open("/lib/tls/v7l/neon/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.368706 [2aac43d0] stat64("/lib/tls/v7l/neon", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.368867 [2aac44bc] open("/lib/tls/v7l/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.369037 [2aac43d0] stat64("/lib/tls/v7l/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.369197 [2aac44bc] open("/lib/tls/v7l/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.369363 [2aac43d0] stat64("/lib/tls/v7l", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.369509 [2aac44bc] open("/lib/tls/neon/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.369710 [2aac43d0] stat64("/lib/tls/neon/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.369865 [2aac44bc] open("/lib/tls/neon/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.370034 [2aac43d0] stat64("/lib/tls/neon", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.370176 [2aac44bc] open("/lib/tls/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.370340 [2aac43d0] stat64("/lib/tls/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.370482 [2aac44bc] open("/lib/tls/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.370637 [2aac43d0] stat64("/lib/tls", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.370773 [2aac44bc] open("/lib/v7l/neon/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.370949 [2aac43d0] stat64("/lib/v7l/neon/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.371096 [2aac44bc] open("/lib/v7l/neon/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.371264 [2aac43d0] stat64("/lib/v7l/neon", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.371406 [2aac44bc] open("/lib/v7l/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.371564 [2aac43d0] stat64("/lib/v7l/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.371707 [2aac44bc] open("/lib/v7l/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.371861 [2aac43d0] stat64("/lib/v7l", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.371997 [2aac44bc] open("/lib/neon/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.372166 [2aac43d0] stat64("/lib/neon/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.372309 [2aac44bc] open("/lib/neon/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.372469 [2aac43d0] stat64("/lib/neon", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.372604 [2aac44bc] open("/lib/vfp/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.372759 [2aac43d0] stat64("/lib/vfp", 0x7ed012c8) = -1 ENOENT (No such file or directory)
4276  23:26:04.372896 [2aac44bc] open("/lib/libstdc++.so.6", O_RDONLY|O_CLOEXEC) = 3</lib/libstdc++.so.6.0.12>
4276  23:26:04.373091 [2aac44fc] read(3</lib/libstdc++.so.6.0.12>, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\270\323\4\0004\0\0\0"..., 512) = 512
4276  23:26:04.373295 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aacc000
4276  23:26:04.373441 [2aac4420] fstat64(3</lib/libstdc++.so.6.0.12>, {st_dev=makedev(0xb3, 0x1), st_ino=507, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=1432, st_size=732664, st_atime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_atime_nsec=0, st_mtime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_mtime_nsec=0, st_ctime=1598357556 /* 2020-08-25T14:12:36+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.373858 [2aac46b8] mmap2(NULL, 824176, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libstdc++.so.6.0.12>, 0) = 0x2af24000
4276  23:26:04.374019 [2aac473c] mprotect(0x2afd2000, 61440, PROT_NONE) = 0
4276  23:26:04.374141 [2aac46b8] mmap2(0x2afe1000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libstdc++.so.6.0.12>, 0xad000) = 0x2afe1000
4276  23:26:04.374366 [2aac46b8] mmap2(0x2afe7000, 25456, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2afe7000
4276  23:26:04.374549 [2aac465c] close(3</lib/libstdc++.so.6.0.12>) = 0
4276  23:26:04.374737 [2aac44bc] open("/usr/local/Kobo/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.374980 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.375202 [2aac44bc] open("/usr/local/Kobo/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.375391 [2aac44bc] open("/lib/libgcc_s.so.1", O_RDONLY|O_CLOEXEC) = 3</lib/libgcc_s.so.1>
4276  23:26:04.375581 [2aac44fc] read(3</lib/libgcc_s.so.1>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0P\364\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.375828 [2aac4420] fstat64(3</lib/libgcc_s.so.1>, {st_dev=makedev(0xb3, 0x1), st_ino=506, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=308, st_size=157368, st_atime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_atime_nsec=0, st_mtime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_mtime_nsec=0, st_ctime=1598357556 /* 2020-08-25T14:12:36+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.376250 [2aac46b8] mmap2(NULL, 221508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libgcc_s.so.1>, 0) = 0x2afee000
4276  23:26:04.376406 [2aac473c] mprotect(0x2b014000, 61440, PROT_NONE) = 0
4276  23:26:04.376523 [2aac46b8] mmap2(0x2b023000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libgcc_s.so.1>, 0x25000) = 0x2b023000
4276  23:26:04.376782 [2aac465c] close(3</lib/libgcc_s.so.1>) = 0
4276  23:26:04.376969 [2aac44bc] open("/usr/local/Kobo/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.377182 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.377397 [2aac44bc] open("/usr/local/Kobo/libc.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.377578 [2aac44bc] open("/lib/libc.so.6", O_RDONLY|O_CLOEXEC) = 3</lib/libc-2.11.1.so>
4276  23:26:04.377767 [2aac44fc] read(3</lib/libc-2.11.1.so>, "\177ELF\1\1\1\3\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\234g\1\0004\0\0\0"..., 512) = 512
4276  23:26:04.377980 [2aac4420] fstat64(3</lib/libc-2.11.1.so>, {st_dev=makedev(0xb3, 0x1), st_ino=509, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=2520, st_size=1289388, st_atime=1599504514 /* 2020-09-07T20:48:34+0200 */, st_atime_nsec=0, st_mtime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.378450 [2aac46b8] mmap2(NULL, 1357192, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libc-2.11.1.so>, 0) = 0x2b025000
4276  23:26:04.378624 [2aac473c] mprotect(0x2b15c000, 61440, PROT_NONE) = 0
4276  23:26:04.378737 [2aac46b8] mmap2(0x2b16b000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libc-2.11.1.so>, 0x136000) = 0x2b16b000
4276  23:26:04.378948 [2aac46b8] mmap2(0x2b16e000, 9608, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b16e000
4276  23:26:04.379136 [2aac465c] close(3</lib/libc-2.11.1.so>) = 0
4276  23:26:04.379335 [2aac44bc] open("/usr/local/Kobo/libpng16.so.16", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.379559 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libpng16.so.16", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.379775 [2aac44bc] open("/usr/local/Kobo/libpng16.so.16", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.379960 [2aac44bc] open("/lib/libpng16.so.16", O_RDONLY|O_CLOEXEC) = 3</lib/libpng12.so.0.43.0>
4276  23:26:04.380157 [2aac44fc] read(3</lib/libpng12.so.0.43.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\10@\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.380388 [2aac4420] fstat64(3</lib/libpng12.so.0.43.0>, {st_dev=makedev(0xb3, 0x1), st_ino=79, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=248, st_size=126100, st_atime=1501559318 /* 2017-08-01T05:48:38+0200 */, st_atime_nsec=0, st_mtime=1501559318 /* 2017-08-01T05:48:38+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.380834 [2aac46b8] mmap2(NULL, 190284, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libpng12.so.0.43.0>, 0) = 0x2b171000
4276  23:26:04.381005 [2aac473c] mprotect(0x2b190000, 61440, PROT_NONE) = 0
4276  23:26:04.381131 [2aac46b8] mmap2(0x2b19f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libpng12.so.0.43.0>, 0x1e000) = 0x2b19f000
4276  23:26:04.381349 [2aac465c] close(3</lib/libpng12.so.0.43.0>) = 0
4276  23:26:04.381532 [2aac44bc] open("/usr/local/Kobo/libjpeg.so.62", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.381748 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libjpeg.so.62", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.381960 [2aac44bc] open("/usr/local/Kobo/libjpeg.so.62", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.382147 [2aac44bc] open("/lib/libjpeg.so.62", O_RDONLY|O_CLOEXEC) = 3</lib/libjpeg.so.62.0.0>
4276  23:26:04.382338 [2aac44fc] read(3</lib/libjpeg.so.62.0.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0`*\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.383840 [2aac4420] fstat64(3</lib/libjpeg.so.62.0.0>, {st_dev=makedev(0xb3, 0x1), st_ino=489, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=554, st_size=283304, st_atime=1586355633 /* 2020-04-08T16:20:33+0200 */, st_atime_nsec=0, st_mtime=1586355633 /* 2020-04-08T16:20:33+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.384399 [2aac46b8] mmap2(NULL, 347332, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libjpeg.so.62.0.0>, 0) = 0x2b1a0000
4276  23:26:04.384628 [2aac473c] mprotect(0x2b1e5000, 61440, PROT_NONE) = 0
4276  23:26:04.384771 [2aac46b8] mmap2(0x2b1f4000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libjpeg.so.62.0.0>, 0x44000) = 0x2b1f4000
4276  23:26:04.385019 [2aac465c] close(3</lib/libjpeg.so.62.0.0>) = 0
4276  23:26:04.385237 [2aac44bc] open("/usr/local/Kobo/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.385506 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.385740 [2aac44bc] open("/usr/local/Kobo/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.385935 [2aac44bc] open("/lib/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.386099 [2aac44bc] open("/usr/lib/tls/v7l/neon/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.386300 [2aac43d0] stat64("/usr/lib/tls/v7l/neon/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.386476 [2aac44bc] open("/usr/lib/tls/v7l/neon/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.386666 [2aac43d0] stat64("/usr/lib/tls/v7l/neon", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.386825 [2aac44bc] open("/usr/lib/tls/v7l/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.387003 [2aac43d0] stat64("/usr/lib/tls/v7l/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.388472 [2aac44bc] open("/usr/lib/tls/v7l/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.388791 [2aac43d0] stat64("/usr/lib/tls/v7l", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.388980 [2aac44bc] open("/usr/lib/tls/neon/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.389181 [2aac43d0] stat64("/usr/lib/tls/neon/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.389349 [2aac44bc] open("/usr/lib/tls/neon/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.389535 [2aac43d0] stat64("/usr/lib/tls/neon", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.389690 [2aac44bc] open("/usr/lib/tls/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.393183 [2aac43d0] stat64("/usr/lib/tls/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.393462 [2aac44bc] open("/usr/lib/tls/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.393669 [2aac43d0] stat64("/usr/lib/tls", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.393835 [2aac44bc] open("/usr/lib/v7l/neon/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.394028 [2aac43d0] stat64("/usr/lib/v7l/neon/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.394190 [2aac44bc] open("/usr/lib/v7l/neon/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.394368 [2aac43d0] stat64("/usr/lib/v7l/neon", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.394520 [2aac44bc] open("/usr/lib/v7l/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.394696 [2aac43d0] stat64("/usr/lib/v7l/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.394846 [2aac44bc] open("/usr/lib/v7l/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.395013 [2aac43d0] stat64("/usr/lib/v7l", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.395157 [2aac44bc] open("/usr/lib/neon/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.395334 [2aac43d0] stat64("/usr/lib/neon/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.395486 [2aac44bc] open("/usr/lib/neon/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.395654 [2aac43d0] stat64("/usr/lib/neon", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.395798 [2aac44bc] open("/usr/lib/vfp/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.395961 [2aac43d0] stat64("/usr/lib/vfp", 0x7ed01110) = -1 ENOENT (No such file or directory)
4276  23:26:04.396105 [2aac44bc] open("/usr/lib/libicuuc.so.64", O_RDONLY|O_CLOEXEC) = 3</usr/lib/libicuuc.so.46.0>
4276  23:26:04.396351 [2aac44fc] read(3</usr/lib/libicuuc.so.46.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\230N\4\0004\0\0\0"..., 512) = 512
4276  23:26:04.398252 [2aac4420] fstat64(3</usr/lib/libicuuc.so.46.0>, {st_dev=makedev(0xb3, 0x1), st_ino=117, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=3142, st_size=1608011, st_atime=1592664046 /* 2020-06-20T16:40:46+0200 */, st_atime_nsec=0, st_mtime=1592664046 /* 2020-06-20T16:40:46+0200 */, st_mtime_nsec=0, st_ctime=1598357494 /* 2020-08-25T14:11:34+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.398937 [2aac46b8] mmap2(NULL, 1345604, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/lib/libicuuc.so.46.0>, 0) = 0x2b1f5000
4276  23:26:04.399158 [2aac473c] mprotect(0x2b322000, 65536, PROT_NONE) = 0
4276  23:26:04.399299 [2aac46b8] mmap2(0x2b332000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/lib/libicuuc.so.46.0>, 0x12d000) = 0x2b332000
4276  23:26:04.399553 [2aac46b8] mmap2(0x2b33c000, 6212, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2b33c000
4276  23:26:04.399717 [2aac465c] close(3</usr/lib/libicuuc.so.46.0>) = 0
4276  23:26:04.399932 [2aac44bc] open("/usr/local/Kobo/libicudata.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.400199 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libicudata.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.400438 [2aac44bc] open("/usr/local/Kobo/libicudata.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.400634 [2aac44bc] open("/lib/libicudata.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.400809 [2aac44bc] open("/usr/lib/libicudata.so.64", O_RDONLY|O_CLOEXEC) = 3</usr/lib/libicudata.so.46.0>
4276  23:26:04.401076 [2aac44fc] read(3</usr/lib/libicudata.so.46.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0 \4\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.405179 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aacd000
4276  23:26:04.405499 [2aac4420] fstat64(3</usr/lib/libicudata.so.46.0>, {st_dev=makedev(0xb3, 0x1), st_ino=145, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=20854, st_size=10676485, st_atime=1592664028 /* 2020-06-20T16:40:28+0200 */, st_atime_nsec=0, st_mtime=1592664028 /* 2020-06-20T16:40:28+0200 */, st_mtime_nsec=0, st_ctime=1598357496 /* 2020-08-25T14:11:36+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.406055 [2aac46b8] mmap2(NULL, 10737504, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/lib/libicudata.so.46.0>, 0) = 0x2b33e000
4276  23:26:04.406252 [2aac473c] mprotect(0x2bd6c000, 61440, PROT_NONE) = 0
4276  23:26:04.406389 [2aac46b8] mmap2(0x2bd7b000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/lib/libicudata.so.46.0>, 0xa2d000) = 0x2bd7b000
4276  23:26:04.406636 [2aac465c] close(3</usr/lib/libicudata.so.46.0>) = 0
4276  23:26:04.406844 [2aac44bc] open("/usr/local/Kobo/libicui18n.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.407121 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libicui18n.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.407370 [2aac44bc] open("/usr/local/Kobo/libicui18n.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.407574 [2aac44bc] open("/lib/libicui18n.so.64", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.407744 [2aac44bc] open("/usr/lib/libicui18n.so.64", O_RDONLY|O_CLOEXEC) = 3</usr/lib/libicui18n.so.46.0>
4276  23:26:04.407964 [2aac44fc] read(3</usr/lib/libicui18n.so.46.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300\345\v\0004\0\0\0"..., 512) = 512
4276  23:26:04.408186 [2aac4420] fstat64(3</usr/lib/libicui18n.so.46.0>, {st_dev=makedev(0xb3, 0x1), st_ino=181, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=5590, st_size=2861915, st_atime=1592664034 /* 2020-06-20T16:40:34+0200 */, st_atime_nsec=0, st_mtime=1592664034 /* 2020-06-20T16:40:34+0200 */, st_mtime_nsec=0, st_ctime=1598357496 /* 2020-08-25T14:11:36+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.408748 [2aac46b8] mmap2(NULL, 2088168, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</usr/lib/libicui18n.so.46.0>, 0) = 0x2bd7c000
4276  23:26:04.408940 [2aac473c] mprotect(0x2bf60000, 65536, PROT_NONE) = 0
4276  23:26:04.409067 [2aac46b8] mmap2(0x2bf70000, 40960, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</usr/lib/libicui18n.so.46.0>, 0x1e4000) = 0x2bf70000
4276  23:26:04.409353 [2aac465c] close(3</usr/lib/libicui18n.so.46.0>) = 0
4276  23:26:04.409563 [2aac44bc] open("/usr/local/Kobo/libiconv.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.409806 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libiconv.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.410021 [2aac44bc] open("/usr/local/Kobo/libiconv.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.410205 [2aac44bc] open("/lib/libiconv.so.2", O_RDONLY|O_CLOEXEC) = 3</lib/libiconv.so.2.5.0>
4276  23:26:04.410401 [2aac44fc] read(3</lib/libiconv.so.2.5.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\200\21\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.410617 [2aac4420] fstat64(3</lib/libiconv.so.2.5.0>, {st_dev=makedev(0xb3, 0x1), st_ino=71, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=1714, st_size=877516, st_atime=1501559065 /* 2017-08-01T05:44:25+0200 */, st_atime_nsec=0, st_mtime=1501559065 /* 2017-08-01T05:44:25+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.411041 [2aac46b8] mmap2(NULL, 941732, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libiconv.so.2.5.0>, 0) = 0x2bf7a000
4276  23:26:04.411240 [2aac473c] mprotect(0x2c050000, 61440, PROT_NONE) = 0
4276  23:26:04.411371 [2aac46b8] mmap2(0x2c05f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libiconv.so.2.5.0>, 0xd5000) = 0x2c05f000
4276  23:26:04.411601 [2aac465c] close(3</lib/libiconv.so.2.5.0>) = 0
4276  23:26:04.411787 [2aac44bc] open("/usr/local/Kobo/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.412008 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.412221 [2aac44bc] open("/usr/local/Kobo/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.412405 [2aac44bc] open("/lib/libdbus-1.so.3", O_RDONLY|O_CLOEXEC) = 3</lib/libdbus-1.so.3.4.0>
4276  23:26:04.412598 [2aac44fc] read(3</lib/libdbus-1.so.3.4.0>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0XX\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.412808 [2aac4420] fstat64(3</lib/libdbus-1.so.3.4.0>, {st_dev=makedev(0xb3, 0x1), st_ino=36, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=480, st_size=245452, st_atime=1595879373 /* 2020-07-27T21:49:33+0200 */, st_atime_nsec=0, st_mtime=1595879373 /* 2020-07-27T21:49:33+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.413263 [2aac46b8] mmap2(NULL, 309828, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libdbus-1.so.3.4.0>, 0) = 0x2c060000
4276  23:26:04.413427 [2aac473c] mprotect(0x2c09c000, 61440, PROT_NONE) = 0
4276  23:26:04.413549 [2aac46b8] mmap2(0x2c0ab000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libdbus-1.so.3.4.0>, 0x3b000) = 0x2c0ab000
4276  23:26:04.413766 [2aac465c] close(3</lib/libdbus-1.so.3.4.0>) = 0
4276  23:26:04.413951 [2aac44bc] open("/usr/local/Kobo/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.414161 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.414369 [2aac44bc] open("/usr/local/Kobo/libdl.so.2", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.414543 [2aac44bc] open("/lib/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3</lib/libdl-2.11.1.so>
4276  23:26:04.414732 [2aac44fc] read(3</lib/libdl-2.11.1.so>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\240\t\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.414940 [2aac4420] fstat64(3</lib/libdl-2.11.1.so>, {st_dev=makedev(0xb3, 0x1), st_ino=477, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=20, st_size=9832, st_atime=1501532113 /* 2017-07-31T22:15:13+0200 */, st_atime_nsec=0, st_mtime=1501532113 /* 2017-07-31T22:15:13+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.415357 [2aac46b8] mmap2(NULL, 73912, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libdl-2.11.1.so>, 0) = 0x2c0ac000
4276  23:26:04.415514 [2aac473c] mprotect(0x2c0ae000, 61440, PROT_NONE) = 0
4276  23:26:04.415636 [2aac46b8] mmap2(0x2c0bd000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libdl-2.11.1.so>, 0x1000) = 0x2c0bd000
4276  23:26:04.415886 [2aac465c] close(3</lib/libdl-2.11.1.so>) = 0
4276  23:26:04.416076 [2aac44bc] open("/usr/local/Kobo/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.416294 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.416502 [2aac44bc] open("/usr/local/Kobo/librt.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.416678 [2aac44bc] open("/lib/librt.so.1", O_RDONLY|O_CLOEXEC) = 3</lib/librt-2.11.1.so>
4276  23:26:04.416866 [2aac44fc] read(3</lib/librt-2.11.1.so>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0@\30\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.417070 [2aac4420] fstat64(3</lib/librt-2.11.1.so>, {st_dev=makedev(0xb3, 0x1), st_ino=82, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=46, st_size=22592, st_atime=1501532919 /* 2017-07-31T22:28:39+0200 */, st_atime_nsec=0, st_mtime=1501532919 /* 2017-07-31T22:28:39+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.417506 [2aac46b8] mmap2(NULL, 86588, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/librt-2.11.1.so>, 0) = 0x2c0bf000
4276  23:26:04.417671 [2aac473c] mprotect(0x2c0c4000, 61440, PROT_NONE) = 0
4276  23:26:04.417788 [2aac46b8] mmap2(0x2c0d3000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/librt-2.11.1.so>, 0x4000) = 0x2c0d3000
4276  23:26:04.418046 [2aac465c] close(3</lib/librt-2.11.1.so>) = 0
4276  23:26:04.418237 [2aac44bc] open("/usr/local/Kobo/libz.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.418530 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libz.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.418755 [2aac44bc] open("/usr/local/Kobo/libz.so.1", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.418935 [2aac44bc] open("/lib/libz.so.1", O_RDONLY|O_CLOEXEC) = 3</lib/libz.so.1.2.4>
4276  23:26:04.419126 [2aac44fc] read(3</lib/libz.so.1.2.4>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\340\30\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.419335 [2aac4420] fstat64(3</lib/libz.so.1.2.4>, {st_dev=makedev(0xb3, 0x1), st_ino=497, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=150, st_size=75956, st_atime=1586355579 /* 2020-04-08T16:19:39+0200 */, st_atime_nsec=0, st_mtime=1586355579 /* 2020-04-08T16:19:39+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.419747 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aace000
4276  23:26:04.419894 [2aac46b8] mmap2(NULL, 139984, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libz.so.1.2.4>, 0) = 0x2c0d5000
4276  23:26:04.420066 [2aac473c] mprotect(0x2c0e7000, 65536, PROT_NONE) = 0
4276  23:26:04.420187 [2aac46b8] mmap2(0x2c0f7000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libz.so.1.2.4>, 0x12000) = 0x2c0f7000
4276  23:26:04.420470 [2aac473c] mprotect(0x7ed01000, 4096, PROT_READ|PROT_WRITE|PROT_EXEC|PROT_GROWSDOWN) = 0
4276  23:26:04.420614 [2aac465c] close(3</lib/libz.so.1.2.4>) = 0
4276  23:26:04.420817 [2aac44bc] open("/usr/local/Kobo/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.421053 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.421271 [2aac44bc] open("/usr/local/Kobo/libpthread.so.0", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.421451 [2aac44bc] open("/lib/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3</lib/libpthread-2.11.1.so>
4276  23:26:04.421659 [2aac44fc] read(3</lib/libpthread-2.11.1.so>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\270H\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.421876 [2aac4420] fstat64(3</lib/libpthread-2.11.1.so>, {st_dev=makedev(0xb3, 0x1), st_ino=496, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=182, st_size=92636, st_atime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_atime_nsec=0, st_mtime=1586813579 /* 2020-04-13T23:32:59+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.422299 [2aac46b8] mmap2(NULL, 164412, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libpthread-2.11.1.so>, 0) = 0x2c0f8000
4276  23:26:04.422469 [2aac473c] mprotect(0x2c10e000, 61440, PROT_NONE) = 0
4276  23:26:04.422591 [2aac46b8] mmap2(0x2c11d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libpthread-2.11.1.so>, 0x15000) = 0x2c11d000
4276  23:26:04.422817 [2aac46b8] mmap2(0x2c11f000, 4668, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x2c11f000
4276  23:26:04.423027 [2aac465c] close(3</lib/libpthread-2.11.1.so>) = 0
4276  23:26:04.423237 [2aac44bc] open("/usr/local/Kobo/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.423465 [2aac44bc] open("/usr/local/Qt-5.2.1-arm/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.423680 [2aac44bc] open("/usr/local/Kobo/libm.so.6", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
4276  23:26:04.423856 [2aac44bc] open("/lib/libm.so.6", O_RDONLY|O_CLOEXEC) = 3</lib/libm-2.11.1.so>
4276  23:26:04.424049 [2aac44fc] read(3</lib/libm-2.11.1.so>, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0h<\0\0004\0\0\0"..., 512) = 512
4276  23:26:04.424275 [2aac4420] fstat64(3</lib/libm-2.11.1.so>, {st_dev=makedev(0xb3, 0x1), st_ino=508, st_mode=S_IFREG|0755, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=796, st_size=407144, st_atime=1599504514 /* 2020-09-07T20:48:34+0200 */, st_atime_nsec=0, st_mtime=1501532319 /* 2017-07-31T22:18:39+0200 */, st_mtime_nsec=0, st_ctime=1598357557 /* 2020-08-25T14:12:37+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.424693 [2aac46b8] mmap2(NULL, 471184, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3</lib/libm-2.11.1.so>, 0) = 0x2c121000
4276  23:26:04.424857 [2aac473c] mprotect(0x2c184000, 61440, PROT_NONE) = 0
4276  23:26:04.424981 [2aac46b8] mmap2(0x2c193000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3</lib/libm-2.11.1.so>, 0x62000) = 0x2c193000
4276  23:26:04.425235 [2aac465c] close(3</lib/libm-2.11.1.so>) = 0
4276  23:26:04.425725 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aacf000
4276  23:26:04.426019 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aad0000
4276  23:26:04.426173 [2aaaba48] set_tls(0x2aacffb0) = 0
4276  23:26:04.427838 [2aac473c] mprotect(0x2b16b000, 8192, PROT_READ) = 0
4276  23:26:04.428468 [2aac473c] mprotect(0x2c193000, 4096, PROT_READ) = 0
4276  23:26:04.428877 [2aac473c] mprotect(0x2c11d000, 4096, PROT_READ) = 0
4276  23:26:04.429231 [2aac473c] mprotect(0x2b023000, 4096, PROT_READ) = 0
4276  23:26:04.429593 [2aac473c] mprotect(0x2c0d3000, 4096, PROT_READ) = 0
4276  23:26:04.429954 [2aac473c] mprotect(0x2c0bd000, 4096, PROT_READ) = 0
4276  23:26:04.437546 [2aac46b8] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aad1000
4276  23:26:04.438195 [2aac473c] mprotect(0x2afe1000, 16384, PROT_READ) = 0
4276  23:26:04.447028 [2aac473c] mprotect(0x2aeac000, 20480, PROT_READ) = 0
4276  23:26:04.448984 [2aac473c] mprotect(0x2af22000, 4096, PROT_READ) = 0
4276  23:26:04.449436 [2aac473c] mprotect(0x2d000, 4096, PROT_READ) = 0
4276  23:26:04.449754 [2aac473c] mprotect(0x2aada000, 4096, PROT_READ) = 0
4276  23:26:04.449934 [2c0fc464] set_tid_address(0x2aacfb58) = 4276
4276  23:26:04.450040 [2c0fc49c] set_robust_list(0x2aacfb60, 12) = 0
4276  23:26:04.450229 [2c108860] rt_sigaction(SIGRTMIN, {sa_handler=0x2c0fc354, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO, sa_restorer=0x2b053180}, NULL, 8) = 0
4276  23:26:04.450561 [2c108860] rt_sigaction(SIGRT_1, {sa_handler=0x2c0fc1f8, sa_mask=[], sa_flags=SA_RESTORER|SA_RESTART|SA_SIGINFO, sa_restorer=0x2b053180}, NULL, 8) = 0
4276  23:26:04.450818 [2c0fc578] rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
4276  23:26:04.451021 [2b0f0e8c] ugetrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
4276  23:26:04.452004 [2b0f138c] brk(NULL) = 0x2f000
4276  23:26:04.452178 [2b0f138c] brk(0x50000) = 0x50000
4276  23:26:04.452554 [2c105048] futex(0x2aeb186c, FUTEX_WAKE_PRIVATE, 2147483647) = 0
4276  23:26:04.452778 [2b0c62c0] clock_getres(CLOCK_MONOTONIC, {tv_sec=0, tv_nsec=1}) = 0
4276  23:26:04.453092 [2b048f3c] open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3</usr/lib/locale/locale-archive>
4276  23:26:04.453452 [2b0e929c] fstat64(3</usr/lib/locale/locale-archive>, {st_dev=makedev(0xb3, 0x1), st_ino=1691, st_mode=S_IFREG|0644, st_nlink=1, st_uid=0, st_gid=0, st_blksize=1024, st_blocks=3492, st_size=1852560, st_atime=1598378570 /* 2020-08-25T20:02:50+0200 */, st_atime_nsec=0, st_mtime=1598378576 /* 2020-08-25T20:02:56+0200 */, st_mtime_nsec=0, st_ctime=1598378576 /* 2020-08-25T20:02:56+0200 */, st_ctime_nsec=0}) = 0
4276  23:26:04.453952 [2b0f55f4] mmap2(NULL, 1852560, PROT_READ, MAP_PRIVATE, 3</usr/lib/locale/locale-archive>, 0) = 0x2c195000
4276  23:26:04.454168 [2b049304] close(3</usr/lib/locale/locale-archive>) = 0
4276  23:26:04.454531 [2b0f92b0] eventfd2(0, EFD_CLOEXEC|EFD_NONBLOCK) = 3<anon_inode:[eventfd]>
4276  23:26:04.454867 [2b0ea70c] pipe2([4<pipe:[12454]>, 5<pipe:[12454]>], O_NONBLOCK|O_CLOEXEC) = 0
4276  23:26:04.455140 [2b051e90] rt_sigaction(SIGCHLD, NULL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
4276  23:26:04.455415 [2b051e90] rt_sigaction(SIGCHLD, {sa_handler=0x2ac8e82d, sa_mask=[], sa_flags=SA_RESTORER|SA_SIGINFO|SA_NOCLDSTOP, sa_restorer=0x2b053180}, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=0}, 8) = 0
4276  23:26:04.456059 [2b0e9a64] open("/dev/urandom", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 6</dev/urandom<char 1:9>>
4276  23:26:04.456345 [2b0ea2a8] fcntl64(6</dev/urandom<char 1:9>>, F_SETFD, FD_CLOEXEC) = 0
4276  23:26:04.456505 [2b0e9e2c] read(6</dev/urandom<char 1:9>>, ".U\332\346", 4) = 4
4276  23:26:04.456690 [2b0ea62c] close(6</dev/urandom<char 1:9>>) = 0
4276  23:26:04.458290 [2c105048] futex(0x2c0be0ac, FUTEX_WAKE_PRIVATE, 2147483647) = 0
4276  23:26:04.458965 [2b1072a8] clock_getres(CLOCK_MONOTONIC, {tv_sec=0, tv_nsec=1}) = 0
4276  23:26:04.459187 [2b0c528c] getresuid32([0], [0], [0]) = 0
4276  23:26:04.459355 [2b0c52d8] getresgid32([0], [0], [0]) = 0
4276  23:26:04.460704 [2b0f9f2c] socket(AF_UNIX, SOCK_STREAM|SOCK_CLOEXEC, 0) = 6<socket:[12458]>
4276  23:26:04.461513 [2b0f9a4c] connect(6<socket:[12458]>, {sa_family=AF_UNIX, sun_path="//var/run/dbus/system_bus_socket"}, 34) = 0
4276  23:26:04.462513 [2b0ea2a8] fcntl64(6<socket:[12458]>, F_GETFL) = 0x2 (flags O_RDWR)
4276  23:26:04.462938 [2b0ea2a8] fcntl64(6<socket:[12458]>, F_SETFL, O_RDWR|O_NONBLOCK) = 0
4276  23:26:04.463371 [2b0c4f60] geteuid32() = 0
4276  23:26:04.463669 [2b0f9acc] getsockname(6<socket:[12458]>, {sa_family=AF_UNIX}, [128->2]) = 0
4276  23:26:04.465210 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLOUT}], 1, 0) = 1 ([{fd=6, revents=POLLOUT}])
4276  23:26:04.465851 [2b0f9d3c] send(6<socket:[12458]>, "\0", 1, MSG_NOSIGNAL) = 1
4276  23:26:04.466480 [2b0f9d3c] send(6<socket:[12458]>, "AUTH EXTERNAL 30\r\n", 18, MSG_NOSIGNAL) = 18
4276  23:26:04.467350 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
4276  23:26:04.467893 [2b0e9e2c] read(6<socket:[12458]>, "OK dd22fc0700318321f7b4fd2e5f569"..., 2048) = 37
4276  23:26:04.468492 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
4276  23:26:04.468947 [2b0f9d3c] send(6<socket:[12458]>, "NEGOTIATE_UNIX_FD\r\n", 19, MSG_NOSIGNAL) = 19
4276  23:26:04.469563 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN}], 1, -1) = 1 ([{fd=6, revents=POLLIN}])
4276  23:26:04.469995 [2b0e9e2c] read(6<socket:[12458]>, "AGREE_UNIX_FD\r\n", 2048) = 15
4276  23:26:04.470417 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
4276  23:26:04.470802 [2b0f9d3c] send(6<socket:[12458]>, "BEGIN\r\n", 7, MSG_NOSIGNAL) = 7
4276  23:26:04.471303 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN|POLLOUT}], 1, -1) = 1 ([{fd=6, revents=POLLOUT}])
4276  23:26:04.471756 [2b0f9dcc] sendmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\0\1\0\0\0\0\1\0\0\0n\0\0\0\1\1o\0\25\0\0\0/org/fre"..., iov_len=128}, {iov_base="", iov_len=0}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 128
4276  23:26:04.473990 [2b10731c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=5126, tv_nsec=585758385}) = 0
4276  23:26:04.474256 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN}], 1, 25000) = 1 ([{fd=6, revents=POLLIN}])
4276  23:26:04.474908 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\2\1\1\n\0\0\0\1\0\0\0=\0\0\0\6\1s\0\5\0\0\0:1.20\0\0\0"..., iov_len=2048}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 260
4276  23:26:04.475869 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_namelen=0}, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
4276  23:26:04.477260 [2b0e9ebc] write(3<anon_inode:[eventfd]>, "\1\0\0\0\0\0\0\0", 8) = 8
4276  23:26:04.478919 [2b10731c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=5126, tv_nsec=590717385}) = 0
4276  23:26:04.479242 [2b0f9dcc] sendmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\0\1!\0\0\0\2\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., iov_len=144}, {iov_base="\34\0\0\0com.github.shermp.nickeldbus"..., iov_len=33}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 177
4276  23:26:04.480768 [2b10731c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=5126, tv_nsec=592531635}) = 0
4276  23:26:04.480978 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN}], 1, 25000) = 1 ([{fd=6, revents=POLLIN}])
4276  23:26:04.481495 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\2\1\1\t\0\0\0\3\0\0\0=\0\0\0\6\1s\0\5\0\0\0:1.20\0\0\0"..., iov_len=2048}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 89
4276  23:26:04.482270 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_namelen=0}, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
4276  23:26:04.483624 [2b0f9dcc] sendmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\1\1\217\0\0\0\3\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., iov_len=144}, {iov_base="\212\0\0\0type='signal',sender='org.fr"..., iov_len=143}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 287
4276  23:26:04.486343 [2b10731c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=5126, tv_nsec=598160510}) = 0
4276  23:26:04.486658 [2b0f9dcc] sendmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\0\1\0\0\0\0\4\0\0\0{\0\0\0\1\1o\0\v\0\0\0/nickeld"..., iov_len=144}, {iov_base="", iov_len=0}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 144
4276  23:26:04.488069 [2b10731c] clock_gettime(CLOCK_MONOTONIC, {tv_sec=5126, tv_nsec=599840135}) = 0
4276  23:26:04.488282 [2b0ef31c] poll([{fd=6<socket:[12458]>, events=POLLIN}], 1, 25000) = 1 ([{fd=6, revents=POLLIN}])
4276  23:26:14.775929 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\2\1\1\f\0\0\0\347\4\0\0-\0\0\0\6\1s\0\5\0\0\0:1.20\0\0\0"..., iov_len=2048}], msg_iovlen=1, msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 76
4276  23:26:14.777321 [2b0f9cac] recvmsg(6<socket:[12458]>, {msg_namelen=0}, MSG_CMSG_CLOEXEC) = -1 EAGAIN (Resource temporarily unavailable)
4276  23:26:14.778742 [2b0e929c] fstat64(1</dev/null<char 1:3>>, {st_dev=makedev(0, 0xa), st_ino=146, st_mode=S_IFCHR|0666, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_rdev=makedev(0x1, 0x3), st_atime=1420991984 /* 2015-01-11T16:59:44+0100 */, st_atime_nsec=0, st_mtime=1420991984 /* 2015-01-11T16:59:44+0100 */, st_mtime_nsec=0, st_ctime=1599511897 /* 2020-09-07T22:51:37.620000001+0200 */, st_ctime_nsec=620000001}) = 0
4276  23:26:14.779708 [2b0e929c] fstat64(1</dev/null<char 1:3>>, {st_dev=makedev(0, 0xa), st_ino=146, st_mode=S_IFCHR|0666, st_nlink=1, st_uid=0, st_gid=0, st_blksize=4096, st_blocks=0, st_rdev=makedev(0x1, 0x3), st_atime=1420991984 /* 2015-01-11T16:59:44+0100 */, st_atime_nsec=0, st_mtime=1420991984 /* 2015-01-11T16:59:44+0100 */, st_mtime_nsec=0, st_ctime=1599511897 /* 2020-09-07T22:51:37.620000001+0200 */, st_ctime_nsec=620000001}) = 0
4276  23:26:14.780237 [2b0f0ae4] ioctl(1</dev/null<char 1:3>>, TCGETS, 0x7ed01414) = -1 ENOTTY (Inappropriate ioctl for device)
4276  23:26:14.780514 [2b0f5598] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aad2000
4276  23:26:14.780708 [2b0e9ebc] write(1</dev/null<char 1:3>>, "2f2059d\n", 8) = 8
4276  23:26:14.781386 [2b0f9dcc] sendmsg(6<socket:[12458]>, {msg_name=NULL, msg_namelen=0, msg_iov=[{iov_base="l\1\1\1\217\0\0\0\5\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., iov_len=144}, {iov_base="\212\0\0\0type='signal',sender='org.fr"..., iov_len=143}], msg_iovlen=2, msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 287
4276  23:26:14.789487 [2b0b444c] gettimeofday({tv_sec=1599773174, tv_usec=789606}, NULL) = 0
4276  23:26:14.789741 [2b0f7f14] open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 7</sys/devices/system/cpu/online>
4276  23:26:14.790179 [2b0f7c30] read(7</sys/devices/system/cpu/online>, "0\n", 8192) = 2
4276  23:26:14.790430 [2b0f7fe8] close(7</sys/devices/system/cpu/online>) = 0
4276  23:26:14.790673 [2b0ea62c] close(3<anon_inode:[eventfd]>) = 0
4276  23:26:14.791145 [2b0ea62c] close(6<socket:[12458]>) = 0
4276  23:26:14.793830 [2b0c4588] exit_group(0) = ?
4276  23:26:14.794959 [????????] +++ exited with 0 +++

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

(i.e., that's with a max timeout (10s), the final poll blocks until the kill).

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

But, yeah, as your toast example did, on kill, the poll does unblock w/ a POLLIN revent and everything's dandy.

That's... weird.

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

Looking around, it looks like others have had similar issues calling another Qt program using QProcess(). I'm going to tentatively suggest that maybe their event loops clash if run in the same process?

EDIT: On the other hand, NM isn't starting the Qt program directly, it's being started via /bin/sh -c, so who knows what's going on.

shermp avatar Sep 10 '20 21:09 shermp

If it weren't a poll on a socket, I'd suggest some sort of buffering mishap on standard I/O fds, but that's... strange here.

NiLuJe avatar Sep 10 '20 21:09 NiLuJe

Maybe @pgaskin has any ideas as to what might be happening?

shermp avatar Sep 10 '20 21:09 shermp

If all else fails, I can probably switch to using dbus-send if I have to.

shermp avatar Sep 10 '20 22:09 shermp

qndb requires cooperation from Nickel for that method call, right?

Except... waitForFinished is essentially a fancy wrapper around wait, i.e., it blocks. But NM & NDB are in Nickel, so it blocks... Nickel. Which means it can't reply to qndb: deadlock until the wait times out.

(At which points qndb gets its reply, but it's too late for a chain, as a timeout counts as failure).

NiLuJe avatar Sep 10 '20 22:09 NiLuJe

Oooh, yeah, that might explain it. Which means dbus-send probably won't help either.

shermp avatar Sep 10 '20 22:09 shermp

Yup.

I guess you could at least check /proc/$(pidof -s nickel)/maps for /usr/local/Kobo/imageformats/libndb.so to check if NDB is loaded, and then figure out another way to get its version?

EDIT: We're back to ELF shenanigans on that front, are we? :D.

NiLuJe avatar Sep 10 '20 22:09 NiLuJe

For KU, getting the NDB version isn't critical at this stage, so not a huge issue, but it would be nice to solve.

EDIT: I guess a crude solution could be to make NDB write a version file to /tmp on init.

shermp avatar Sep 10 '20 22:09 shermp

That or... write NDB actions into NM, so you can run dbus queries from within NM without relying on qndb... ;p.


Sidebar re: the CreateFile stuff: was probably just missing the O_TRUNC flag, otherwise, open'ing an existing file appends to it when writing ;).

NiLuJe avatar Sep 10 '20 23:09 NiLuJe