From 73beb3591369d4931229fffb73bb0176ec1452b4 Mon Sep 17 00:00:00 2001 From: KubaPro010 Date: Wed, 24 Dec 2025 12:08:02 +0100 Subject: [PATCH] atomic save --- plugin.lua | 2 +- src/fs.c | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/plugin.lua b/plugin.lua index 3d65f60..f23c9ad 100644 --- a/plugin.lua +++ b/plugin.lua @@ -14,7 +14,7 @@ data = "" -- Set during run_lua calls ---@return nil function set_rds_program_defaults() end ----Saves, loads and resets the state of the data +---Saves, loads and resets the state of the data, you might as well restart the whole program ---@return nil function reset_rds() end diff --git a/src/fs.c b/src/fs.c index 0fc932b..8b1363e 100644 --- a/src/fs.c +++ b/src/fs.c @@ -2,7 +2,9 @@ void encoder_saveToFile(RDSEncoder *enc) { char encoderPath[128]; + char encoderPath_tmp[128]; snprintf(encoderPath, sizeof(encoderPath), "%s/.rdsEncoder", getenv("HOME")); + snprintf(encoderPath_tmp, sizeof(encoderPath_tmp), "%s/.rdsEncoder.tmp", getenv("HOME")); RDSEncoder tempEncoder; FILE *file = fopen(encoderPath, "rb"); @@ -17,19 +19,20 @@ void encoder_saveToFile(RDSEncoder *enc) { tempEncoder.program = enc->program; RDSEncoderFile rdsEncoderfile = {.file_starter = 225, .file_middle = 160, .file_ender = 95, .program = tempEncoder.program}; - memcpy(&rdsEncoderfile.data[enc->program], &tempEncoder.data[enc->program], sizeof(RDSData)); - memcpy(&rdsEncoderfile.rtpData[enc->program], &tempEncoder.rtpData[enc->program], sizeof(RDSRTPlusData) * 2); + memcpy(&rdsEncoderfile.data, &tempEncoder.data, sizeof(RDSData)*PROGRAMS); + memcpy(&rdsEncoderfile.rtpData, &tempEncoder.rtpData, sizeof(RDSRTPlusData) * 2 * PROGRAMS); memcpy(&rdsEncoderfile.encoder_data, &tempEncoder.encoder_data, sizeof(RDSEncoderData)); rdsEncoderfile.crc = crc16_ccitt((char *)&rdsEncoderfile, offsetof(RDSEncoderFile, crc)); - file = fopen(encoderPath, "wb"); + file = fopen(encoderPath_tmp, "wb"); if (!file) { perror("Error opening file"); return; } fwrite(&rdsEncoderfile, sizeof(RDSEncoderFile), 1, file); fclose(file); + rename(encoderPath_tmp, encoderPath); } int encoder_loadFromFile(RDSEncoder *enc) { @@ -55,10 +58,8 @@ int encoder_loadFromFile(RDSEncoder *enc) { return 1; } - for (int i = 0; i < PROGRAMS; i++) { - memcpy(&(enc->data[i]), &(rdsEncoderfile.data[i]), sizeof(RDSData)); - memcpy(&(enc->rtpData[i]), &(rdsEncoderfile.rtpData[i]), sizeof(RDSRTPlusData)*2); - } + memcpy(&(enc->data), &(rdsEncoderfile.data), sizeof(RDSData)*PROGRAMS); + memcpy(&(enc->rtpData), &(rdsEncoderfile.rtpData), sizeof(RDSRTPlusData)*2*PROGRAMS); memcpy(&(enc->encoder_data), &(rdsEncoderfile.encoder_data), sizeof(RDSEncoderData)); enc->program = rdsEncoderfile.program; return 0;