From fa2d78c6088be96e755d97b1a72343753abec8d1 Mon Sep 17 00:00:00 2001 From: Rainer Keller Date: Thu, 4 Sep 2014 10:38:02 +0200 Subject: 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 --- src/b2qt-update-util/.gitignore | 4 + src/b2qt-update-util/b2qt-update-util.pro | 2 + src/b2qt-update-util/main.cpp | 138 ++++++++++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 src/b2qt-update-util/.gitignore create mode 100644 src/b2qt-update-util/b2qt-update-util.pro create mode 100644 src/b2qt-update-util/main.cpp (limited to 'src/b2qt-update-util') 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 +#include +#include +#include +#include +#include +#include + +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; + } +} -- cgit v1.2.3