Kobo-UNCaGED
Kobo-UNCaGED copied to clipboard
Web UI and NickelMenu early feedback request
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.
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"]
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.
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)?
Oh, and I suggest you ship a NM config with KU (put it in .adds/nm/ku
or something like that).
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).
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).
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
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 ;).
Also, I imagine using exec
in the cmd_spawn
would get rid of one of those ;).
You can also anchor the pkill -f
to the start of the command with ^
, as it's a regexp.
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.
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?
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.
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.
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
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.
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 :)
And don't worry about setting up a toolchain. I'll attach a build to this thread when I have one ready.
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.
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 ^^).
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 ;).
Forcing WAL checkpointing (https://www.sqlite.org/c3ref/wal_checkpoint_v2.html) might also help?
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.
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?
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.
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
I'll see if I can trigger it again, or if it was just a fluke.
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 ;).
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'...
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 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 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)
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!
The KOReader images are definitely taking the "one image per TC" approach ^^.
c.f., https://hub.docker.com/u/koreader
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.
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.
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 ^^]).
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.
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).
Yeah, looking at the docs, a minimal build looks to be as simple as
gcc -DSQLITE_THREADSAFE=0 shell.c sqlite3.c -ldl
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?
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 ;).
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 ^ ^
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).)
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.
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?
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.)
(... 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...
I'm wondering the sync/scan process emits some sort of signal that one could wait for using QEventLoop
?
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.
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?
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?
The issue isn't so much detecting it, but that we are running inside the event loop, so we can't really block.
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.
You could also make something like NM, but for UNCaGED specifically. The downside would be cross-version compatibility.
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 ;).
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.
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?
Also, I think you mean cmd_output:120000:sleep 120 instead.
Nah... NM will complain if you try that! 10s timeout limit.
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?
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')"
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" ;).
It would probably be a better idea to make another mod based on NM to emit custom events when functions are called.
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...
Side-note: yes, Sickel does appear to murder Nickel if it freezes...
(I err.. managed to introduce a deadlock using FIFO's... oops?)
@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.
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...
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).
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.
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.
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.
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).
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: 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 ^^).
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.
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: 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.
@shermp:
https://github.com/shermp/Kobo-UNCaGED/blob/466f8ba92b54abd72df9c5565191c23eac62fecb/scripts/ku-lib.sh#L80
oldifs
-> $oldifs
?
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
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
@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
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
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
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.
My guess would be qndb
is hanging when launched from NM, for some reason?
I'd try with a larger timeout and attach strace to it as a first look see ;)
Hmm. could be. It's about the only thing I can think of. I'll run a quick test to see.
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.
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 +++
(i.e., that's with a max timeout (10s), the final poll blocks until the kill).
But, yeah, as your toast example did, on kill, the poll does unblock w/ a POLLIN revent and everything's dandy.
That's... weird.
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.
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.
Maybe @pgaskin has any ideas as to what might be happening?
If all else fails, I can probably switch to using dbus-send
if I have to.
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).
Oooh, yeah, that might explain it. Which means dbus-send
probably won't help either.
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.
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.
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 ;).