1 /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
2 * vim:expandtab:shiftwidth=8:tabstop=8:
4 * Copyright (C) 2001 Cluster File Systems, Inc. <braam@clusterfs.com>
6 * This file is part of InterMezzo, http://www.inter-mezzo.org.
8 * InterMezzo is free software; you can redistribute it and/or
9 * modify it under the terms of version 2 of the GNU General Public
10 * License as published by the Free Software Foundation.
12 * InterMezzo is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License
18 * along with InterMezzo; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 * Unpacking of KML records
26 # include <linux/module.h>
27 # include <linux/errno.h>
28 # include <linux/kernel.h>
29 # include <linux/major.h>
30 # include <linux/sched.h>
31 # include <linux/lp.h>
32 # include <linux/slab.h>
33 # include <linux/ioport.h>
34 # include <linux/fcntl.h>
35 # include <linux/delay.h>
36 # include <linux/skbuff.h>
37 # include <linux/proc_fs.h>
38 # include <linux/vmalloc.h>
39 # include <linux/fs.h>
40 # include <linux/poll.h>
41 # include <linux/init.h>
42 # include <linux/list.h>
43 # include <linux/stat.h>
45 # include <asm/segment.h>
46 # include <asm/system.h>
47 # include <asm/poll.h>
48 # include <asm/uaccess.h>
55 # include <sys/stat.h>
59 #include "intermezzo_lib.h"
60 #include "intermezzo_idl.h"
61 #include "intermezzo_fs.h"
63 int kml_unpack_version(struct presto_version **ver, char **buf, char *end)
66 struct presto_version *pv;
68 UNLOGP(*ver, struct presto_version, ptr, end);
70 pv->pv_mtime_sec = NTOH__u32(pv->pv_mtime_sec);
71 pv->pv_mtime_nsec = NTOH__u32(pv->pv_mtime_nsec);
72 pv->pv_ctime_sec = NTOH__u32(pv->pv_ctime_sec);
73 pv->pv_ctime_nsec = NTOH__u32(pv->pv_ctime_nsec);
74 pv->pv_size = NTOH__u64(pv->pv_size);
82 static int kml_unpack_noop(struct kml_rec *rec, char **buf, char *end)
88 static int kml_unpack_get_fileid(struct kml_rec *rec, char **buf, char *end)
92 LUNLOGV(rec->pathlen, __u32, ptr, end);
93 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
99 static int kml_unpack_create(struct kml_rec *rec, char **buf, char *end)
103 kml_unpack_version(&rec->old_parentv, &ptr, end);
104 kml_unpack_version(&rec->new_parentv, &ptr, end);
105 kml_unpack_version(&rec->new_objectv, &ptr, end);
106 LUNLOGV(rec->mode, __u32, ptr, end);
107 LUNLOGV(rec->uid, __u32, ptr, end);
108 LUNLOGV(rec->gid, __u32, ptr, end);
109 LUNLOGV(rec->pathlen, __u32, ptr, end);
110 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
118 static int kml_unpack_mkdir(struct kml_rec *rec, char **buf, char *end)
122 kml_unpack_version(&rec->old_parentv, &ptr, end);
123 kml_unpack_version(&rec->new_parentv, &ptr, end);
124 kml_unpack_version(&rec->new_objectv, &ptr, end);
125 LUNLOGV(rec->mode, __u32, ptr, end);
126 LUNLOGV(rec->uid, __u32, ptr, end);
127 LUNLOGV(rec->gid, __u32, ptr, end);
128 LUNLOGV(rec->pathlen, __u32, ptr, end);
129 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
137 static int kml_unpack_unlink(struct kml_rec *rec, char **buf, char *end)
141 kml_unpack_version(&rec->old_parentv, &ptr, end);
142 kml_unpack_version(&rec->new_parentv, &ptr, end);
143 kml_unpack_version(&rec->old_objectv, &ptr, end);
144 LUNLOGV(rec->old_mode, __u32, ptr, end);
145 LUNLOGV(rec->old_rdev, __u32, ptr, end);
146 LUNLOGV(rec->old_uid, __u64, ptr, end);
147 LUNLOGV(rec->old_gid, __u64, ptr, end);
148 LUNLOGV(rec->pathlen, __u32, ptr, end);
149 LUNLOGV(rec->targetlen, __u32, ptr, end);
150 LUNLOGV(rec->old_targetlen, __u32, ptr, end);
151 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
152 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
153 UNLOGL(rec->old_target, char, rec->old_targetlen, ptr, end);
161 static int kml_unpack_rmdir(struct kml_rec *rec, char **buf, char *end)
165 kml_unpack_version(&rec->old_parentv, &ptr, end);
166 kml_unpack_version(&rec->new_parentv, &ptr, end);
167 kml_unpack_version(&rec->old_objectv, &ptr, end);
168 LUNLOGV(rec->old_mode, __u32, ptr, end);
169 LUNLOGV(rec->old_rdev, __u32, ptr, end);
170 LUNLOGV(rec->old_uid, __u64, ptr, end);
171 LUNLOGV(rec->old_gid, __u64, ptr, end);
172 LUNLOGV(rec->pathlen, __u32, ptr, end);
173 LUNLOGV(rec->targetlen, __u32, ptr, end);
174 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
175 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
183 static int kml_unpack_close(struct kml_rec *rec, char **buf, char *end)
187 LUNLOGV(rec->mode, __u32, ptr, end); // used for open_mode
188 LUNLOGV(rec->uid, __u32, ptr, end); // used for open_uid
189 LUNLOGV(rec->gid, __u32, ptr, end); // used for open_gid
190 kml_unpack_version(&rec->old_objectv, &ptr, end);
191 kml_unpack_version(&rec->new_objectv, &ptr, end);
192 LUNLOGV(rec->ino, __u64, ptr, end);
193 LUNLOGV(rec->generation, __u32, ptr, end);
194 LUNLOGV(rec->pathlen, __u32, ptr, end);
195 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
203 static int kml_unpack_symlink(struct kml_rec *rec, char **buf, char *end)
207 kml_unpack_version(&rec->old_parentv, &ptr, end);
208 kml_unpack_version(&rec->new_parentv, &ptr, end);
209 kml_unpack_version(&rec->new_objectv, &ptr, end);
210 LUNLOGV(rec->uid, __u32, ptr, end);
211 LUNLOGV(rec->gid, __u32, ptr, end);
212 LUNLOGV(rec->pathlen, __u32, ptr, end);
213 LUNLOGV(rec->targetlen, __u32, ptr, end);
214 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
215 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
223 static int kml_unpack_rename(struct kml_rec *rec, char **buf, char *end)
227 kml_unpack_version(&rec->old_objectv, &ptr, end);
228 kml_unpack_version(&rec->new_objectv, &ptr, end);
229 kml_unpack_version(&rec->old_parentv, &ptr, end);
230 kml_unpack_version(&rec->new_parentv, &ptr, end);
231 LUNLOGV(rec->pathlen, __u32, ptr, end);
232 LUNLOGV(rec->targetlen, __u32, ptr, end);
233 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
234 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
242 static int kml_unpack_setattr(struct kml_rec *rec, char **buf, char *end)
246 kml_unpack_version(&rec->old_objectv, &ptr, end);
247 LUNLOGV(rec->valid, __u32, ptr, end);
248 LUNLOGV(rec->mode, __u32, ptr, end);
249 LUNLOGV(rec->uid, __u32, ptr, end);
250 LUNLOGV(rec->gid, __u32, ptr, end);
251 LUNLOGV(rec->size, __u64, ptr, end);
252 LUNLOGV(rec->mtime_sec, __u32, ptr, end);
253 LUNLOGV(rec->mtime_nsec, __u32, ptr, end);
254 LUNLOGV(rec->ctime_sec, __u32, ptr, end);
255 LUNLOGV(rec->ctime_nsec, __u32, ptr, end);
256 LUNLOGV(rec->flags, __u32, ptr, end);
257 LUNLOGV(rec->old_mode, __u32, ptr, end);
258 LUNLOGV(rec->old_rdev, __u32, ptr, end);
259 LUNLOGV(rec->old_uid, __u64, ptr, end);
260 LUNLOGV(rec->old_gid, __u64, ptr, end);
261 LUNLOGV(rec->pathlen, __u32, ptr, end);
262 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
270 static int kml_unpack_link(struct kml_rec *rec, char **buf, char *end)
274 kml_unpack_version(&rec->old_parentv, &ptr, end);
275 kml_unpack_version(&rec->new_parentv, &ptr, end);
276 kml_unpack_version(&rec->new_objectv, &ptr, end);
277 LUNLOGV(rec->pathlen, __u32, ptr, end);
278 LUNLOGV(rec->targetlen, __u32, ptr, end);
279 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
280 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
287 static int kml_unpack_mknod(struct kml_rec *rec, char **buf, char *end)
291 kml_unpack_version(&rec->old_parentv, &ptr, end);
292 kml_unpack_version(&rec->new_parentv, &ptr, end);
293 kml_unpack_version(&rec->new_objectv, &ptr, end);
294 LUNLOGV(rec->mode, __u32, ptr, end);
295 LUNLOGV(rec->uid, __u32, ptr, end);
296 LUNLOGV(rec->gid, __u32, ptr, end);
297 LUNLOGV(rec->major, __u32, ptr, end);
298 LUNLOGV(rec->minor, __u32, ptr, end);
299 LUNLOGV(rec->pathlen, __u32, ptr, end);
300 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
308 static int kml_unpack_write(struct kml_rec *rec, char **buf, char *end)
310 printf("NOT IMPLEMENTED");
315 static int kml_unpack_release(struct kml_rec *rec, char **buf, char *end)
317 printf("NOT IMPLEMENTED");
322 static int kml_unpack_trunc(struct kml_rec *rec, char **buf, char *end)
324 printf("NOT IMPLEMENTED");
329 static int kml_unpack_setextattr(struct kml_rec *rec, char **buf, char *end)
333 kml_unpack_version(&rec->old_objectv, &ptr, end);
334 kml_unpack_version(&rec->new_objectv, &ptr, end);
335 LUNLOGV(rec->flags, __u32, ptr, end);
336 LUNLOGV(rec->mode, __u32, ptr, end);
337 LUNLOGV(rec->pathlen, __u32, ptr, end);
338 LUNLOGV(rec->namelen, __u32, ptr, end);
339 LUNLOGV(rec->targetlen, __u32, ptr, end);
340 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
341 UNLOGL(rec->name, char, rec->namelen, ptr, end);
342 UNLOGL(rec->target, char, rec->targetlen, ptr, end);
350 static int kml_unpack_delextattr(struct kml_rec *rec, char **buf, char *end)
354 kml_unpack_version(&rec->old_objectv, &ptr, end);
355 kml_unpack_version(&rec->new_objectv, &ptr, end);
356 LUNLOGV(rec->flags, __u32, ptr, end);
357 LUNLOGV(rec->mode, __u32, ptr, end);
358 LUNLOGV(rec->pathlen, __u32, ptr, end);
359 LUNLOGV(rec->namelen, __u32, ptr, end);
360 LUNLOGV(rec->targetlen, __u32, ptr, end);
361 UNLOGL(rec->path, char, rec->pathlen, ptr, end);
362 UNLOGL(rec->name, char, rec->namelen, ptr, end);
369 static int kml_unpack_open(struct kml_rec *rec, char **buf, char *end)
371 printf("NOT IMPLEMENTED");
375 static int kml_unpack_kml_trunc(struct kml_rec *rec, char **buf, char *end)
378 printf("NOT IMPLEMENTED");
383 typedef int (*unpacker)(struct kml_rec *rec, char **buf, char *end);
385 static unpacker unpackers[KML_OPCODE_NUM] =
387 [KML_OPCODE_NOOP] = kml_unpack_noop,
388 [KML_OPCODE_CREATE] = kml_unpack_create,
389 [KML_OPCODE_MKDIR] = kml_unpack_mkdir,
390 [KML_OPCODE_UNLINK] = kml_unpack_unlink,
391 [KML_OPCODE_RMDIR] = kml_unpack_rmdir,
392 [KML_OPCODE_CLOSE] = kml_unpack_close,
393 [KML_OPCODE_SYMLINK] = kml_unpack_symlink,
394 [KML_OPCODE_RENAME] = kml_unpack_rename,
395 [KML_OPCODE_SETATTR] = kml_unpack_setattr,
396 [KML_OPCODE_LINK] = kml_unpack_link,
397 [KML_OPCODE_OPEN] = kml_unpack_open,
398 [KML_OPCODE_MKNOD] = kml_unpack_mknod,
399 [KML_OPCODE_WRITE] = kml_unpack_write,
400 [KML_OPCODE_RELEASE] = kml_unpack_release,
401 [KML_OPCODE_TRUNC] = kml_unpack_trunc,
402 [KML_OPCODE_SETEXTATTR] = kml_unpack_setextattr,
403 [KML_OPCODE_DELEXTATTR] = kml_unpack_delextattr,
404 [KML_OPCODE_KML_TRUNC] = kml_unpack_kml_trunc,
405 [KML_OPCODE_GET_FILEID] = kml_unpack_get_fileid
408 int kml_unpack_prefix(struct kml_rec *rec, char **buf, char *end)
413 UNLOGP(rec->prefix.hdr, struct kml_prefix_hdr, ptr, end);
414 rec->prefix.hdr->len = NTOH__u32(rec->prefix.hdr->len);
415 rec->prefix.hdr->version = NTOH__u32(rec->prefix.hdr->version);
416 rec->prefix.hdr->pid = NTOH__u32(rec->prefix.hdr->pid);
417 rec->prefix.hdr->auid = NTOH__u32(rec->prefix.hdr->auid);
418 rec->prefix.hdr->fsuid = NTOH__u32(rec->prefix.hdr->fsuid);
419 rec->prefix.hdr->fsgid = NTOH__u32(rec->prefix.hdr->fsgid);
420 rec->prefix.hdr->opcode = NTOH__u32(rec->prefix.hdr->opcode);
421 rec->prefix.hdr->ngroups = NTOH__u32(rec->prefix.hdr->ngroups);
423 UNLOGL(rec->prefix.groups, __u32, rec->prefix.hdr->ngroups, ptr, end);
424 for (n = 0; n < rec->prefix.hdr->ngroups; n++) {
425 rec->prefix.groups[n] = NTOH__u32(rec->prefix.groups[n]);
433 int kml_unpack_suffix(struct kml_rec *rec, char **buf, char *end)
437 UNLOGP(rec->suffix, struct kml_suffix, ptr, end);
438 rec->suffix->prevrec = NTOH__u32(rec->suffix->prevrec);
439 rec->suffix->recno = NTOH__u32(rec->suffix->recno);
440 rec->suffix->time = NTOH__u32(rec->suffix->time);
441 rec->suffix->len = NTOH__u32(rec->suffix->len);
448 int kml_unpack(struct kml_rec *rec, char **buf, char *end)
453 if (((unsigned long)ptr % 4) != 0) {
454 printf("InterMezzo: %s: record misaligned.\n", __FUNCTION__);
459 __u32 *i = (__u32 *)ptr;
466 memset(rec, 0, sizeof(*rec));
468 err = kml_unpack_prefix(rec, &ptr, end);
470 printf("InterMezzo: %s: unpack_prefix failed: %d\n",
475 if (rec->prefix.hdr->opcode < 0 ||
476 rec->prefix.hdr->opcode >= KML_OPCODE_NUM) {
477 printf("InterMezzo: %s: invalid opcode (%d)\n",
478 __FUNCTION__, rec->prefix.hdr->opcode);
481 err = unpackers[rec->prefix.hdr->opcode](rec, &ptr, end);
483 printf("InterMezzo: %s: unpacker failed: %d\n",
488 err = kml_unpack_suffix(rec, &ptr, end);
490 printf("InterMezzo: %s: unpack_suffix failed: %d\n",
496 if (rec->prefix.hdr->len != rec->suffix->len) {
497 printf("InterMezzo: %s: lengths don't match\n",
501 if ((rec->prefix.hdr->len % 4) != 0) {
502 printf("InterMezzo: %s: record length not a "
503 "multiple of 4.\n", __FUNCTION__);
506 if (ptr - *buf != rec->prefix.hdr->len) {
507 printf("InterMezzo: %s: unpacking error\n",
512 __u32 *i = (__u32 *)ptr;
523 #define STR(ptr) ((ptr))? (ptr) : ""
525 #define OPNAME(n) [KML_OPCODE_##n] = #n
526 static char *opnames[KML_OPCODE_NUM] = {
549 static char *print_opname(int op)
551 if (op < 0 || op >= sizeof (opnames) / sizeof (*opnames))
557 static char *print_time(__u64 i)
564 strftime(buf, 128, "%Y/%m/%d %H:%M:%S", gmtime((time_t *)&i));
566 sprintf(buf, "%Ld\n", i);
572 static char *print_version(struct presto_version *ver)
578 if (!ver || ver->pv_ctime == 0) {
581 mtime = print_time(ver->pv_mtime);
582 ctime = print_time(ver->pv_ctime);
583 sprintf(ver_buf, "mtime %s, ctime %s, len %lld",
584 mtime, ctime, ver->pv_size);
587 return strdup(ver_buf);
591 char *kml_print_rec(struct kml_rec *rec, int brief)
594 char *nov, *oov, *ntv, *otv, *npv, *opv;
595 char *rectime, *mtime, *ctime;
598 str = g_strdup_printf(" %08d %7s %*s %*s",
600 print_opname (rec->prefix.hdr->opcode),
601 rec->pathlen, STR(rec->path),
602 rec->targetlen, STR(rec->target));
607 rectime = print_time(rec->suffix->time);
608 mtime = print_time(rec->mtime);
609 ctime = print_time(rec->ctime);
611 nov = print_version(rec->new_objectv);
612 oov = print_version(rec->old_objectv);
613 ntv = print_version(rec->new_targetv);
614 otv = print_version(rec->old_targetv);
615 npv = print_version(rec->new_parentv);
616 opv = print_version(rec->old_parentv);
618 str = g_strdup_printf("\n -- Record:\n"
633 //" Groups @{$self->{groups}}\n"
650 " mode %o, uid %d, gid %d, size %lld, mtime %s, ctime %s rdev %x (%d:%d)\n"
661 rec->prefix.hdr->version,
662 rec->prefix.hdr->len,
665 rec->prefix.hdr->opcode,
666 print_opname (rec->prefix.hdr->opcode),
667 rec->prefix.hdr->pid,
668 rec->prefix.hdr->auid,
669 rec->prefix.hdr->fsuid,
670 rec->prefix.hdr->fsgid,
671 rec->suffix->prevrec,
672 rec->prefix.hdr->ngroups,
686 STR(rec->old_target),
696 rec->rdev, rec->major, rec->minor,
697 nov, oov, ntv, otv, npv, opv);