summaryrefslogtreecommitdiffstats
path: root/src/b2qt-update-util
diff options
context:
space:
mode:
authorRainer Keller <rainer.keller@digia.com>2014-09-04 10:38:02 +0200
committerRainer Keller <rainer.keller@digia.com>2014-09-04 15:09:20 +0300
commitfa2d78c6088be96e755d97b1a72343753abec8d1 (patch)
tree589a1c1a06db570a17235a7699dffc4012241c2f /src/b2qt-update-util
parent3a4fb56b69957ada6e59a669ea38df948794dbd0 (diff)
Add tools related for update
b2qt-update-application is for doing the actual update. b2qt-update-util is for initiating and finishing the update. Change-Id: Ide1c1ba307d9346bacf83c507816feecefe87a16 Reviewed-by: Eirik Aavitsland <eirik.aavitsland@digia.com>
Diffstat (limited to 'src/b2qt-update-util')
-rw-r--r--src/b2qt-update-util/.gitignore4
-rw-r--r--src/b2qt-update-util/b2qt-update-util.pro2
-rw-r--r--src/b2qt-update-util/main.cpp138
3 files changed, 144 insertions, 0 deletions
diff --git a/src/b2qt-update-util/.gitignore b/src/b2qt-update-util/.gitignore
new file mode 100644
index 0000000..67f0098
--- /dev/null
+++ b/src/b2qt-update-util/.gitignore
@@ -0,0 +1,4 @@
+Makefile
+b2qt-update-util
+*.o
+moc_*.cpp
diff --git a/src/b2qt-update-util/b2qt-update-util.pro b/src/b2qt-update-util/b2qt-update-util.pro
new file mode 100644
index 0000000..87397b4
--- /dev/null
+++ b/src/b2qt-update-util/b2qt-update-util.pro
@@ -0,0 +1,2 @@
+QT = core
+SOURCES = main.cpp
diff --git a/src/b2qt-update-util/main.cpp b/src/b2qt-update-util/main.cpp
new file mode 100644
index 0000000..ae26dc5
--- /dev/null
+++ b/src/b2qt-update-util/main.cpp
@@ -0,0 +1,138 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use the contact form at
+** http://qt.digia.com/
+**
+** This file is part of Qt Enterprise Embedded.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** the contact form at http://qt.digia.com/
+**
+****************************************************************************/
+
+#include <QCoreApplication>
+#include <sys/reboot.h>
+#include <QFile>
+#include <QDebug>
+#include <unistd.h>
+#include <QStringList>
+#include <QProcess>
+
+bool mount_boot()
+{
+ return QProcess::execute("mount", QStringList() << "/dev/mmcblk0p1" << "/boot") == 0;
+}
+
+bool umount_boot()
+{
+ return QProcess::execute("umount", QStringList() << "/boot") == 0;
+}
+
+bool finish_update()
+{
+ if (!mount_boot()) {
+ qWarning() << "Could not mount /boot";
+ return false;
+ }
+ QFile f("/boot/update/state");
+ if (!f.open(QFile::WriteOnly)) {
+ qWarning() << "Could not open file for writing";
+ return false;
+ }
+ if (f.write("v") != 1) {
+ qWarning() << "Write error";
+ return false;
+ }
+ fsync(f.handle());
+ f.close();
+ if (!umount_boot()) {
+ qWarning() << "Could not unmount /boot";
+ return false;
+ }
+ return true;
+}
+
+int start_update(const QString &source)
+{
+ if (!mount_boot()) {
+ qWarning() << "Could not mount /boot";
+ return false;
+ }
+ {
+ QFile f("/boot/update/source");
+ if (!f.open(QFile::WriteOnly)) {
+ qWarning() << "Could not open file for writing";
+ return false;
+ }
+ QByteArray ba = source.toUtf8();
+
+ if (f.write(ba) != ba.size()) {
+ qWarning() << "Write error";
+ return false;
+ }
+ fsync(f.handle());
+ f.close();
+ }
+
+ {
+ QFile f("/boot/update/state");
+ if (!f.open(QFile::WriteOnly)) {
+ qWarning() << "Could not open file for writing";
+ return false;
+ }
+ if (f.write("u") != 1) {
+ qWarning() << "Write error";
+ return false;
+ }
+ fsync(f.handle());
+ f.close();
+ }
+ if (!umount_boot()) {
+ qWarning() << "Could not unmount /boot";
+ return false;
+ }
+ reboot(RB_AUTOBOOT);
+ return true;
+}
+
+void usage()
+{
+ fprintf(stderr,
+ "b2qt-update [start|finish] [...]\n"
+ " start: For internet update provide a http URL as parameter\n"
+ " finish: An update\n"
+ );
+}
+
+int main(int argc, char **argv)
+{
+ QCoreApplication app(argc, argv);
+ QStringList args = app.arguments();
+
+ args.removeFirst();
+ if (args.size() == 0) {
+ usage();
+ return 1;
+ }
+
+ QString arg = args.takeFirst();
+
+ if (arg == "finish")
+ return finish_update();
+ else if (arg == "start") {
+ if (args.size() == 0)
+ return start_update(QString());
+ else
+ return start_update(args.takeFirst());
+ } else {
+ usage();
+ return 1;
+ }
+}