3 * dumpscan - routines for scanning and manipulating AFS volume dumps
5 * Copyright (c) 1998 Carnegie Mellon University
8 * Permission to use, copy, modify and distribute this software and its
9 * documentation is hereby granted, provided that both the copyright
10 * notice and this permission notice appear in all copies of the
11 * software, derivative works or modified versions, and any portions
12 * thereof, and that both notices appear in supporting documentation.
14 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
15 * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
16 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
18 * Carnegie Mellon requests users of this software to return to
20 * Software Distribution Coordinator or Software_Distribution@CS.CMU.EDU
21 * School of Computer Science
22 * Carnegie Mellon University
23 * Pittsburgh PA 15213-3890
25 * any improvements or extensions that they make and grant Carnegie Mellon
26 * the rights to redistribute these changes.
29 /* dump.c - Write out parts of a volume dump */
34 #define COPYBUFSIZE 65536
37 DumpDumpHeader(XFILE
* OX
, afs_dump_header
* hdr
)
41 if ((r
= WriteTagInt32Pair(OX
, TAG_DUMPHEADER
, hdr
->magic
, hdr
->version
)))
44 if (hdr
->field_mask
& F_DUMPHDR_VOLID
) {
45 if ((r
= WriteTagInt32(OX
, DHTAG_VOLID
, hdr
->volid
)))
48 if (hdr
->field_mask
& F_DUMPHDR_VOLNAME
) {
49 if ((r
= WriteByte(OX
, DHTAG_VOLNAME
)))
51 if ((r
= WriteString(OX
, hdr
->volname
)))
54 if (hdr
->field_mask
& (F_DUMPHDR_FROM
| F_DUMPHDR_TO
)) {
55 if ((r
= WriteTagInt16(OX
, DHTAG_DUMPTIMES
, 2)))
57 if ((r
= WriteInt32(OX
, (hdr
->field_mask
& F_DUMPHDR_FROM
))
58 ? hdr
->from_date
: 0))
60 if ((r
= WriteInt32(OX
, (hdr
->field_mask
& F_DUMPHDR_TO
)
61 ? hdr
->to_date
: time(0))))
69 DumpVolumeHeader(XFILE
* OX
, afs_vol_header
* hdr
)
74 if ((r
= WriteByte(OX
, TAG_VOLHEADER
)))
77 if (hdr
->field_mask
& F_VOLHDR_VOLID
) {
78 if ((r
= WriteTagInt32(OX
, VHTAG_VOLID
, hdr
->volid
)))
81 if (hdr
->field_mask
& F_VOLHDR_VOLVERS
) {
82 if ((r
= WriteTagInt32(OX
, VHTAG_VERS
, hdr
->volvers
)))
85 if (hdr
->field_mask
& F_VOLHDR_VOLNAME
) {
86 if ((r
= WriteByte(OX
, VHTAG_VOLNAME
)))
88 if ((r
= WriteString(OX
, hdr
->volname
)))
91 if (hdr
->field_mask
& F_VOLHDR_INSERV
) {
92 if ((r
= WriteTagByte(OX
, VHTAG_INSERV
, hdr
->flag_inservice
)))
95 if (hdr
->field_mask
& F_VOLHDR_BLESSED
) {
96 if ((r
= WriteTagByte(OX
, VHTAG_BLESSED
, hdr
->flag_blessed
)))
99 if (hdr
->field_mask
& F_VOLHDR_VOLUNIQ
) {
100 if ((r
= WriteTagInt32(OX
, VHTAG_VUNIQ
, hdr
->voluniq
)))
103 if (hdr
->field_mask
& F_VOLHDR_VOLTYPE
) {
104 if ((r
= WriteTagByte(OX
, VHTAG_TYPE
, hdr
->voltype
)))
107 if (hdr
->field_mask
& F_VOLHDR_PARENT
) {
108 if ((r
= WriteTagInt32(OX
, VHTAG_PARENT
, hdr
->parent_volid
)))
111 if (hdr
->field_mask
& F_VOLHDR_CLONE
) {
112 if ((r
= WriteTagInt32(OX
, VHTAG_CLONE
, hdr
->clone_volid
)))
115 if (hdr
->field_mask
& F_VOLHDR_MAXQ
) {
116 if ((r
= WriteTagInt32(OX
, VHTAG_MAXQUOTA
, hdr
->maxquota
)))
119 if (hdr
->field_mask
& F_VOLHDR_MINQ
) {
120 if ((r
= WriteTagInt32(OX
, VHTAG_MINQUOTA
, hdr
->minquota
)))
123 if (hdr
->field_mask
& F_VOLHDR_DISKUSED
) {
124 if ((r
= WriteTagInt32(OX
, VHTAG_DISKUSED
, hdr
->diskused
)))
127 if (hdr
->field_mask
& F_VOLHDR_NFILES
) {
128 if ((r
= WriteTagInt32(OX
, VHTAG_FILECNT
, hdr
->nfiles
)))
131 if (hdr
->field_mask
& F_VOLHDR_ACCOUNT
) {
132 if ((r
= WriteTagInt32(OX
, VHTAG_ACCOUNT
, hdr
->account_no
)))
135 if (hdr
->field_mask
& F_VOLHDR_OWNER
) {
136 if ((r
= WriteTagInt32(OX
, VHTAG_OWNER
, hdr
->owner
)))
139 if (hdr
->field_mask
& F_VOLHDR_CREATE_DATE
) {
140 if ((r
= WriteTagInt32(OX
, VHTAG_CREAT
, hdr
->create_date
)))
143 if (hdr
->field_mask
& F_VOLHDR_ACCESS_DATE
) {
144 if ((r
= WriteTagInt32(OX
, VHTAG_ACCESS
, hdr
->access_date
)))
147 if (hdr
->field_mask
& F_VOLHDR_UPDATE_DATE
) {
148 if ((r
= WriteTagInt32(OX
, VHTAG_UPDATE
, hdr
->update_date
)))
151 if (hdr
->field_mask
& F_VOLHDR_EXPIRE_DATE
) {
152 if ((r
= WriteTagInt32(OX
, VHTAG_EXPIRE
, hdr
->expire_date
)))
155 if (hdr
->field_mask
& F_VOLHDR_BACKUP_DATE
) {
156 if ((r
= WriteTagInt32(OX
, VHTAG_BACKUP
, hdr
->backup_date
)))
159 if (hdr
->field_mask
& F_VOLHDR_OFFLINE_MSG
) {
160 if ((r
= WriteTagInt32(OX
, VHTAG_OFFLINE
, *hdr
->offline_msg
)))
163 if (hdr
->field_mask
& F_VOLHDR_MOTD
) {
164 if ((r
= WriteTagInt32(OX
, VHTAG_MOTD
, *hdr
->motd_msg
)))
167 if (hdr
->field_mask
& F_VOLHDR_WEEKUSE
) {
168 if ((r
= WriteTagInt16(OX
, VHTAG_WEEKUSE
, 7)))
170 for (i
= 0; i
< 7; i
++)
171 if ((r
= WriteInt32(OX
, hdr
->weekuse
[i
])))
174 if (hdr
->field_mask
& F_VOLHDR_DAYUSE_DATE
) {
175 if ((r
= WriteTagInt32(OX
, VHTAG_DUDATE
, hdr
->dayuse_date
)))
178 if (hdr
->field_mask
& F_VOLHDR_DAYUSE
) {
179 if ((r
= WriteTagInt32(OX
, VHTAG_DAYUSE
, hdr
->dayuse
)))
187 DumpVNode(XFILE
* OX
, afs_vnode
* v
)
191 if ((r
= WriteTagInt32Pair(OX
, TAG_VNODE
, v
->vnode
, v
->vuniq
)))
194 if (v
->field_mask
& F_VNODE_TYPE
) {
195 if ((r
= WriteTagByte(OX
, VTAG_TYPE
, v
->type
)))
198 if (v
->field_mask
& F_VNODE_NLINKS
) {
199 if ((r
= WriteTagInt16(OX
, VTAG_NLINKS
, v
->nlinks
)))
202 if (v
->field_mask
& F_VNODE_DVERS
) {
203 if ((r
= WriteTagInt32(OX
, VTAG_DVERS
, v
->datavers
)))
206 if (v
->field_mask
& F_VNODE_SDATE
) {
207 if ((r
= WriteTagInt32(OX
, VTAG_SERVER_DATE
, v
->server_date
)))
210 if (v
->field_mask
& F_VNODE_AUTHOR
) {
211 if ((r
= WriteTagInt32(OX
, VTAG_AUTHOR
, v
->author
)))
214 if (v
->field_mask
& F_VNODE_OWNER
) {
215 if ((r
= WriteTagInt32(OX
, VTAG_OWNER
, v
->owner
)))
218 if (v
->field_mask
& F_VNODE_GROUP
) {
219 if ((r
= WriteTagInt32(OX
, VTAG_GROUP
, v
->group
)))
222 if (v
->field_mask
& F_VNODE_MODE
) {
223 if ((r
= WriteTagInt16(OX
, VTAG_MODE
, v
->mode
)))
226 if (v
->field_mask
& F_VNODE_PARENT
) {
227 if ((r
= WriteTagInt32(OX
, VTAG_PARENT
, v
->parent
)))
230 if (v
->field_mask
& F_VNODE_CDATE
) {
231 if ((r
= WriteTagInt32(OX
, VTAG_CLIENT_DATE
, v
->client_date
)))
234 if (v
->field_mask
& F_VNODE_ACL
) {
235 if ((r
= WriteByte(OX
, VTAG_ACL
)))
239 SIZEOF_LARGEDISKVNODE
- SIZEOF_SMALLDISKVNODE
)))
247 DumpVNodeData(XFILE
* OX
, char *buf
, afs_uint32 size
)
251 if ((r
= WriteTagInt32(OX
, VTAG_DATA
, size
)))
253 if ((r
= xfwrite(OX
, buf
, size
)))
260 CopyVNodeData(XFILE
* OX
, XFILE
* X
, afs_uint32 size
)
263 static char buf
[COPYBUFSIZE
];
265 if ((r
= WriteTagInt32(OX
, VTAG_DATA
, size
)))
268 n
= (size
> COPYBUFSIZE
) ? COPYBUFSIZE
: size
;
269 if ((r
= xfread(X
, buf
, n
)))
271 if ((r
= xfwrite(OX
, buf
, n
)))
280 DumpDumpEnd(XFILE
* OX
)
284 if ((r
= WriteTagInt32(OX
, TAG_DUMPEND
, DUMPENDMAGIC
)))