Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 | 28x 28x 28x 28x 28x 28x 28x 28x 28x 28x 67x 67x 67x 1652x 67x 28x 448x 58x 28x 52x 49x 28x 917x 917x 917x 917x 28x 153x 212x 153x | /**
* NFSv4 attribute metadata and classification.
* Based on RFC 7530 Section 5.
*/
import {Nfsv4Attr} from './constants';
/**
* Per-server attributes (Section 5.4).
* These attributes are global to the entire server.
*/
export const PER_SERVER_ATTRS = new Set<Nfsv4Attr>([Nfsv4Attr.FATTR4_LEASE_TIME]);
/**
* Per-file system attributes (Section 5.4).
* These attributes are consistent across all objects within a given file system.
*/
export const PER_FS_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_SUPPORTED_ATTRS,
Nfsv4Attr.FATTR4_FH_EXPIRE_TYPE,
Nfsv4Attr.FATTR4_LINK_SUPPORT,
Nfsv4Attr.FATTR4_SYMLINK_SUPPORT,
Nfsv4Attr.FATTR4_UNIQUE_HANDLES,
Nfsv4Attr.FATTR4_ACLSUPPORT,
Nfsv4Attr.FATTR4_CANSETTIME,
Nfsv4Attr.FATTR4_CASE_INSENSITIVE,
Nfsv4Attr.FATTR4_CASE_PRESERVING,
Nfsv4Attr.FATTR4_CHOWN_RESTRICTED,
Nfsv4Attr.FATTR4_FILES_AVAIL,
Nfsv4Attr.FATTR4_FILES_FREE,
Nfsv4Attr.FATTR4_FILES_TOTAL,
Nfsv4Attr.FATTR4_FS_LOCATIONS,
Nfsv4Attr.FATTR4_HOMOGENEOUS,
Nfsv4Attr.FATTR4_MAXFILESIZE,
Nfsv4Attr.FATTR4_MAXNAME,
Nfsv4Attr.FATTR4_MAXREAD,
Nfsv4Attr.FATTR4_MAXWRITE,
Nfsv4Attr.FATTR4_NO_TRUNC,
Nfsv4Attr.FATTR4_SPACE_AVAIL,
Nfsv4Attr.FATTR4_SPACE_FREE,
Nfsv4Attr.FATTR4_SPACE_TOTAL,
Nfsv4Attr.FATTR4_TIME_DELTA,
]);
/**
* Attributes that must be the same for all objects within a file system (Section 5.4).
* These are always homogeneous.
*/
export const HOMOGENEOUS_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_SUPPORTED_ATTRS,
Nfsv4Attr.FATTR4_FSID,
Nfsv4Attr.FATTR4_HOMOGENEOUS,
Nfsv4Attr.FATTR4_LINK_SUPPORT,
Nfsv4Attr.FATTR4_SYMLINK_SUPPORT,
]);
/**
* Read-only (get-only) attributes (Section 5.5).
* Can be retrieved via GETATTR but not set via SETATTR.
* Attempting to set these returns NFS4ERR_INVAL.
*/
export const GET_ONLY_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_SUPPORTED_ATTRS,
Nfsv4Attr.FATTR4_TYPE,
Nfsv4Attr.FATTR4_FH_EXPIRE_TYPE,
Nfsv4Attr.FATTR4_CHANGE,
Nfsv4Attr.FATTR4_LINK_SUPPORT,
Nfsv4Attr.FATTR4_SYMLINK_SUPPORT,
Nfsv4Attr.FATTR4_NAMED_ATTR,
Nfsv4Attr.FATTR4_FSID,
Nfsv4Attr.FATTR4_UNIQUE_HANDLES,
Nfsv4Attr.FATTR4_LEASE_TIME,
Nfsv4Attr.FATTR4_RDATTR_ERROR,
Nfsv4Attr.FATTR4_FILEHANDLE,
Nfsv4Attr.FATTR4_ACLSUPPORT,
Nfsv4Attr.FATTR4_CANSETTIME,
Nfsv4Attr.FATTR4_CASE_INSENSITIVE,
Nfsv4Attr.FATTR4_CASE_PRESERVING,
Nfsv4Attr.FATTR4_CHOWN_RESTRICTED,
Nfsv4Attr.FATTR4_FILEID,
Nfsv4Attr.FATTR4_FILES_AVAIL,
Nfsv4Attr.FATTR4_FILES_FREE,
Nfsv4Attr.FATTR4_FILES_TOTAL,
Nfsv4Attr.FATTR4_FS_LOCATIONS,
Nfsv4Attr.FATTR4_HOMOGENEOUS,
Nfsv4Attr.FATTR4_MAXFILESIZE,
Nfsv4Attr.FATTR4_MAXLINK,
Nfsv4Attr.FATTR4_MAXNAME,
Nfsv4Attr.FATTR4_MAXREAD,
Nfsv4Attr.FATTR4_MAXWRITE,
Nfsv4Attr.FATTR4_MOUNTED_ON_FILEID,
Nfsv4Attr.FATTR4_NO_TRUNC,
Nfsv4Attr.FATTR4_NUMLINKS,
Nfsv4Attr.FATTR4_QUOTA_AVAIL_HARD,
Nfsv4Attr.FATTR4_QUOTA_AVAIL_SOFT,
Nfsv4Attr.FATTR4_QUOTA_USED,
Nfsv4Attr.FATTR4_RAWDEV,
Nfsv4Attr.FATTR4_SPACE_AVAIL,
Nfsv4Attr.FATTR4_SPACE_FREE,
Nfsv4Attr.FATTR4_SPACE_TOTAL,
Nfsv4Attr.FATTR4_SPACE_USED,
Nfsv4Attr.FATTR4_TIME_ACCESS,
Nfsv4Attr.FATTR4_TIME_DELTA,
Nfsv4Attr.FATTR4_TIME_METADATA,
Nfsv4Attr.FATTR4_TIME_MODIFY,
]);
/**
* Write-only (set-only) attributes (Section 5.5).
* Can be set via SETATTR but not retrieved via GETATTR.
* Attempting to get these returns NFS4ERR_INVAL.
*/
export const SET_ONLY_ATTRS = new Set<Nfsv4Attr>([Nfsv4Attr.FATTR4_TIME_ACCESS_SET, Nfsv4Attr.FATTR4_TIME_MODIFY_SET]);
/**
* REQUIRED attributes (Section 5.6, Table 3).
* Server MUST support these attributes.
*/
export const REQUIRED_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_SUPPORTED_ATTRS,
Nfsv4Attr.FATTR4_TYPE,
Nfsv4Attr.FATTR4_FH_EXPIRE_TYPE,
Nfsv4Attr.FATTR4_CHANGE,
Nfsv4Attr.FATTR4_SIZE,
Nfsv4Attr.FATTR4_LINK_SUPPORT,
Nfsv4Attr.FATTR4_SYMLINK_SUPPORT,
Nfsv4Attr.FATTR4_NAMED_ATTR,
Nfsv4Attr.FATTR4_FSID,
Nfsv4Attr.FATTR4_UNIQUE_HANDLES,
Nfsv4Attr.FATTR4_LEASE_TIME,
Nfsv4Attr.FATTR4_RDATTR_ERROR,
Nfsv4Attr.FATTR4_FILEHANDLE,
]);
/**
* RECOMMENDED attributes (Section 5.7, Table 4).
* Server SHOULD support these attributes.
*/
export const RECOMMENDED_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_ACL,
Nfsv4Attr.FATTR4_ACLSUPPORT,
Nfsv4Attr.FATTR4_ARCHIVE,
Nfsv4Attr.FATTR4_CANSETTIME,
Nfsv4Attr.FATTR4_CASE_INSENSITIVE,
Nfsv4Attr.FATTR4_CASE_PRESERVING,
Nfsv4Attr.FATTR4_CHOWN_RESTRICTED,
Nfsv4Attr.FATTR4_FILEID,
Nfsv4Attr.FATTR4_FILES_AVAIL,
Nfsv4Attr.FATTR4_FILES_FREE,
Nfsv4Attr.FATTR4_FILES_TOTAL,
Nfsv4Attr.FATTR4_FS_LOCATIONS,
Nfsv4Attr.FATTR4_HIDDEN,
Nfsv4Attr.FATTR4_HOMOGENEOUS,
Nfsv4Attr.FATTR4_MAXFILESIZE,
Nfsv4Attr.FATTR4_MAXLINK,
Nfsv4Attr.FATTR4_MAXNAME,
Nfsv4Attr.FATTR4_MAXREAD,
Nfsv4Attr.FATTR4_MAXWRITE,
Nfsv4Attr.FATTR4_MIMETYPE,
Nfsv4Attr.FATTR4_MODE,
Nfsv4Attr.FATTR4_MOUNTED_ON_FILEID,
Nfsv4Attr.FATTR4_NO_TRUNC,
Nfsv4Attr.FATTR4_NUMLINKS,
Nfsv4Attr.FATTR4_OWNER,
Nfsv4Attr.FATTR4_OWNER_GROUP,
Nfsv4Attr.FATTR4_QUOTA_AVAIL_HARD,
Nfsv4Attr.FATTR4_QUOTA_AVAIL_SOFT,
Nfsv4Attr.FATTR4_QUOTA_USED,
Nfsv4Attr.FATTR4_RAWDEV,
Nfsv4Attr.FATTR4_SPACE_AVAIL,
Nfsv4Attr.FATTR4_SPACE_FREE,
Nfsv4Attr.FATTR4_SPACE_TOTAL,
Nfsv4Attr.FATTR4_SPACE_USED,
Nfsv4Attr.FATTR4_SYSTEM,
Nfsv4Attr.FATTR4_TIME_ACCESS,
Nfsv4Attr.FATTR4_TIME_ACCESS_SET,
Nfsv4Attr.FATTR4_TIME_BACKUP,
Nfsv4Attr.FATTR4_TIME_CREATE,
Nfsv4Attr.FATTR4_TIME_DELTA,
Nfsv4Attr.FATTR4_TIME_METADATA,
Nfsv4Attr.FATTR4_TIME_MODIFY,
Nfsv4Attr.FATTR4_TIME_MODIFY_SET,
]);
/**
* Attributes that require fs.Stats (lstat) to compute.
* If none of these are requested, we can skip the lstat call.
*/
export const STAT_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_TYPE,
Nfsv4Attr.FATTR4_CHANGE,
Nfsv4Attr.FATTR4_SIZE,
Nfsv4Attr.FATTR4_FILEID,
Nfsv4Attr.FATTR4_MODE,
Nfsv4Attr.FATTR4_NUMLINKS,
Nfsv4Attr.FATTR4_RAWDEV,
Nfsv4Attr.FATTR4_SPACE_USED,
Nfsv4Attr.FATTR4_TIME_ACCESS,
Nfsv4Attr.FATTR4_TIME_METADATA,
Nfsv4Attr.FATTR4_TIME_MODIFY,
]);
/**
* Attributes that require filesystem stats (e.g. disk space).
* If none of these are requested, we can skip the filesystem stats call.
*/
export const FS_ATTRS = new Set<Nfsv4Attr>([
Nfsv4Attr.FATTR4_FILES_AVAIL,
Nfsv4Attr.FATTR4_FILES_FREE,
Nfsv4Attr.FATTR4_FILES_TOTAL,
Nfsv4Attr.FATTR4_SPACE_AVAIL,
Nfsv4Attr.FATTR4_SPACE_FREE,
Nfsv4Attr.FATTR4_SPACE_TOTAL,
]);
/**
* Extract attribute numbers from a bitmap mask.
*
* @todo PERF: More efficient would be to parse to `Array<number>` and
* also use `Array<number>` for {@link overlap} calculation.
*/
export const parseBitmask = (mask: number[]): Set<number> => {
const attrs = new Set<number>();
const length = mask.length;
for (let i = 0, word = mask[0], base = 0; i < length; i++, word = mask[i], base = i * 32)
for (let bit = 0; word; bit++, word >>>= 1) if (word & 1) attrs.add(base + bit);
return attrs;
};
/**
* Check if two sets overlap (have any elements in common).
*/
export const overlaps = <T>(a: Set<T>, b: Set<T>): boolean => {
for (const element of b) if (a.has(element)) return true;
return false;
};
/**
* Check if attempting to get a set-only attribute (returns NFS4ERR_INVAL).
*/
export const containsSetOnlyAttr = (requestedAttrs: Set<number>): boolean => overlaps(requestedAttrs, SET_ONLY_ATTRS);
/**
* Check if any requested attributes require lstat.
*/
export const requiresLstat = (requestedAttrs: Set<number>): boolean => overlaps(requestedAttrs, STAT_ATTRS);
export const requiresFsStats = (requestedAttrs: Set<number>): boolean => overlaps(requestedAttrs, FS_ATTRS);
export const setBit = (mask: number[], attrNum: Nfsv4Attr): void => {
const wordIndex = Math.floor(attrNum / 32);
const bitIndex = attrNum % 32;
while (mask.length <= wordIndex) mask.push(0);
mask[wordIndex] |= 1 << bitIndex;
};
/**
* Helper to convert attribute numbers to bitmap array.
* @param attrNums - Array of attribute numbers (Nfsv4Attr values)
* @returns Bitmap array suitable for Nfsv4Bitmap constructor
*/
export const attrNumsToBitmap = (attrNums: Nfsv4Attr[]): number[] => {
const mask: number[] = [];
for (const attrNum of attrNums) setBit(mask, attrNum);
return mask;
};
|