fix(watchdog): wd_vol_save 不再 O_TRUNC 毁 settings.conf(改读改写单键+去重,与SDK同款语义) — 真机实证整文件被抹/重复行/丢max+step。test_wd_fw 17/17 PASS; 52f2dadd 已热更 /usr/data/meow_watchdog

This commit is contained in:
MeowOS committed 2026-09-01 10:25:18 +08:00
1 parent 56c569f3a9
commit 104bfe2d21
4 files changed
+30 -9

No files matched your search

Binary file not shown.
+29 -8
View File
@@ -367,17 +367,38 @@ static void wd_vol_write(int pct)
wd_log("DAC vol -> L/R=%d (pct %d)", dac, pct);
}
/* M2.92+ 修复(真机实证 settings.conf 被毁):旧版 O_TRUNC 整文件重写只剩 4 行 ——
* 抹掉全部其它设置;与其它写者交错还叠出重复 audio.volume 行、丢 volume_max/step。
* 改为读改写单键(流式拷贝、命中行全部改写去重、缺失末尾追加、rename 原子替换),
* 与 SDK meow_ui_vol_set 同款语义。 */
static void wd_vol_save(void)
{
system("mkdir -p /usr/data/meow 2>/dev/null");
int fd = open(MEOW_SETTINGS_FILE, O_WRONLY | O_CREAT | O_TRUNC, 0644);
if (fd < 0) { wd_log("vol: open %s fail: %s", MEOW_SETTINGS_FILE, strerror(errno)); return; }
char buf[128];
int l = snprintf(buf, sizeof buf,
"# meow-settings 1\naudio.volume = %d\naudio.volume_max = %d\naudio.volume_step = %d\n",
wd_vol, wd_vol_max, wd_vol_step);
if (write(fd, buf, l) < 0) wd_log("vol: write fail: %s", strerror(errno));
close(fd);
const char *path = MEOW_SETTINGS_FILE;
char tmp[300];
snprintf(tmp, sizeof tmp, "%s.tmp", path);
FILE *in = fopen(path, "r");
FILE *out = fopen(tmp, "w");
if (!out) { if (in) fclose(in); wd_log("vol: save open tmp fail"); return; }
int found = 0;
char line[256];
while (in && fgets(line, sizeof line, in)) {
char *eq = strchr(line, '=');
char *k = line;
while (*k == ' ' || *k == '\t') k++;
int n = eq ? (int)(eq - k) : 0;
while (n > 0 && (k[n-1] == ' ' || k[n-1] == '\t')) n--;
if (eq && n == 12 && strncmp(k, "audio.volume", 12) == 0) {
if (!found) fprintf(out, "audio.volume = %d\n", wd_vol); /* 命中:只写一次(去重) */
found = 1;
} else {
fputs(line, out);
}
}
if (in) fclose(in);
if (!found) fprintf(out, "audio.volume = %d\n", wd_vol);
fclose(out);
if (rename(tmp, path) != 0) { remove(tmp); wd_log("vol: save rename fail"); return; }
wd_log("vol: saved volume=%d(max=%d,step=%d)", wd_vol, wd_vol_max, wd_vol_step);
}
Binary file not shown.
+1 -1
View File
@@ -29,7 +29,7 @@
# ---- 用户态/服务守护二进制(usr/bin,全部 chmod 755 静态 MIPS)----
patch_v2/bootmenu/meow_bootmenu|/usr/bin/meow_bootmenu|4441822d87e76bfce2ce584604ac3830|引导选单 M2.85(sysui让位 agent-216)
patch_v2/meow_launcherd/meow_launcherd|/usr/bin/meow_launcherd|6de9762881245a57f547d53102e996be|主屏 launcher M2.92(NP页死循环/电源键/自动息屏修复+充电闪电图标+255插孔消抖并入)
patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|baa997ea9100b04e1cc96e25c16f7e4b|应用看门狗(插孔消抖:插拔瞬态忽略音量键 800ms;M2.89 SIGUSR1 仅裸沉浸 App)
patch_v2/meow_watchdog/meow_watchdog|/usr/bin/meow_watchdog|52f2dadd6e14a571bb60f48582a2ba66|应用看门狗 M2.93(+wd_vol_save 不再 O_TRUNC 毁设置文件, 改读改写单键去重)
patch_v2/meow_svcd/meow_svcd|/usr/bin/meow_svcd|605646c4cc93f2baf29071ea6bc870ea|服务管理器 M2.77(+崩溃上报 meow_crash agent-187)
mips-repo/bins/meow_mdns/bin/meow_mdns|/usr/bin/meow_mdns|d6b0151bda26768f19952dae1342610d|mDNS 应答器 M2.78(启动竞态+换IP重检 agent-194)
patch_v2/meow_sysui/meow_sysui|/usr/bin/meow_sysui|173013cc8f0899b3001d0b894ac0d9e6|系统 UI(sysui)