mirror of
https://git.openwrt.org/openwrt/openwrt.git
synced 2025-12-10 08:44:39 +01:00
base-files: board_detect: make resilient against power-cuts
If board_detect is interrupted by cutting power on first boot, board.json might only be half-way written and the file will not be written again correctly on subsequent boots. Write to a temporary file first, then rename. Since a rename on the same file system is an atomic operation, it ensures that either /etc/board.json does not exist or that the complete file exists. Signed-off-by: Andreas Gnau <andreas.gnau@iopsys.eu> Link: https://github.com/openwrt/openwrt/pull/20831 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
This commit is contained in:
parent
cac609aca8
commit
26ba9b609b
1 changed files with 12 additions and 4 deletions
|
|
@ -1,14 +1,22 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
CFG=$1
|
REAL_CFG=$1
|
||||||
|
|
||||||
[ -n "$CFG" ] || CFG=/etc/board.json
|
[ -n "$REAL_CFG" ] || REAL_CFG=/etc/board.json
|
||||||
|
|
||||||
if [ -d "/etc/board.d/" ] && [ ! -s "$CFG" ]; then
|
if [ -d "/etc/board.d/" ] && [ ! -s "$REAL_CFG" ]; then
|
||||||
|
# Use temp file to prevent incomplete file on power-cut, CFG is used by the sourced script to read/write the file
|
||||||
|
CFG="$(dirname "$REAL_CFG")/.$(basename "$REAL_CFG").tmp"
|
||||||
|
rm -f "$CFG" || exit
|
||||||
for a in $(ls /etc/board.d/*); do
|
for a in $(ls /etc/board.d/*); do
|
||||||
[ -s "$a" ] || continue
|
[ -s "$a" ] || continue
|
||||||
(. "$a")
|
(. "$a")
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -s "$CFG" ] || return 1
|
if [ -s "$CFG" ]; then
|
||||||
|
mv "$CFG" "$REAL_CFG" || exit
|
||||||
|
else
|
||||||
|
rm -f "$CFG"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue