diff --git a/.gitignore b/.gitignore index 894e41c..2fdf88a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ .DS_Store .vscode/ node_modules/ +package-lock.json +tests/label.img \ No newline at end of file diff --git a/index.js b/index.js index 960de6a..09c7b0f 100644 --- a/index.js +++ b/index.js @@ -557,6 +557,20 @@ exports.createFileSystem = function (volume, opts, cb) { else _.delayedCall(cb, S.err.NOSYS()); }, (_n_ === '_nested_')); }; + fs.createLabel = function (name, cb) { + fs.open(name, "a", (e, _fd) => { + if (e) { + cb(e); + } else { + let fd = fileDescriptors[_fd] + fd.entry.Attr.volume_id = true + fd.entry.FstClusLO = 0 + fd.entry.FstClusHI = 0 + + fs._updateEntry(fd.entry, {}, cb); + } + }) + }; return fs; } diff --git a/package.json b/package.json index 6747121..52a125c 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,8 @@ "description": "fs implementation on top of raw FAT16/FAT32 block source", "main": "index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "test": "echo \"Error: no test specified\" && exit 1", + "label-testcase": "nodejs tests/label.js" }, "repository": { "type": "git", diff --git a/run_tests.sh b/run_tests.sh new file mode 100755 index 0000000..650e7ee --- /dev/null +++ b/run_tests.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +if ! [ -x "$(command -v blkid)" ]; then + echo 'Error: util-linux is not installed.' >&2 + exit 1 +fi + +if ! [ -x "$(command -v dosfslabel)" ]; then + echo 'Error: dosfstools is not installed.' >&2 + exit 1 +fi + +rm tests/label.img || true + +set -e + +dd if=/dev/zero of=tests/label.img bs=1M count=10 +mkfs.vfat tests/label.img + +npm run label-testcase + +BLKID=$(blkid tests/label.img) +DOSFSLABEL=$(dosfslabel tests/label.img) + +if ! [[ $BLKID == *'LABEL="CIDATA"'* ]]; then + echo "blkid: LABEL is invalid" + exit 1 +fi + +echo "blkid: LABEL is valid" + +if ! [[ $DOSFSLABEL == *"CIDATA"* ]]; then + echo "dosfslabel: label is invalid" + exit 1 +fi + +echo "dosfslabel: label is valid" \ No newline at end of file diff --git a/tests/label.js b/tests/label.js new file mode 100644 index 0000000..9fb6d0e --- /dev/null +++ b/tests/label.js @@ -0,0 +1,8 @@ +var fatfs = require("../"); +var createDriverSync = require("../img_volume").createDriverSync + +const buffer = createDriverSync("tests/label.img") + +const fs = fatfs.createFileSystem(buffer, {allowLowercaseNames: true}) + +fs.createLabel("cidata", () => {}) \ No newline at end of file