blob: 15065373de39799b349c126414460fb1d577aa40 [file] [log] [blame]
// 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);