diff --git a/patch_v2/meow_watchdog/meow_watchdog b/patch_v2/meow_watchdog/meow_watchdog index 96566b5..54a00b6 100755 Binary files a/patch_v2/meow_watchdog/meow_watchdog and b/patch_v2/meow_watchdog/meow_watchdog differ diff --git a/patch_v2/meow_watchdog/meow_watchdog.c b/patch_v2/meow_watchdog/meow_watchdog.c index d2a1b57..104bc49 100644 --- a/patch_v2/meow_watchdog/meow_watchdog.c +++ b/patch_v2/meow_watchdog/meow_watchdog.c @@ -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); } diff --git a/patch_v2/meow_watchdog/test_wd_fw b/patch_v2/meow_watchdog/test_wd_fw index 30b1939..4da5ce5 100755 Binary files a/patch_v2/meow_watchdog/test_wd_fw and b/patch_v2/meow_watchdog/test_wd_fw differ diff --git a/scripts/build/fw_content.conf b/scripts/build/fw_content.conf index 904b1aa..fb9360b 100644 --- a/scripts/build/fw_content.conf +++ b/scripts/build/fw_content.conf @@ -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)