| // SPDX-License-Identifier: GPL-2.0 |
| /* |
| * Copyright (c) 2000-2001,2005 Silicon Graphics, Inc. |
| * All Rights Reserved. |
| */ |
| |
| typedef enum fldt { |
| FLDT_AEXTNUM, |
| FLDT_AGBLOCK, |
| FLDT_AGBLOCKNZ, |
| FLDT_AGF, |
| FLDT_AGFL, |
| FLDT_AGFL_CRC, |
| FLDT_AGI, |
| FLDT_AGINO, |
| FLDT_AGINONN, |
| FLDT_AGNUMBER, |
| |
| /* attr fields */ |
| FLDT_ATTR, |
| FLDT_ATTR_BLKINFO, |
| FLDT_ATTR_LEAF_ENTRY, |
| FLDT_ATTR_LEAF_HDR, |
| FLDT_ATTR_LEAF_MAP, |
| FLDT_ATTR_LEAF_NAME, |
| FLDT_ATTR_NODE_ENTRY, |
| FLDT_ATTR_NODE_HDR, |
| FLDT_ATTR_SF_ENTRY, |
| FLDT_ATTR_SF_HDR, |
| FLDT_ATTRBLOCK, |
| FLDT_ATTRSHORT, |
| |
| /* attr 3 specific fields */ |
| FLDT_ATTR3, |
| FLDT_ATTR3_BLKINFO, |
| FLDT_ATTR3_LEAF_HDR, |
| FLDT_ATTR3_NODE_HDR, |
| FLDT_ATTR3_REMOTE_HDR, |
| |
| FLDT_BMAPBTA, |
| FLDT_BMAPBTA_CRC, |
| FLDT_BMAPBTAKEY, |
| FLDT_BMAPBTAPTR, |
| FLDT_BMAPBTAREC, |
| FLDT_BMAPBTD, |
| FLDT_BMAPBTD_CRC, |
| FLDT_BMAPBTDKEY, |
| FLDT_BMAPBTDPTR, |
| FLDT_BMAPBTDREC, |
| FLDT_BMROOTA, |
| FLDT_BMROOTAKEY, |
| FLDT_BMROOTAPTR, |
| FLDT_BMROOTD, |
| FLDT_BMROOTDKEY, |
| FLDT_BMROOTDPTR, |
| FLDT_BNOBT, |
| FLDT_BNOBT_CRC, |
| FLDT_BNOBTKEY, |
| FLDT_BNOBTPTR, |
| FLDT_BNOBTREC, |
| FLDT_CEXTFLG, |
| FLDT_CEXTLEN, |
| FLDT_CFILEOFFA, |
| FLDT_CFILEOFFD, |
| FLDT_CFSBLOCK, |
| FLDT_CHARNS, |
| FLDT_CHARS, |
| FLDT_REXTLEN, |
| FLDT_RFILEOFFD, |
| FLDT_REXTFLG, |
| FLDT_RATTRFORKFLG, |
| FLDT_RBMBTFLG, |
| FLDT_CAGBLOCK, |
| FLDT_CCOWFLG, |
| FLDT_CNTBT, |
| FLDT_CNTBT_CRC, |
| FLDT_CNTBTKEY, |
| FLDT_CNTBTPTR, |
| FLDT_CNTBTREC, |
| FLDT_RMAPBT_CRC, |
| FLDT_RMAPBTKEY, |
| FLDT_RMAPBTPTR, |
| FLDT_RMAPBTREC, |
| FLDT_REFCBT_CRC, |
| FLDT_REFCBTKEY, |
| FLDT_REFCBTPTR, |
| FLDT_REFCBTREC, |
| |
| /* CRC field type */ |
| FLDT_CRC, |
| |
| FLDT_DEV, |
| FLDT_DFILOFFA, |
| FLDT_DFILOFFD, |
| FLDT_DFSBNO, |
| FLDT_DINODE_A, |
| FLDT_DINODE_CORE, |
| FLDT_DINODE_FMT, |
| FLDT_DINODE_U, |
| FLDT_DINODE_V3, |
| |
| /* dir v2 fields */ |
| FLDT_DIR2, |
| FLDT_DIR2_BLOCK_TAIL, |
| FLDT_DIR2_DATA_FREE, |
| FLDT_DIR2_DATA_HDR, |
| FLDT_DIR2_DATA_OFF, |
| FLDT_DIR2_DATA_OFFNZ, |
| FLDT_DIR2_DATA_UNION, |
| FLDT_DIR2_FREE_HDR, |
| FLDT_DIR2_INO4, |
| FLDT_DIR2_INO8, |
| FLDT_DIR2_INOU, |
| FLDT_DIR2_LEAF_ENTRY, |
| FLDT_DIR2_LEAF_HDR, |
| FLDT_DIR2_LEAF_TAIL, |
| FLDT_DIR2_SF_ENTRY, |
| FLDT_DIR2_SF_HDR, |
| FLDT_DIR2_SF_OFF, |
| FLDT_DIR2SF, |
| |
| /* dir v3 fields */ |
| FLDT_DIR3, |
| FLDT_DIR3_BLKHDR, |
| FLDT_DIR3_DATA_HDR, |
| FLDT_DIR3_FREE_HDR, |
| FLDT_DIR3_LEAF_HDR, |
| FLDT_DIR3_DATA_UNION, |
| FLDT_DIR3_SF_ENTRY, |
| FLDT_DIR3SF, |
| |
| /* dir v2/3 node fields */ |
| FLDT_DA_BLKINFO, |
| FLDT_DA_NODE_ENTRY, |
| FLDT_DA_NODE_HDR, |
| FLDT_DA3_BLKINFO, |
| FLDT_DA3_NODE_HDR, |
| |
| FLDT_DIRBLOCK, |
| FLDT_DISK_DQUOT, |
| FLDT_DQBLK, |
| FLDT_DQID, |
| FLDT_DRFSBNO, |
| FLDT_DRTBNO, |
| FLDT_EXTLEN, |
| FLDT_EXTNUM, |
| FLDT_FSIZE, |
| FLDT_INO, |
| FLDT_INOBT, |
| FLDT_INOBT_CRC, |
| FLDT_INOBT_SPCRC, |
| FLDT_INOBTKEY, |
| FLDT_INOBTPTR, |
| FLDT_INOBTREC, |
| FLDT_INOBTSPREC, |
| FLDT_INODE, |
| FLDT_INODE_CRC, |
| FLDT_INOFREE, |
| FLDT_INT16D, |
| FLDT_INT32D, |
| FLDT_INT64D, |
| FLDT_INT8D, |
| FLDT_NSEC, |
| FLDT_QCNT, |
| FLDT_QWARNCNT, |
| FLDT_SB, |
| |
| /* CRC enabled symlink */ |
| FLDT_SYMLINK_CRC, |
| |
| FLDT_TIME, |
| FLDT_TIMESTAMP, |
| FLDT_UINT1, |
| FLDT_UINT16D, |
| FLDT_UINT16O, |
| FLDT_UINT16X, |
| FLDT_UINT32D, |
| FLDT_UINT32O, |
| FLDT_UINT32X, |
| FLDT_UINT64D, |
| FLDT_UINT64O, |
| FLDT_UINT64X, |
| FLDT_UINT8D, |
| FLDT_UINT8O, |
| FLDT_UINT8X, |
| FLDT_UUID, |
| FLDT_ZZZ /* mark last entry */ |
| } fldt_t; |
| |
| typedef int (*offset_fnc_t)(void *obj, int startoff, int idx); |
| #define OI(o) ((offset_fnc_t)(intptr_t)(o)) |
| |
| typedef int (*count_fnc_t)(void *obj, int startoff); |
| #define CI(c) ((count_fnc_t)(intptr_t)(c)) |
| #define C1 CI(1) |
| |
| typedef struct field |
| { |
| char *name; |
| fldt_t ftyp; |
| offset_fnc_t offset; |
| count_fnc_t count; |
| int flags; |
| typnm_t next; |
| } field_t; |
| |
| /* |
| * flag values |
| */ |
| #define FLD_ABASE1 1 /* field array base is 1 not 0 */ |
| #define FLD_SKIPALL 2 /* skip this field in an all-fields print */ |
| #define FLD_ARRAY 4 /* this field is an array */ |
| #define FLD_OFFSET 8 /* offset value is a function pointer */ |
| #define FLD_COUNT 16 /* count value is a function pointer */ |
| |
| typedef int (*size_fnc_t)(void *obj, int startoff, int idx); |
| #define SI(s) ((size_fnc_t)(intptr_t)(s)) |
| |
| typedef struct ftattr |
| { |
| fldt_t ftyp; |
| char *name; |
| prfnc_t prfunc; |
| char *fmtstr; |
| size_fnc_t size; |
| int arg; |
| adfnc_t adfunc; |
| const field_t *subfld; |
| } ftattr_t; |
| extern const ftattr_t ftattrtab[]; |
| |
| /* |
| * arg values |
| */ |
| #define FTARG_SKIPZERO 1 /* skip 0 words */ |
| #define FTARG_DONULL 2 /* make -1 words be "null" */ |
| #define FTARG_SKIPNULL 4 /* skip -1 words */ |
| #define FTARG_SIGNED 8 /* field value is signed */ |
| #define FTARG_SIZE 16 /* size field is a function */ |
| #define FTARG_SKIPNMS 32 /* skip printing names this time */ |
| #define FTARG_OKEMPTY 64 /* ok if this (union type) is empty */ |
| |
| extern int bitoffset(const field_t *f, void *obj, int startoff, |
| int idx); |
| extern int fcount(const field_t *f, void *obj, int startoff); |
| extern const field_t *findfield(char *name, const field_t *fields, |
| void *obj, int startoff); |
| extern int fsize(const field_t *f, void *obj, int startoff, |
| int idx); |