123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- #!/bin/sh
- # Uncomment the following line to get debug info
- #set -x
- SELF=${SELF:-$(basename $0)}
- LOCK_FILE=/var/lock/share.lock
- source /usr/local/lib/utils
- source usb_gadget
- # The USB network interface file
- USB_IF=/etc/network/interfaces.d/usb0
- # The USB mass storage backing store file or partition
- BACKING_STORE_FILE=/sys/kernel/config/usb_gadget/FunKey/functions/mass_storage.mmcblk0p3/lun.0/file
- # Unmount a local share
- unmount_share () {
- umount /mnt || die 1 "cannot unmount the backing store partition"
- return 0
- }
- # Mount a share locally
- mount_share () {
- mount | grep -q /dev/mmcblk0p3
- if [ $? -ne 0 ]; then
- # Check if the FAT32 partition has been unmounted cleanly
- fsck.fat -n /dev/mmcblk0p3 2>/dev/null | egrep -q "Dirty bit"
- if [ $? -eq 0 ]; then
- # The FAT32 partition was not cleanly unmounted, try to
- # clean it
- warn "the backing store partition was not properly unmounted"
- #warn "the backing store partition was not properly
- #unmounted, clean it"
- # fsck.fat -a -t -w /dev/loop0 >/dev/null 2>&1
- # if [ $? -gt 1 ]; then
- # die 3 "cannot clean backing store file"
- # fi
- fi
- # Mount the backing store file locally
- mount /mnt/ || die 4 "cannot mount backing store partition"
- fi
- # Create the directory structure if required
- (cd /mnt; mkdir -p "Atari lynx" "Game Boy" "Game Boy Color" "Game Boy Advance" "Game Gear" "Neo Geo Pocket" "NES" "PS1" "Sega Genesis" "Sega Master System" "SNES" "WonderSwan")
- return 0
- }
- # Initialize the backing store if needed and mount it locally
- init_share () {
- if [ -f ${LOCK_FILE} ]; then
- return 0
- fi
- touch ${LOCK_FILE}
- # Initialize the USB gadget
- init_usb_gadget
- # Mount the backing store partition locally
- mount_share
- return 0
- }
- # Stop sharing the backing store partition
- stop_share () {
- # Stop sharing the backing store partition
- echo > $BACKING_STORE_FILE || die 11 "the backing store partition is still mounted on host"
- # 3) Mount the backing store partition locally
- mount_share
- info "stopped sharing the backing store partition"
- return 0
- }
- # Start sharing the backing store partition
- start_share () {
- # 1) Check if the backing store partition is already shared
- cat $BACKING_STORE_FILE | egrep -q ^/dev/mmcblk0p3 && die 12 "the backing store partition is already shared"
- # 2) Check if USB data is connected
- is_usb_data_connected > /dev/null 2>&1 || die 13 "USB sharing impossible, not connected to a host"
- # 3) Unmount the backing store partition if it is locally mounted
- unmount_share
- # 4) Everything is now clear to start sharing the backing store partition
- info "start sharing the backing store partition"
- echo /dev/mmcblk0p3 > $BACKING_STORE_FILE || die 14 "cannot share the backing store partition"
- }
- # Return if currently sharing
- is_share_started () {
- cat $BACKING_STORE_FILE | egrep -q ^/dev/mmcblk0p3
- local res=$?
- if [ "$res" == "0" ]; then
- echo "yes"
- else
- echo "no"
- fi
- return $res
- }
- case "$1" in
- init)
- init_share
- ;;
- start)
- start_share
- ;;
-
- stop)
- stop_share
- ;;
- is_sharing)
- is_share_started
- ;;
- *)
- die 15 "Usage $0 {init|start|stop|is_sharing}"
- ;;
- esac
- exit $?
|