balena-image-fs 7.4.0-build-get-filesystem-label-7529f28d616619575443d6336a68be0a8fa9558c-1 → 7.4.0-build-get-filesystem-label-ad151fb7cb9fe5d4cb2aee572d6de21d3e854f71-1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -1
- package/build/fsLabel.js +18 -27
- package/build/fsLabel.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file
|
|
|
4
4
|
automatically by Versionist. DO NOT EDIT THIS FILE MANUALLY!
|
|
5
5
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
|
6
6
|
|
|
7
|
-
## 7.4.0 - 2025-01-
|
|
7
|
+
## 7.4.0 - 2025-01-21
|
|
8
8
|
|
|
9
9
|
* Add getLabel() to retrieve filesystem label [Ken Bannister]
|
|
10
10
|
|
package/build/fsLabel.js
CHANGED
|
@@ -64,9 +64,9 @@ async function getFsLabel(disk, partition) {
|
|
|
64
64
|
const isMbr = !isGpt;
|
|
65
65
|
// Use a buffer capable of reading any filesystem metadata. Defer actual
|
|
66
66
|
// read until select filesystem.
|
|
67
|
-
|
|
68
|
-
let labelOffset
|
|
69
|
-
let maxLength
|
|
67
|
+
const buf = Buffer.alloc(FS_METADATA_MAXLEN);
|
|
68
|
+
let labelOffset;
|
|
69
|
+
let maxLength;
|
|
70
70
|
// A filesystem places the label in a certain position in its metadata. So
|
|
71
71
|
// we must determine the type of filesystem. We first narrow the possibilities
|
|
72
72
|
// by checking the partition type (MBR) or GUID (GPT) for the containing partition.
|
|
@@ -74,58 +74,49 @@ async function getFsLabel(disk, partition) {
|
|
|
74
74
|
// we confirm the presence of signature bytes within the filesystem metadata.
|
|
75
75
|
const mbrFatTypes = [PARTID_FAT32_CHS, PARTID_FAT32_LBA, PARTID_FAT16_LBA];
|
|
76
76
|
const gptFatTypes = [GUID_EFI_SYSTEM, GUID_MS_BASIC_DATA];
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if (isMbr && mbrFatTypes.some(ptype => partition.type === ptype)
|
|
80
|
-
|| isGpt && gptFatTypes.some(ptype => partition.type === ptype)) {
|
|
81
|
-
foundPartType = true;
|
|
77
|
+
if (isMbr && mbrFatTypes.includes(partition.type)
|
|
78
|
+
|| isGpt && gptFatTypes.includes(partition.type)) {
|
|
82
79
|
maxLength = FAT_LABEL_MAXLEN;
|
|
83
80
|
await disk.read(buf, 0, buf.length, partition.offset);
|
|
84
81
|
// FAT16
|
|
85
82
|
if (buf.readUInt8(FAT16_MAGIC_OFFSET) === FAT_MAGIC_VALUE) {
|
|
86
83
|
labelOffset = FAT16_LABEL_OFFSET;
|
|
87
|
-
foundLabel = true;
|
|
88
84
|
// FAT32
|
|
89
85
|
}
|
|
90
86
|
else if (buf.readUInt8(FAT32_MAGIC_OFFSET) === FAT_MAGIC_VALUE) {
|
|
91
87
|
labelOffset = FAT32_LABEL_OFFSET;
|
|
92
|
-
foundLabel = true;
|
|
93
88
|
}
|
|
94
89
|
}
|
|
95
90
|
// Linux filesytem of some kind; execting ext2+
|
|
96
91
|
const gptLinuxTypes = [GUID_LINUX_NATIVE, GUID_MS_BASIC_DATA];
|
|
97
|
-
if (
|
|
98
|
-
|
|
99
|
-
|| (isGpt && gptLinuxTypes.some(ptype => partition.type === ptype)))) {
|
|
100
|
-
foundPartType = true;
|
|
92
|
+
if (labelOffset == null && ((isMbr && partition.type === PARTID_LINUX_NATIVE)
|
|
93
|
+
|| (isGpt && gptLinuxTypes.includes(partition.type)))) {
|
|
101
94
|
maxLength = EXT4_LABEL_MAXLEN;
|
|
102
95
|
// ext2+; reload buffer within superblock
|
|
103
96
|
await disk.read(buf, 0, buf.length, partition.offset + EXT4_SUPERBLOCK_OFFSET);
|
|
104
97
|
if (buf.readUInt16LE(EXT4_MAGIC_OFFSET) === EXT4_MAGIC_VALUE_LE) {
|
|
105
98
|
labelOffset = EXT4_LABEL_OFFSET;
|
|
106
|
-
foundLabel = true;
|
|
107
99
|
}
|
|
108
100
|
}
|
|
109
101
|
// Fail on unexpected partition/filesystem
|
|
110
|
-
if (
|
|
102
|
+
if (maxLength == null) {
|
|
111
103
|
throw new LabelNotFound(partition.index, 'unexpected partition type');
|
|
112
104
|
}
|
|
113
|
-
|
|
105
|
+
if (labelOffset == null) {
|
|
114
106
|
throw new LabelNotFound(partition.index, 'can\'t read filesystem');
|
|
115
107
|
}
|
|
116
|
-
|
|
117
|
-
let i = 0;
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
if (i == maxLength) {
|
|
122
|
-
break;
|
|
123
|
-
}
|
|
124
|
-
if (buf.readUInt8(labelOffset + i) == 0) {
|
|
108
|
+
let zeroBytePosition;
|
|
109
|
+
for (let i = 0; i < maxLength; i++) {
|
|
110
|
+
// Exclude trailing /0 bytes to stringify.
|
|
111
|
+
if (buf.readUInt8(labelOffset + i) === 0) {
|
|
112
|
+
zeroBytePosition = i;
|
|
125
113
|
break;
|
|
126
114
|
}
|
|
127
115
|
}
|
|
128
|
-
|
|
116
|
+
// If label fills available space, no need to test. We just need zeroBytePosition
|
|
117
|
+
// to have the expected value for Buffer.toString() call below.
|
|
118
|
+
zeroBytePosition !== null && zeroBytePosition !== void 0 ? zeroBytePosition : (zeroBytePosition = maxLength);
|
|
119
|
+
return buf.toString('utf8', labelOffset, labelOffset + zeroBytePosition).trim();
|
|
129
120
|
}
|
|
130
121
|
exports.getFsLabel = getFsLabel;
|
|
131
122
|
//# sourceMappingURL=fsLabel.js.map
|
package/build/fsLabel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsLabel.js","sourceRoot":"","sources":["../lib/fsLabel.ts"],"names":[],"mappings":";;;AAEA,6CAAyC;AAEzC,sBAAsB;AACtB,0EAA0E;AAC1E,MAAM,eAAe,GAAG,sCAAsC,CAAC;AAC/D,MAAM,kBAAkB,GAAG,sCAAsC,CAAC;AAClE,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;AAEjE,6EAA6E;AAC7E,qCAAqC;AACrC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,yBAAyB;AACzB,+CAA+C;AAC/C,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,mBAAmB,GAAG,IAAI,CAAC;AACjC,gBAAgB;AAChB,4FAA4F;AAC5F,kGAAkG;AAClG,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAChC,iBAAiB;AACjB,qEAAqE;AACrE,MAAM,sBAAsB,GAAG,KAAK,CAAC;AACrC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,mBAAmB,GAAG,MAAM,CAAC;AACnC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B;;GAEG;AACH,MAAa,aAAc,SAAQ,wBAAU;IAC5C,YAAY,cAAsB,EAAE,WAAmB;QACtD,KAAK,CAAC,oBAAoB,cAAc,KAAK,WAAW,EAAE,CAAC,CAAC;IAC7D,CAAC;CACD;AAJD,sCAIC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACI,KAAK,UAAU,UAAU,CAC/B,IAAU,EACV,SAAsC;IAEtC,MAAM,KAAK,GAAG,MAAM,IAAI,SAAS,CAAC;IAClC,MAAM,KAAK,GAAG,CAAC,KAAK,CAAA;IAEpB,wEAAwE;IACxE,gCAAgC;IAChC,
|
|
1
|
+
{"version":3,"file":"fsLabel.js","sourceRoot":"","sources":["../lib/fsLabel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "balena-image-fs",
|
|
3
|
-
"version": "7.4.0-build-get-filesystem-label-
|
|
3
|
+
"version": "7.4.0-build-get-filesystem-label-ad151fb7cb9fe5d4cb2aee572d6de21d3e854f71-1",
|
|
4
4
|
"description": "Image filesystem manipulation utilities",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"homepage": "https://github.com/balena-io-modules/balena-image-fs",
|
|
@@ -59,6 +59,6 @@
|
|
|
59
59
|
"node": ">=16"
|
|
60
60
|
},
|
|
61
61
|
"versionist": {
|
|
62
|
-
"publishedAt": "2025-01-
|
|
62
|
+
"publishedAt": "2025-01-21T18:34:22.218Z"
|
|
63
63
|
}
|
|
64
64
|
}
|