Monorepo for Aesthetic.Computer aesthetic.computer
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

Harden native USB flash helper

+76 -12
+7 -7
fedac/native/ac-os
··· 678 678 if [ ! -b "${dev_node}" ]; then 679 679 local majmin 680 680 majmin=$(cat "/sys/block/${dev}/dev" 2>/dev/null || true) 681 - if [ -z "${majmin}" ]; then 682 - err "USB sysfs node exists but major:minor is missing for ${dev}" 683 - return 1 684 - fi 685 - log "Repairing ${dev_node} as block device ${majmin}" 686 - sudo rm -f "${dev_node}" 687 - sudo mknod "${dev_node}" b "${majmin%%:*}" "${majmin##*:}" 681 + if [ -z "${majmin}" ]; then 682 + err "USB sysfs node exists but major:minor is missing for ${dev}" 683 + return 1 688 684 fi 685 + log "Repairing ${dev_node} as block device ${majmin}" >&2 686 + sudo rm -f "${dev_node}" 687 + sudo mknod "${dev_node}" b "${majmin%%:*}" "${majmin##*:}" 688 + fi 689 689 if [ -b "${dev_node}" ]; then 690 690 echo "${dev_node}" 691 691 return 0
+69 -5
fedac/native/scripts/flash-helper-runner.sh
··· 51 51 return 1 52 52 } 53 53 54 + ensure_partition_node() { 55 + local part="$1" 56 + local base 57 + local majmin 58 + 59 + [ -b "${part}" ] && return 0 60 + 61 + base="$(basename "${part}")" 62 + majmin="$(cat "/sys/class/block/${base}/dev" 2>/dev/null || true)" 63 + if [ -z "${majmin}" ]; then 64 + err "Missing sysfs entry for ${part}" 65 + return 1 66 + fi 67 + 68 + rm -f "${part}" 69 + mknod "${part}" b "${majmin%%:*}" "${majmin##*:}" 70 + } 71 + 72 + refresh_partition_table() { 73 + blockdev --rereadpt "${USB_DEV}" >/dev/null 2>&1 || true 74 + partx -u "${USB_DEV}" >/dev/null 2>&1 || true 75 + } 76 + 77 + wait_for_partition_ready() { 78 + local part="$1" 79 + local attempt 80 + 81 + for attempt in $(seq 1 20); do 82 + ensure_partition_node "${part}" || true 83 + if dd if="${part}" of=/dev/null bs=512 count=1 status=none 2>/dev/null; then 84 + return 0 85 + fi 86 + refresh_partition_table 87 + sleep 0.5 88 + done 89 + 90 + err "Partition stayed busy: ${part}" 91 + return 1 92 + } 93 + 94 + retry_partition_cmd() { 95 + local desc="$1" 96 + shift 97 + local attempt 98 + local rc=0 99 + 100 + for attempt in $(seq 1 10); do 101 + if "$@"; then 102 + return 0 103 + else 104 + rc=$? 105 + fi 106 + err "${desc} failed (attempt ${attempt}/10, rc=${rc})" 107 + refresh_partition_table 108 + sleep 1 109 + done 110 + 111 + err "${desc} failed after retries" 112 + return "${rc}" 113 + } 114 + 54 115 cleanup() { 55 116 umount /mnt/ac-main 2>/dev/null || true 56 117 umount /mnt/ac-efi 2>/dev/null || true ··· 261 322 size=${MAC_MB}M, type=48465300-0000-11AA-AA11-00306543ECAC, name="AC-MAC" 262 323 PART_EOF 263 324 264 - partprobe "${USB_DEV}" 2>/dev/null || true 325 + refresh_partition_table 265 326 sleep 2 266 327 267 328 wait_for_partition "${MAIN_PART}" 268 329 wait_for_partition "${EFI_PART}" 269 330 wait_for_partition "${MAC_PART}" 331 + wait_for_partition_ready "${MAIN_PART}" 332 + wait_for_partition_ready "${EFI_PART}" 333 + wait_for_partition_ready "${MAC_PART}" 270 334 271 - mkfs.vfat -F 32 -n ACBOOT "${MAIN_PART}" >/dev/null 272 - mkfs.vfat -F 32 -n ACEFI "${EFI_PART}" >/dev/null 273 - mkfs.hfsplus -v AC-MAC "${MAC_PART}" >/dev/null 335 + retry_partition_cmd "mkfs ACBOOT" mkfs.vfat -F 32 -n ACBOOT "${MAIN_PART}" >/dev/null 336 + retry_partition_cmd "mkfs ACEFI" mkfs.vfat -F 32 -n ACEFI "${EFI_PART}" >/dev/null 337 + retry_partition_cmd "mkfs AC-MAC" mkfs.hfsplus -v AC-MAC "${MAC_PART}" >/dev/null 274 338 275 339 # Do NOT create a hybrid MBR — old Intel Macs expect standard GPT protective 276 340 # MBR (single 0xEE entry). Hybrid MBR confuses Mac firmware discovery. 277 341 # Set legacy_boot attribute on main partition for BIOS fallback only. 278 342 sgdisk --attributes=1:set:62 "${USB_DEV}" >/dev/null 2>&1 || true 279 - partprobe "${USB_DEV}" 2>/dev/null || true 343 + refresh_partition_table 280 344 281 345 # Partition 1 (ACBOOT): full kernel as BOOTX64.EFI (standard UEFI fallback path) 282 346 # This works on all PC firmware (ThinkPads, Yoga, etc.) without splash or systemd-boot.