ASR_BASE

Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/package/system/fstools/Makefile b/package/system/fstools/Makefile
new file mode 100644
index 0000000..b5ab9ba
--- /dev/null
+++ b/package/system/fstools/Makefile
@@ -0,0 +1,141 @@
+#
+# Copyright (C) 2014-2015 OpenWrt.org
+#
+# This is free software, licensed under the GNU General Public License v2.
+# See /LICENSE for more information.
+#
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=fstools
+PKG_RELEASE:=1
+
+PKG_SOURCE_PROTO:=git
+PKG_SOURCE_URL=$(PROJECT_GIT)/project/fstools.git
+PKG_MIRROR_HASH:=b03b3109044466c4f75fa5c80838de66b255d37148f63610599b9efd157e9af7
+PKG_SOURCE_DATE:=2024-07-14
+PKG_SOURCE_VERSION:=408c2cc48e6694446c89da7f8121b399063e1067
+CMAKE_INSTALL:=1
+
+PKG_LICENSE:=GPL-2.0
+PKG_LICENSE_FILES:=
+
+PKG_BUILD_FLAGS:=no-mips16
+PKG_FLAGS:=nonshared
+
+PKG_BUILD_DEPENDS := util-linux
+PKG_CONFIG_DEPENDS := CONFIG_NAND_SUPPORT CONFIG_FSTOOLS_UBIFS_EXTROOT
+
+PKG_MAINTAINER:=John Crispin <john@phrozen.org>
+
+include $(INCLUDE_DIR)/package.mk
+include $(INCLUDE_DIR)/cmake.mk
+
+CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_UBIFS_EXTROOT),-DCMAKE_UBIFS_EXTROOT=y)
+CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_OVL_MOUNT_FULL_ACCESS_TIME),-DCMAKE_OVL_MOUNT_FULL_ACCESS_TIME=y)
+CMAKE_OPTIONS += $(if $(CONFIG_FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB),-DCMAKE_OVL_MOUNT_COMPRESS_ZLIB=y)
+
+define Package/fstools
+  SECTION:=base
+  CATEGORY:=Base system
+  DEPENDS:=+ubox +NAND_SUPPORT:ubi-utils
+  TITLE:=OpenWrt filesystem tools
+  MENU:=1
+endef
+
+define Package/fstools/config
+	config FSTOOLS_UBIFS_EXTROOT
+		depends on PACKAGE_fstools
+		depends on NAND_SUPPORT
+		bool "Support extroot functionality with UBIFS"
+		default y
+		help
+			This option makes it possible to use extroot functionality if the root filesystem resides on an UBIFS partition
+
+	config FSTOOLS_OVL_MOUNT_FULL_ACCESS_TIME
+		depends on PACKAGE_fstools
+		bool "Full access time accounting"
+		default n
+		help
+			This option enables the full access time accounting (warning: it will increase the flash writes).
+
+	config FSTOOLS_OVL_MOUNT_COMPRESS_ZLIB
+		depends on PACKAGE_fstools
+		bool "Compress using zlib"
+		default n
+		help
+			This option enables the compression using zlib on the storage device.
+endef
+
+define Package/snapshot-tool
+  SECTION:=base
+  CATEGORY:=Base system
+  TITLE:=rootfs snapshoting tool
+  DEPENDS:=+libubox +fstools
+endef
+
+define Package/block-mount/conffiles
+/etc/config/fstab
+endef
+
+define Package/block-mount
+  SECTION:=base
+  CATEGORY:=Base system
+  TITLE:=Block device mounting and checking
+  DEPENDS:=+ubox +libubox +libuci +libblobmsg-json +libjson-c
+endef
+
+define Package/blockd
+  SECTION:=base
+  CATEGORY:=Base system
+  TITLE:=Block device automounting
+  DEPENDS:=+block-mount +fstools +libubus +kmod-fs-autofs4 +libblobmsg-json +libjson-c
+endef
+
+define Package/fstools/install
+	$(INSTALL_DIR) $(1)/sbin $(1)/lib
+
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/{mount_root,jffs2reset} $(1)/sbin/
+	$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libfstools.so $(1)/lib/
+	$(LN) jffs2reset $(1)/sbin/jffs2mark
+endef
+
+define Package/snapshot-tool/install
+	$(INSTALL_DIR) $(1)/sbin
+
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/snapshot_tool $(1)/sbin/
+	$(INSTALL_BIN) ./files/snapshot $(1)/sbin/
+endef
+
+define Package/block-mount/install
+	$(INSTALL_DIR) $(1)/sbin $(1)/lib $(1)/usr/sbin $(1)/etc/hotplug.d/block $(1)/etc/init.d/ $(1)/etc/uci-defaults/
+
+	$(INSTALL_BIN) ./files/fstab.init $(1)/etc/init.d/fstab
+	$(INSTALL_CONF) ./files/fstab.default $(1)/etc/uci-defaults/10-fstab
+	$(INSTALL_CONF) ./files/mount.hotplug $(1)/etc/hotplug.d/block/10-mount
+	$(INSTALL_CONF) ./files/media-change.hotplug  $(1)/etc/hotplug.d/block/00-media-change
+
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/block $(1)/sbin/
+	$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/lib/libblkid-tiny.so $(1)/lib/
+	$(LN) ../../sbin/block $(1)/usr/sbin/swapon
+	$(LN) ../../sbin/block $(1)/usr/sbin/swapoff
+
+endef
+
+define Package/blockd/install
+	$(INSTALL_DIR) $(1)/sbin $(1)/etc/init.d/
+	$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/blockd $(1)/sbin/
+	$(INSTALL_BIN) ./files/blockd.init $(1)/etc/init.d/blockd
+endef
+
+define Build/InstallDev
+	$(INSTALL_DIR) $(1)/usr/include
+	$(CP) $(PKG_INSTALL_DIR)/usr/include/*.h $(1)/usr/include/
+	$(INSTALL_DIR) $(1)/usr/lib/
+	$(CP) $(PKG_INSTALL_DIR)/usr/lib/libubi-utils.a $(1)/usr/lib/
+endef
+
+$(eval $(call BuildPackage,fstools))
+$(eval $(call BuildPackage,snapshot-tool))
+$(eval $(call BuildPackage,block-mount))
+$(eval $(call BuildPackage,blockd))
diff --git a/package/system/fstools/files/blockd.init b/package/system/fstools/files/blockd.init
new file mode 100755
index 0000000..bdd8bbf
--- /dev/null
+++ b/package/system/fstools/files/blockd.init
@@ -0,0 +1,22 @@
+#!/bin/sh /etc/rc.common
+
+START=80
+
+USE_PROCD=1
+PROG=/sbin/blockd
+
+service_triggers() {
+	procd_add_reload_trigger "fstab"
+}
+
+reload_service() {
+	block autofs start
+}
+
+start_service() {
+	procd_open_instance
+	procd_set_param command "$PROG"
+	procd_set_param watch block
+	procd_set_param respawn
+	procd_close_instance
+}
diff --git a/package/system/fstools/files/fstab.default b/package/system/fstools/files/fstab.default
new file mode 100644
index 0000000..2331e0c
--- /dev/null
+++ b/package/system/fstools/files/fstab.default
@@ -0,0 +1,2 @@
+[ ! -f /etc/config/fstab ] && ( block detect > /etc/config/fstab )
+exit 0
diff --git a/package/system/fstools/files/fstab.init b/package/system/fstools/files/fstab.init
new file mode 100644
index 0000000..03a3993
--- /dev/null
+++ b/package/system/fstools/files/fstab.init
@@ -0,0 +1,22 @@
+#!/bin/sh /etc/rc.common
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2013-2020 OpenWrt.org
+
+START=11
+
+boot() {
+	/sbin/block mount
+}
+
+start() {
+	return 0
+}
+
+restart() {
+	return 0
+}
+
+stop() {
+	/sbin/block umount
+}
diff --git a/package/system/fstools/files/media-change.hotplug b/package/system/fstools/files/media-change.hotplug
new file mode 100644
index 0000000..30fc3d5
--- /dev/null
+++ b/package/system/fstools/files/media-change.hotplug
@@ -0,0 +1,8 @@
+[ -n "$DISK_MEDIA_CHANGE" ] && /sbin/block info
+
+if [ "$ACTION" = "add" -a "$DEVTYPE" = "disk" ]; then
+	case "$DEVNAME" in
+		mtd*) : ;;
+		*) echo 2000 > /sys/block/$DEVNAME/events_poll_msecs ;;
+	esac
+fi
diff --git a/package/system/fstools/files/mount.hotplug b/package/system/fstools/files/mount.hotplug
new file mode 100644
index 0000000..c0efb52
--- /dev/null
+++ b/package/system/fstools/files/mount.hotplug
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+WEBDAV_SD=/www/webdav/sdcard
+if [ -f /tmp/sdcard_mount ]; then
+	[ "$ACTION" = "add" -o "$ACTION" = "remove" ] && /sbin/block hotplug
+
+	if [ "$ACTION" = "add" ]; then
+		echo "$DEVNAME" | grep -q "^mmcblk\|^sd"  && {
+			/sbin/block detect > /etc/config/fstab
+			. /sbin/mrvl_detect_sdcard
+			mkdir -p $WEBDAV_SD
+			mount --bind /sdcard $WEBDAV_SD
+		}
+	elif [ "$ACTION" = "remove" ]; then
+		echo "$DEVNAME" | grep -q "^mmcblk\|^sd"  && {
+			. /sbin/mrvl_detect_sdcard
+			umount $WEBDAV_SD 2>/dev/null
+			rm $WEBDAV_SD/
+		}
+	fi
+else
+	( uci show fstab | grep -q @mount ) && {
+		uci delete fstab.@mount[0]
+		uci commit fstab
+	}
+fi
+
diff --git a/package/system/fstools/files/snapshot b/package/system/fstools/files/snapshot
new file mode 100644
index 0000000..a495e34
--- /dev/null
+++ b/package/system/fstools/files/snapshot
@@ -0,0 +1,113 @@
+#!/bin/sh
+# Copyright (C) 2014 OpenWrt.org
+
+
+do_snapshot_unpack() {
+	echo "- snapshot -"
+	mkdir /tmp/snapshot
+	cd /tmp/snapshot
+	snapshot_tool read
+	block=`ls block*.tar.gz 2> /dev/null`
+	[ -z "$block" ] || for a in $block; do
+		tar xzf $a -C /
+		rm -f $a
+	done
+}
+
+do_config_unpack() {
+	echo "- config -"
+	snapshot_tool config_read
+	[ -f /tmp/config.tar.gz ] && {
+		tar xzf /tmp/config.tar.gz -C /
+		rm -f /tmp/config.tar.gz
+	}
+}
+
+do_snapshot_push() {
+	cd /volatile/upper
+	tar czf /tmp/snapshot.tar.gz *
+	snapshot_tool write
+	reboot
+}
+
+do_config_push() {
+	cd /volatile/upper
+	tar czf /tmp/config.tar.gz *
+	snapshot_tool config_write
+}
+
+do_snapshot_upgrade() {
+	opkg update
+	[ $? -eq 0 ] || exit 1
+
+	opkg list-upgradable
+	[ $? -eq 0 ] || exit 2
+
+	UPDATES=`opkg list-upgradable | cut -d" " -f1`
+	[ -z "${UPDATES}" ] && exit 0
+
+	opkg upgrade ${UPDATES}
+	[ $? -eq 0 ] || exit 3
+
+	do_snapshot_push
+	sleep 5
+	reboot
+	sleep 10
+}
+
+do_convert_jffs2() {
+	snapshot_tool write
+	sleep 2
+	reboot -f
+}
+
+do_convert() {
+	. /lib/functions.sh
+	. /lib/upgrade/common.sh
+
+	cd /overlay/upper
+	tar czf /tmp/snapshot.tar.gz *
+
+	install_bin /sbin/upgraded
+	ubus call system sysupgrade "{
+		\"prefix\": \"$RAM_ROOT\",
+		\"path\": \"\",
+		\"command\": \". /sbin/snapshot; do_convert_jffs2\"
+	}"
+}
+
+[ -n "$(cat /proc/mounts|grep /overlay|grep jffs2)" ] && {
+case $1 in
+convert)
+	do_convert
+	;;
+esac
+}
+
+[ -d /volatile/upper ] && {
+case $1 in
+push)
+	do_snapshot_push
+	;;
+config)
+	do_config_push
+	;;
+upgrade)
+	do_snapshot_upgrade
+	;;
+info)
+	snapshot_tool info
+	;;
+esac
+}
+
+[ "$SNAPSHOT" = "magic" ] && {
+case $1 in
+unpack)
+	do_snapshot_unpack
+	;;
+config_unpack)
+	do_config_unpack
+	;;
+esac
+}
diff --git a/package/system/fstools/patches/020-asr_oem_data_fix.patch b/package/system/fstools/patches/020-asr_oem_data_fix.patch
new file mode 100644
index 0000000..5baeefc
--- /dev/null
+++ b/package/system/fstools/patches/020-asr_oem_data_fix.patch
@@ -0,0 +1,15 @@
+--- a/block.c
++++ b/block.c
+@@ -568,8 +568,10 @@ static int _cache_load(const char *path)
+ 
+ 	for (j = 0; j < gl.gl_pathc; j++) {
+ 		struct probe_info *pr = _probe_path(gl.gl_pathv[j]);
+-		if (pr)
+-			list_add_tail(&pr->list, &devices);
++		if (pr) {
++			if (!pr->label || strcmp(pr->label, "oemdata"))
++				list_add_tail(&pr->list, &devices);
++		}
+ 	}
+ 
+ 	globfree(&gl);
diff --git a/package/system/fstools/patches/030-support-ntfs-auto-mount.patch b/package/system/fstools/patches/030-support-ntfs-auto-mount.patch
new file mode 100644
index 0000000..c132a00
--- /dev/null
+++ b/package/system/fstools/patches/030-support-ntfs-auto-mount.patch
@@ -0,0 +1,14 @@
+--- a/block.c
++++ b/block.c
+@@ -871,7 +871,10 @@ static int exec_mount(const char *source
+ 	int err, status, pfds[2];
+ 	char errmsg[128], cmd[sizeof("/sbin/mount.XXXXXXXXXXXXXXXX\0")];
+ 
+-	snprintf(cmd, sizeof(cmd), "/sbin/mount.%s", fstype);
++	if (!strcmp(fstype, "ntfs"))
++		snprintf(cmd, sizeof(cmd), "/sbin/mount.%s", "ntfs-3g");
++	else
++		snprintf(cmd, sizeof(cmd), "/sbin/mount.%s", fstype);
+ 
+ 	if (stat(cmd, &s) < 0 || !S_ISREG(s.st_mode) || !(s.st_mode & S_IXUSR)) {
+ 		ULOG_ERR("No \"mount.%s\" utility available\n", fstype);
diff --git a/package/system/fstools/patches/040-umount_all_mount_point_of_same_device.patch b/package/system/fstools/patches/040-umount_all_mount_point_of_same_device.patch
new file mode 100644
index 0000000..5b84ead
--- /dev/null
+++ b/package/system/fstools/patches/040-umount_all_mount_point_of_same_device.patch
@@ -0,0 +1,73 @@
+--- a/block.c
++++ b/block.c
+@@ -1203,35 +1203,43 @@ static int umount_device(char *path, int
+ 	char *mp, *devpath;
+ 	int err;
+ 
+-	if (strlen(path) > 5 && !strncmp("/dev/", path, 5)) {
+-		mp = find_mount_point(path);
+-	} else {
+-		devpath = malloc(strlen(path) + 6);
+-		strcpy(devpath, "/dev/");
+-		strcat(devpath, path);
+-		mp = find_mount_point(devpath);
+-		free(devpath);
+-	}
+-
+-	if (!mp)
+-		return -1;
+-	if (!strcmp(mp, "/") && !all) {
++	/*
++	 * Some devices may be mounted multiple times on different
++	 * mount points. Need to umount all to make sure next mount
++	 * successful.
++	 */
++	do{
++		if (strlen(path) > 5 && !strncmp("/dev/", path, 5)) {
++			mp = find_mount_point(path);
++		} else {
++			devpath = malloc(strlen(path) + 6);
++			strcpy(devpath, "/dev/");
++			strcat(devpath, path);
++			mp = find_mount_point(devpath);
++			free(devpath);
++		}
++
++		if (!mp)
++			return -1;
++		if (!strcmp(mp, "/") && !all) {
++			free(mp);
++			return 0;
++		}
++		if (type != TYPE_AUTOFS)
++			blockd_notify("umount", basename(path), NULL, NULL);
++
++		err = umount2(mp, MNT_DETACH);
++		if (err) {
++			ULOG_ERR("unmounting %s (%s) failed (%d) - %m\n", path, mp,
++					errno);
++		} else {
++			ULOG_INFO("unmounted %s (%s)\n", path, mp);
++			rmdir(mp);
++		}
++
+ 		free(mp);
+-		return 0;
+-	}
+-	if (type != TYPE_AUTOFS)
+-		blockd_notify("umount", basename(path), NULL, NULL);
+-
+-	err = umount2(mp, MNT_DETACH);
+-	if (err) {
+-		ULOG_ERR("unmounting %s (%s) failed (%d) - %m\n", path, mp,
+-			 errno);
+-	} else {
+-		ULOG_INFO("unmounted %s (%s)\n", path, mp);
+-		rmdir(mp);
+-	}
++	} while(1);
+ 
+-	free(mp);
+ 	return err;
+ }
+ 
diff --git a/package/system/fstools/patches/050-enable_auto_mount.patch b/package/system/fstools/patches/050-enable_auto_mount.patch
new file mode 100644
index 0000000..cdb8df7
--- /dev/null
+++ b/package/system/fstools/patches/050-enable_auto_mount.patch
@@ -0,0 +1,11 @@
+--- a/block.c
++++ b/block.c
+@@ -730,7 +730,7 @@ static int print_block_uci(struct probe_
+ 		printf("\toption\tuuid\t'%s'\n", pr->uuid);
+ 	else
+ 		printf("\toption\tdevice\t'%s'\n", pr->dev);
+-	printf("\toption\tenabled\t'0'\n\n");
++	printf("\toption\tenabled\t'1'\n\n");
+ 
+ 	return 0;
+ }