sync() after write to avoid losing file data on power off.
This commit is contained in:
+2
-2
@@ -1,10 +1,10 @@
|
||||
cmake_minimum_required(VERSION 3.16.0)
|
||||
project(pipedal
|
||||
VERSION 1.2.45
|
||||
VERSION 1.2.46
|
||||
DESCRIPTION "PiPedal Guitar Effect Pedal For Raspberry Pi"
|
||||
HOMEPAGE_URL "https://rerdavies.github.io/pipedal"
|
||||
)
|
||||
set (DISPLAY_VERSION "PiPedal v1.2.45-Release")
|
||||
set (DISPLAY_VERSION "PiPedal v1.2.46-Development")
|
||||
set (PACKAGE_ARCHITECTURE "arm64")
|
||||
set (CMAKE_INSTALL_PREFIX "/usr/")
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#include <stdexcept>
|
||||
#include "ss.hpp"
|
||||
#include <chrono>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
|
||||
namespace impl {
|
||||
@@ -72,7 +73,7 @@ public:
|
||||
f << "trace: " << message << std::endl;
|
||||
}
|
||||
private:
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
};
|
||||
|
||||
class SystemdDBusLogger : public IDBusLogger {
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "ChannelInfo.hpp"
|
||||
#include "DBusLog.hpp"
|
||||
#include <sys/stat.h>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
P2pSettings::P2pSettings(const std::filesystem::path&configDirectoryPath, const std::filesystem::path&varDirectoryPath)
|
||||
@@ -193,7 +194,7 @@ void P2pSettings::Load()
|
||||
}
|
||||
|
||||
static void openWithPerms(
|
||||
std::ofstream &f,
|
||||
pipedal::ofstream_synced &f,
|
||||
const std::filesystem::path &path,
|
||||
std::filesystem::perms perms =
|
||||
std::filesystem::perms::owner_read | std::filesystem::perms::owner_write |
|
||||
@@ -221,7 +222,7 @@ void P2pSettings::Save()
|
||||
{
|
||||
auto filename = config_filename();
|
||||
try {
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
openWithPerms(f,filename);
|
||||
|
||||
if (!f.is_open())
|
||||
|
||||
@@ -41,6 +41,7 @@ message(STATUS "NMPIPEDAL CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
|
||||
|
||||
# Use the sdbus-c++ target in SDBusCpp namespace
|
||||
add_library(PiPedalCommon STATIC
|
||||
ofstream_synced.cpp include/ofstream_synced.hpp
|
||||
ConfigSerializer.cpp include/ConfigSerializer.hpp
|
||||
WifiRegs.cpp include/WifiRegs.hpp
|
||||
WifiRegulations.cpp include/WifiRegulations.hpp
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <tuple>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
|
||||
@@ -65,7 +66,7 @@ void ServiceConfiguration::Save()
|
||||
std::filesystem::create_directories(directory);
|
||||
|
||||
// make sure the file has correct permissions.
|
||||
std::ofstream t;
|
||||
pipedal::ofstream_synced t;
|
||||
t.open(filename);
|
||||
t.close();
|
||||
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "WriteTemplateFile.hpp"
|
||||
#include <fstream>
|
||||
#include <stdexcept>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
|
||||
@@ -37,7 +38,7 @@ void pipedal::WriteTemplateFile(
|
||||
const std::filesystem::path &inputFile,
|
||||
const std::filesystem::path &outputFile)
|
||||
{
|
||||
std::ofstream out(outputFile);
|
||||
pipedal::ofstream_synced out(outputFile);
|
||||
std::ifstream in(inputFile);
|
||||
|
||||
if (!in.is_open())
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include "autoptr_vector.h"
|
||||
#include <unordered_map>
|
||||
#include <fstream>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
namespace config_serializer
|
||||
{
|
||||
@@ -256,7 +257,7 @@ namespace config_serializer
|
||||
}
|
||||
void Save(const std::string &path)
|
||||
{
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
f.open(path);
|
||||
if (!f.is_open())
|
||||
{
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fstream>
|
||||
|
||||
namespace pipedal
|
||||
{
|
||||
void FileSystemSync();
|
||||
|
||||
class ofstream_synced : public std::ofstream
|
||||
{
|
||||
public:
|
||||
ofstream_synced() {}
|
||||
|
||||
explicit ofstream_synced(const std::string &filename, ios_base::openmode mode = ios_base::out)
|
||||
: std::ofstream(filename, mode)
|
||||
{
|
||||
}
|
||||
explicit ofstream_synced(const char *filename, ios_base::openmode mode = ios_base::out)
|
||||
: std::ofstream(filename, mode)
|
||||
{
|
||||
}
|
||||
~ofstream_synced();
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
#include "ofstream_synced.hpp"
|
||||
#include "unistd.h"
|
||||
|
||||
using namespace pipedal;
|
||||
|
||||
|
||||
void pipedal::FileSystemSync()
|
||||
{
|
||||
::sync();
|
||||
}
|
||||
|
||||
ofstream_synced::~ofstream_synced()
|
||||
{
|
||||
if (is_open())
|
||||
{
|
||||
close();
|
||||
::sync();
|
||||
}
|
||||
}
|
||||
@@ -6,13 +6,13 @@
|
||||
<a href="https://rerdavies.github.io/pipedal/LicensePiPedal.html"><img src="https://img.shields.io/badge/MIT-MIT?label=license&color=%23808080"/></a>
|
||||
<a href="https://github.com/rerdavies/pipedal/actions"><img src="https://img.shields.io/github/actions/workflow/status/rerdavies/pipedal/cmake.yml?branch=main"/></a>
|
||||
|
||||
Download: <a href='https://rerdavies.github.io/pipedal/download.html'>v1.2.45</a>
|
||||
Download: <a href='https://rerdavies.github.io/pipedal/download.html'>v1.2.46</a>
|
||||
Website: [https://rerdavies.github.io/pipedal](https://rerdavies.github.io/pipedal).
|
||||
Documentation: [https://rerdavies.github.io/pipedal/Documentation.html](https://rerdavies.github.io/pipedal/Documentation.html).
|
||||
|
||||
|
||||
|
||||
#### NEW version 1.2.45 Release, providing support for Raspberry Pi OS Bookworm. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.
|
||||
#### NEW version 1.2.46 Release, providing support for Raspberry Pi OS Bookworm. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.
|
||||
|
||||
|
||||
|
||||
|
||||
+3
-3
@@ -13,17 +13,17 @@ page_icon: img/Install4.jpg
|
||||
|
||||
Download the most recent Debian (.deb) package for your platform:
|
||||
|
||||
- [Raspberry Pi OS bookworm (64-bit) v1.2.45](https://github.com/rerdavies/pipedal/releases/download/)
|
||||
- [Raspberry Pi OS bookworm (64-bit) v1.2.46](https://github.com/rerdavies/pipedal/releases/download/)
|
||||
- [Ubuntu/Raspberry Pi OS bullseyeye (64-bit) v1.2.31](https://github.com/rerdavies/pipedal/releases/download/v1.1.31/pipedal_1.1.31_arm64.deb)
|
||||
|
||||
Version 1.2.45 has not yet been tested on Ubuntu or Raspberry Pi OS bullseye. On these platforms, we recommend that you use version 1.1.31.
|
||||
Version 1.2.46 has not yet been tested on Ubuntu or Raspberry Pi OS bullseye. On these platforms, we recommend that you use version 1.1.31.
|
||||
|
||||
Install the package by running
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
cd ~/Downloads
|
||||
sudo apt-get install pipedal_1.2.45_arm64.deb
|
||||
sudo apt-get install pipedal_1.2.46_arm64.deb
|
||||
```
|
||||
Adjust accordingly if you have downloaded v1.1.31.
|
||||
|
||||
|
||||
+3
-3
@@ -4,17 +4,17 @@
|
||||
|
||||
Download the most recent Debian (.deb) package for your platform:
|
||||
|
||||
- <a href="https://github.com/rerdavies/pipedal/releases/download/v1.2.45/pipedal_1.2.45_arm64.deb">Raspberry Pi OS Bookworm (64-bit) v1.2.45</a>
|
||||
- <a href="https://github.com/rerdavies/pipedal/releases/download/v1.2.46/pipedal_1.2.46_arm64.deb">Raspberry Pi OS Bookworm (64-bit) v1.2.46</a>
|
||||
- <a href="https://github.com/rerdavies/pipedal/releases/download/v1.1.31/pipedal_1.1.31_arm64.deb">Ubuntu 21.04 or Raspberry Pi OS bullseyeyeye (64-bit) v1.1.31</a>
|
||||
|
||||
v1.2.45 is does not currently support Ubuntu 21.04, or older versions of Raspberry Pi OS.
|
||||
v1.2.46 is does not currently support Ubuntu 21.04, or older versions of Raspberry Pi OS.
|
||||
|
||||
Install the package by running
|
||||
|
||||
```
|
||||
sudo apt update
|
||||
cd ~/Downloads
|
||||
sudo apt-get install ./pipedal_1.2.45_arm64.deb
|
||||
sudo apt-get install ./pipedal_1.2.46_arm64.deb
|
||||
```
|
||||
|
||||
Follow the instructions in [_Configuring PiPedal After Installation_](https://rerdavies.github.io/pipedal/Configuring.html) to complete the installation.
|
||||
|
||||
+2
-2
@@ -1,7 +1,7 @@
|
||||
|
||||
|
||||
<img src="GithubBanner.png" width="100%"/>
|
||||
<a href="Installing.html"><i>v1.2.45</i></a>
|
||||
<a href="Installing.html"><i>v1.2.46</i></a>
|
||||
|
||||
|
||||
|
||||
@@ -9,7 +9,7 @@ To download PiPedal, click [here](download.md).
|
||||
To view PiPedal documentation, click [here](Documentation.md).
|
||||
|
||||
|
||||
#### NEW version 1.2.45 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.
|
||||
#### NEW version 1.2.46 Release. See the [release notes](https://rerdavies.github.io/pipedal/ReleaseNotes) for details.
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -40,6 +40,8 @@
|
||||
#include "WifiChannelSelectors.hpp"
|
||||
#include "PiPedalConfiguration.hpp"
|
||||
#include <grp.h>
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
|
||||
#if JACK_HOST
|
||||
#define INSTALL_JACK_SERVICE 1
|
||||
@@ -1346,10 +1348,12 @@ int main(int argc, char **argv)
|
||||
portOption = "0.0.0.0:" + portOption;
|
||||
}
|
||||
Install(prefix, portOption);
|
||||
FileSystemSync();
|
||||
}
|
||||
else if (uninstall)
|
||||
{
|
||||
Uninstall();
|
||||
FileSystemSync();
|
||||
}
|
||||
else if (stop)
|
||||
{
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <string.h>
|
||||
#include <stdexcept>
|
||||
#include "util.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
using namespace pipedal::implementation;
|
||||
@@ -101,7 +102,7 @@ FileBrowserFilesFeature::FileBrowserFilesFeature()
|
||||
}
|
||||
void BrowserFilesVersionInfo::Save(std::filesystem::path &path)
|
||||
{
|
||||
std::ofstream f{path};
|
||||
pipedal::ofstream_synced f{path};
|
||||
if (!f.is_open())
|
||||
return;
|
||||
f << version << std::endl;
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
#include "SystemConfigFile.hpp"
|
||||
#include "SysExec.hpp"
|
||||
#include "WriteTemplateFile.hpp"
|
||||
#include <unistd.h>
|
||||
|
||||
using namespace pipedal;
|
||||
using namespace std;
|
||||
@@ -473,6 +474,7 @@ void pipedal::SetWifiConfig(const WifiConfigSettings &settings)
|
||||
sysExec(SYSTEMCTL_BIN " restart dnsmasq");
|
||||
sysExec(SYSTEMCTL_BIN " enable dnsmasq");
|
||||
}
|
||||
::sync();
|
||||
}
|
||||
|
||||
/*********************************************************************************
|
||||
@@ -563,6 +565,7 @@ void UninstallP2p()
|
||||
SetWifiDirectConfig(wifiDirectConfigSettings);
|
||||
|
||||
}
|
||||
::sync();
|
||||
}
|
||||
|
||||
static void RemoveDhcpcdConfig()
|
||||
@@ -679,6 +682,7 @@ void pipedal::SetWifiDirectConfig(const WifiDirectConfigSettings &settings)
|
||||
{
|
||||
cout << e.what() << endl;
|
||||
}
|
||||
::sync();
|
||||
}
|
||||
void pipedal::OnWifiReinstall() {
|
||||
WifiDirectConfigSettings settings;
|
||||
@@ -686,6 +690,7 @@ void pipedal::OnWifiReinstall() {
|
||||
if (settings.enable_)
|
||||
{
|
||||
SetWifiDirectConfig(settings);
|
||||
::sync();
|
||||
}
|
||||
}
|
||||
void pipedal::OnWifiUninstall(bool preserveState)
|
||||
@@ -707,6 +712,7 @@ void pipedal::OnWifiUninstall(bool preserveState)
|
||||
settings.Save();
|
||||
}
|
||||
}
|
||||
::sync();
|
||||
}
|
||||
void pipedal::OnWifiInstallComplete()
|
||||
{
|
||||
|
||||
+14
-13
@@ -31,6 +31,7 @@
|
||||
#include "PiPedalUI.hpp"
|
||||
#include "PluginHost.hpp"
|
||||
#include "ss.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
|
||||
@@ -344,7 +345,7 @@ void Storage::SavePluginPresetIndex()
|
||||
if (pluginPresetIndexChanged)
|
||||
{
|
||||
pluginPresetIndexChanged = false;
|
||||
std::ofstream os;
|
||||
pipedal::ofstream_synced os;
|
||||
auto path = GetPluginPresetsDirectory() / "index.json";
|
||||
os.open(path, std::ios_base::trunc);
|
||||
if (os.fail())
|
||||
@@ -359,7 +360,7 @@ void Storage::SavePluginPresetIndex()
|
||||
|
||||
void Storage::SaveBankIndex()
|
||||
{
|
||||
std::ofstream os;
|
||||
pipedal::ofstream_synced os;
|
||||
os.open(GetIndexFileName(), std::ios_base::trunc);
|
||||
json_writer writer(os, false);
|
||||
writer.write(this->bankIndex);
|
||||
@@ -434,7 +435,7 @@ void Storage::SaveBankFile(const std::string &name, const BankFile &bankFile)
|
||||
}
|
||||
try
|
||||
{
|
||||
std::ofstream s;
|
||||
pipedal::ofstream_synced s;
|
||||
s.open(fileName, std::ios_base::trunc);
|
||||
json_writer writer(s, false);
|
||||
writer.write(bankFile);
|
||||
@@ -721,7 +722,7 @@ void Storage::SaveChannelSelection()
|
||||
auto fileName = this->GetChannelSelectionFileName();
|
||||
try
|
||||
{
|
||||
std::ofstream s(fileName);
|
||||
pipedal::ofstream_synced s(fileName);
|
||||
json_writer writer(s, false);
|
||||
writer.write(this->jackChannelSelection);
|
||||
}
|
||||
@@ -906,7 +907,7 @@ int64_t Storage::UploadBank(BankFile &bankFile, int64_t uploadAfter)
|
||||
bankFile.name(s.str());
|
||||
}
|
||||
std::filesystem::path path = this->GetBankFileName(bankFile.name());
|
||||
std::ofstream f(path);
|
||||
pipedal::ofstream_synced f(path);
|
||||
if (!f.is_open())
|
||||
{
|
||||
throw PiPedalException("Can't write to bank file.");
|
||||
@@ -928,7 +929,7 @@ void Storage::SaveUserSettings()
|
||||
{
|
||||
std::filesystem::path path = this->dataRoot / USER_SETTINGS_FILENAME;
|
||||
{
|
||||
std::ofstream f(path);
|
||||
pipedal::ofstream_synced f(path);
|
||||
if (!f.is_open())
|
||||
{
|
||||
throw PiPedalException("Unable to write to " + ((std::string)path));
|
||||
@@ -964,7 +965,7 @@ void Storage::SetWifiConfigSettings(const WifiConfigSettings &wifiConfigSettings
|
||||
|
||||
std::filesystem::path path = this->dataRoot / WIFI_CONFIG_SETTINGS_FILENAME;
|
||||
{
|
||||
std::ofstream f(path);
|
||||
pipedal::ofstream_synced f(path);
|
||||
if (!f.is_open())
|
||||
{
|
||||
throw PiPedalException("Unable to write to " + ((std::string)path));
|
||||
@@ -1077,7 +1078,7 @@ void Storage::SaveCurrentPreset(const CurrentPreset ¤tPreset)
|
||||
{
|
||||
std::filesystem::path path = GetCurrentPresetPath();
|
||||
|
||||
std::ofstream f(path);
|
||||
pipedal::ofstream_synced f(path);
|
||||
json_writer writer(f, false);
|
||||
writer.write(currentPreset);
|
||||
}
|
||||
@@ -1152,7 +1153,7 @@ void Storage::SavePluginPresets(const std::string &pluginUri, const PluginPreset
|
||||
}
|
||||
auto tempPath = path.string() + ".$$$";
|
||||
{
|
||||
std::ofstream os;
|
||||
pipedal::ofstream_synced os;
|
||||
os.open(tempPath, std::ios_base::trunc);
|
||||
if (os.fail())
|
||||
{
|
||||
@@ -1396,7 +1397,7 @@ std::map<std::string, bool> Storage::GetFavorites() const
|
||||
void Storage::SetFavorites(const std::map<std::string, bool> &favorites)
|
||||
{
|
||||
std::filesystem::path fileName = this->dataRoot / "favorites.json";
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
f.open(fileName);
|
||||
if (f.is_open())
|
||||
{
|
||||
@@ -1425,7 +1426,7 @@ pipedal::JackServerSettings Storage::GetJackServerSettings()
|
||||
void Storage::SetJackServerSettings(const pipedal::JackServerSettings &jackConfiguration)
|
||||
{
|
||||
std::filesystem::path fileName = this->dataRoot / "AudioConfig.json";
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
f.open(fileName);
|
||||
if (f.is_open())
|
||||
{
|
||||
@@ -1440,7 +1441,7 @@ void Storage::SetJackServerSettings(const pipedal::JackServerSettings &jackConfi
|
||||
void Storage::SetSystemMidiBindings(const std::vector<MidiBinding> &bindings)
|
||||
{
|
||||
std::filesystem::path fileName = this->dataRoot / "SystemMidiBindings.json";
|
||||
std::ofstream f;
|
||||
pipedal::ofstream_synced f;
|
||||
f.open(fileName);
|
||||
if (f.is_open())
|
||||
{
|
||||
@@ -1714,7 +1715,7 @@ std::string Storage::UploadUserFile(const std::string &directory, const std::str
|
||||
try {
|
||||
std::filesystem::create_directories(path.parent_path());
|
||||
|
||||
std::ofstream f(path, std::ios_base::trunc | std::ios_base::binary);
|
||||
pipedal::ofstream_synced f(path, std::ios_base::trunc | std::ios_base::binary);
|
||||
if (!f.is_open())
|
||||
{
|
||||
throw std::logic_error(SS("Can't create file " << path << "."));
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include <fstream>
|
||||
#include "Lv2Log.hpp"
|
||||
#include "ss.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
|
||||
|
||||
@@ -40,7 +41,7 @@ void UpdateResults::Load()
|
||||
}
|
||||
void UpdateResults::Save()
|
||||
{
|
||||
std::ofstream f {UPDATE_RESULT_PATH};
|
||||
pipedal::ofstream_synced f {UPDATE_RESULT_PATH};
|
||||
if (f.is_open())
|
||||
{
|
||||
json_writer writer(f);
|
||||
|
||||
+2
-1
@@ -34,6 +34,7 @@
|
||||
#include <algorithm>
|
||||
#include "UpdaterSecurity.hpp"
|
||||
#include "SysExec.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
using namespace pipedal;
|
||||
namespace fs = std::filesystem;
|
||||
@@ -88,7 +89,7 @@ static void SetCachedUpdateStatus(UpdateStatus &updateStatus)
|
||||
updateStatus.LastUpdateTime(std::chrono::system_clock::now());
|
||||
try
|
||||
{
|
||||
std::ofstream f{UPDATE_STATUS_CACHE_FILE};
|
||||
pipedal::ofstream_synced f{UPDATE_STATUS_CACHE_FILE};
|
||||
json_writer writer{f};
|
||||
writer.write(updateStatus);
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <strings.h>
|
||||
#include "Ipv6Helpers.hpp"
|
||||
#include "util.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
#include "WebServer.hpp"
|
||||
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <memory>
|
||||
#include "ZipFile.hpp"
|
||||
#include "PiPedalUI.hpp"
|
||||
#include "ofstream_synced.hpp"
|
||||
|
||||
|
||||
#define PRESET_EXTENSION ".piPreset"
|
||||
@@ -439,6 +440,7 @@ public:
|
||||
Lv2Log::error(SS("Unzip failed. " << e.what()));
|
||||
throw;
|
||||
}
|
||||
FileSystemSync();
|
||||
|
||||
} else {
|
||||
outputFileName = this->model->UploadUserFile(directory,patchProperty,filename,req.get_body_input_stream(), req.content_length());
|
||||
|
||||
Reference in New Issue
Block a user