/*
 * CMUCS AFStools
 * dumpscan - routines for scanning and manipulating AFS volume dumps
 *
 * Copyright (c) 1998, 2001 Carnegie Mellon University
 * All Rights Reserved.
 *
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 *
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 *
 * Carnegie Mellon requests users of this software to return to
 *
 *  Software Distribution Coordinator  or  Software_Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 *
 * any improvements or extensions that they make and grant Carnegie Mellon
 * the rights to redistribute these changes.
 */

/* dumpfmt.h - Description of AFS dump format */

#ifndef _DUMPFMT_H_
#define _DUMPFMT_H_

#include "intNN.h"

/* AFS dump file format:
 * All data in AFS dumps is tagged; that is, each data item is preceeded
 * by a 1-byte tag which identifies what the data item is.  There is no
 * explicit mention of what the data type is, but the type of each possible
 * data item (and thus, each possible tag) is fixed.  Usually this is
 * a relatively simple, fixed amount of data (byte, short, word), but
 * sometimes it is more complex.
 *
 * There is some amount of structure to an AFS volume dump.  Basically,
 * you get a dump header, followed by a volume header, followed by some
 * vnodes, followed by a dump end.  Each of these items (header, vnode,
 * dump end) consists of a tag, a fixed amount of required information,
 * and 0 or more tagged attributes (except dump-end, which has no attributes).
 *
 * Vnodes, in turn, are usually listed in a particular order.  First, we
 * list all the directory vnodes in the volume, in increasing order by
 * vnode.  Then, we list all the file vnodes, again in increasing order.
 * Directory vnodes must have a complete set of attributes and data, but
 * in an incremental dump, file vnodes may have no attributes if the vnode
 * has not changed since the reference date.
 *
 * The primary purpose of this file is to define the tags and some magic
 * numbers.  There is also some information that is defined in the Transarc
 * provided header files.
 */


/** MAGIC NUMBERS **/
#define DUMPVERSION     1
#define DUMPBEGINMAGIC  0xb3a11322
#define DUMPENDMAGIC    0x3a214b6e


/** TOP-LEVEL TAGS **/
#define TAG_DUMPHEADER  1
#define TAG_VOLHEADER   2
#define TAG_VNODE       3
#define TAG_DUMPEND     4


/** DUMP HEADER TAGS **/
#define DHTAG_VOLNAME    'n'
#define DHTAG_VOLID      'v'
#define DHTAG_DUMPTIMES  't'


/** VOLUME HEADER TAGS **/
#define VHTAG_VOLID      'i'
#define VHTAG_VERS       'v'
#define VHTAG_VOLNAME    'n'
#define VHTAG_INSERV     's'
#define VHTAG_BLESSED    'b'
#define VHTAG_VUNIQ      'u'
#define VHTAG_TYPE       't'
#define VHTAG_PARENT     'p'
#define VHTAG_CLONE      'c'
#define VHTAG_MAXQUOTA   'q'
#define VHTAG_MINQUOTA   'm'
#define VHTAG_DISKUSED   'd'
#define VHTAG_FILECNT    'f'
#define VHTAG_ACCOUNT    'a'
#define VHTAG_OWNER      'o'
#define VHTAG_CREAT      'C'
#define VHTAG_ACCESS     'A'
#define VHTAG_UPDATE     'U'
#define VHTAG_EXPIRE     'E'
#define VHTAG_BACKUP     'B'
#define VHTAG_OFFLINE    'O'
#define VHTAG_MOTD       'M'
#define VHTAG_WEEKUSE    'W'
#define VHTAG_DUDATE     'D'
#define VHTAG_DAYUSE     'Z'


/** VNODE TAGS **/
#define VTAG_TYPE        't'
#define VTAG_NLINKS      'l'
#define VTAG_DVERS       'v'
#define VTAG_CLIENT_DATE 'm'
#define VTAG_AUTHOR      'a'
#define VTAG_OWNER       'o'
#define VTAG_GROUP       'g'
#define VTAG_MODE        'b'
#define VTAG_PARENT      'p'
#define VTAG_SERVER_DATE 's'
#define VTAG_ACL         'A'
#define VTAG_DATA        'f'


#define AFS_DIR_MAGIC    1234
#define AFS_DIR_EPP        64
#define AFS_DIR_MAXPAGES  128
#define AFS_DIR_NHASH     128

typedef struct {
  afs_uint16 pgcount;
  afs_uint16 tag;
  char freecount;
  char freebitmap[AFS_DIR_EPP/8];
  char padding[32 - (5 + AFS_DIR_EPP/8)];
} afs_dir_pagehdr;

typedef struct {
  afs_dir_pagehdr pagehdr;
  char allomap[AFS_DIR_MAXPAGES];
  afs_uint16 hash[AFS_DIR_NHASH];
} afs_dir_header;

typedef struct {
  char flag;
  char length;
  afs_uint16 next;
  afs_uint32 vnode;
  afs_uint32 vunique;
  char name[16];
  char padding[4];
} afs_dir_direntry;

typedef union {
  afs_dir_pagehdr header;
  afs_dir_direntry entry[AFS_DIR_EPP];
} afs_dir_page;

#endif /* _DUMPFMT_H_ */
