icculus / physfs

A portable, flexible file i/o abstraction.
https://icculus.org/physfs/
zlib License
560 stars 98 forks source link

test_physfs: parse arguments + add tree command #56

Closed madebr closed 1 year ago

madebr commented 1 year ago

The following comands:

cat <<EOF >tree.sh
#!/bin/sh

set -e

PARENT=\$(pwd)/data_tree

function create_tree() {
  local i
  if test \$1 -ne 0; then
    for i in \$(seq \$2); do
      mkdir -p "dir\$i"
      pushd "dir\$i" >/dev/null
      create_tree \$(expr \$1 - 1 ) \$2
      popd >/dev/null
      if test \$i -eq 2; then
        chmod 0 dir\$i
      fi
    done
    ln -s "\$PARENT" dir\$(expr \$2 + 1)
  fi
  for i in \$(seq \$2); do
    echo "file\$1" >"file\$i"
  done
}

sudo rm -rf "\$PARENT"
mkdir "\$PARENT"
pushd "\$PARENT" >/dev/null
create_tree 3 3
popd >/dev/null
EOF

sh tree.sh
./test_physfs "mount $PWD/data_tree /tt 0" "tree /tt" "quit"

will output:

...
Enter commands. Enter "help" for instructions.
Successful.
/tt
├── dir1
│   ├── dir1
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir2 [Failure. reason: permission denied]
│   ├── dir3
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── file1
│   ├── file2
│   └── file3
├── dir2 [Failure. reason: permission denied]
├── dir3
│   ├── dir1
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir2 [Failure. reason: permission denied]
│   ├── dir3
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── file1
│   ├── file2
│   └── file3
├── file1
├── file2
└── file3

21 directories, 45 files

(I don't know why no symbolic links show up)

icculus commented 1 year ago

(I don't know why no symbolic links show up)

PhysicsFS explicitly ignores symlinks by default. Try this:

./test_physfs "permitsymlinks 1" "mount $PWD/data_tree /tt 0" "tree /tt" "quit"
madebr commented 1 year ago

Yup, that works.

/tt
├── dir1
│   ├── dir1
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir4 [symbolic link]
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir2 [Failure. reason: permission denied]
│   ├── dir3
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir4 [symbolic link]
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir4 [symbolic link]
│   ├── file1
│   ├── file2
│   └── file3
├── dir2 [Failure. reason: permission denied]
├── dir3
│   ├── dir1
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir4 [symbolic link]
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir2 [Failure. reason: permission denied]
│   ├── dir3
│   │   ├── dir1
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir2 [Failure. reason: permission denied]
│   │   ├── dir3
│   │   │   ├── file1
│   │   │   ├── file2
│   │   │   └── file3
│   │   ├── dir4 [symbolic link]
│   │   ├── file1
│   │   ├── file2
│   │   └── file3
│   ├── dir4 [symbolic link]
│   ├── file1
│   ├── file2
│   └── file3
├── dir4 [symbolic link]
├── file1
├── file2
└── file3