kml_unpack.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
  2.  * vim:expandtab:shiftwidth=8:tabstop=8:
  3.  *
  4.  *  Copyright (C) 2001 Cluster File Systems, Inc. <braam@clusterfs.com>
  5.  *
  6.  *   This file is part of InterMezzo, http://www.inter-mezzo.org.
  7.  *
  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.
  11.  *
  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.
  16.  *
  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.
  20.  *
  21.  * Unpacking of KML records
  22.  *
  23.  */
  24. #ifdef __KERNEL__
  25. #  include <linux/module.h>
  26. #  include <linux/errno.h>
  27. #  include <linux/kernel.h>
  28. #  include <linux/major.h>
  29. #  include <linux/sched.h>
  30. #  include <linux/lp.h>
  31. #  include <linux/slab.h>
  32. #  include <linux/ioport.h>
  33. #  include <linux/fcntl.h>
  34. #  include <linux/delay.h>
  35. #  include <linux/skbuff.h>
  36. #  include <linux/proc_fs.h>
  37. #  include <linux/vmalloc.h>
  38. #  include <linux/fs.h>
  39. #  include <linux/poll.h>
  40. #  include <linux/init.h>
  41. #  include <linux/list.h>
  42. #  include <linux/stat.h>
  43. #  include <asm/io.h>
  44. #  include <asm/segment.h>
  45. #  include <asm/system.h>
  46. #  include <asm/poll.h>
  47. #  include <asm/uaccess.h>
  48. #else
  49. #  include <time.h>
  50. #  include <stdio.h>
  51. #  include <string.h>
  52. #  include <stdlib.h>
  53. #  include <errno.h>
  54. #  include <sys/stat.h>
  55. #  include <glib.h>
  56. #endif
  57. #include <linux/intermezzo_lib.h>
  58. #include <linux/intermezzo_idl.h>
  59. #include <linux/intermezzo_fs.h>
  60. int kml_unpack_version(struct presto_version **ver, char **buf, char *end) 
  61. {
  62. char *ptr = *buf;
  63.         struct presto_version *pv;
  64. UNLOGP(*ver, struct presto_version, ptr, end);
  65.         pv = *ver;
  66.         pv->pv_mtime   = NTOH__u64(pv->pv_mtime);
  67.         pv->pv_ctime   = NTOH__u64(pv->pv_ctime);
  68.         pv->pv_size    = NTOH__u64(pv->pv_size);
  69. *buf = ptr;
  70.         return 0;
  71. }
  72. static int kml_unpack_noop(struct kml_rec *rec, char **buf, char *end)
  73. {
  74. return 0;
  75. }
  76.  
  77. static int kml_unpack_get_fileid(struct kml_rec *rec, char **buf, char *end)
  78. {
  79. char *ptr = *buf;
  80. LUNLOGV(rec->pathlen, __u32, ptr, end);
  81. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  82. *buf = ptr;
  83. return 0;
  84. }
  85. static int kml_unpack_create(struct kml_rec *rec, char **buf, char *end)
  86. {
  87. char *ptr = *buf;
  88. kml_unpack_version(&rec->old_parentv, &ptr, end);
  89. kml_unpack_version(&rec->new_parentv, &ptr, end);
  90. kml_unpack_version(&rec->new_objectv, &ptr, end);
  91. LUNLOGV(rec->mode, __u32, ptr, end);
  92. LUNLOGV(rec->uid, __u32, ptr, end);
  93. LUNLOGV(rec->gid, __u32, ptr, end);
  94. LUNLOGV(rec->pathlen, __u32, ptr, end);
  95. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  96. *buf = ptr;
  97. return 0;
  98. }
  99.  
  100. static int kml_unpack_mkdir(struct kml_rec *rec, char **buf, char *end)
  101. {
  102. char *ptr = *buf;
  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);
  111. *buf = ptr;
  112. return 0;
  113. }
  114. static int kml_unpack_unlink(struct kml_rec *rec, char **buf, char *end)
  115. {
  116. char *ptr = *buf;
  117. kml_unpack_version(&rec->old_parentv, &ptr, end);
  118. kml_unpack_version(&rec->new_parentv, &ptr, end);
  119. kml_unpack_version(&rec->old_objectv, &ptr, end);
  120.         LUNLOGV(rec->old_mode, __u32, ptr, end);
  121.         LUNLOGV(rec->old_rdev, __u32, ptr, end);
  122.         LUNLOGV(rec->old_uid, __u64, ptr, end);
  123.         LUNLOGV(rec->old_gid, __u64, ptr, end);
  124. LUNLOGV(rec->pathlen, __u32, ptr, end);
  125. LUNLOGV(rec->targetlen, __u32, ptr, end);
  126.         LUNLOGV(rec->old_targetlen, __u32, ptr, end);
  127. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  128. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  129.         UNLOGL(rec->old_target, char, rec->old_targetlen, ptr, end);
  130. *buf = ptr;
  131. return 0;
  132. }
  133. static int kml_unpack_rmdir(struct kml_rec *rec, char **buf, char *end)
  134. {
  135. char *ptr = *buf;
  136. kml_unpack_version(&rec->old_parentv, &ptr, end);
  137. kml_unpack_version(&rec->new_parentv, &ptr, end);
  138. kml_unpack_version(&rec->old_objectv, &ptr, end);
  139.         LUNLOGV(rec->old_mode, __u32, ptr, end);
  140.         LUNLOGV(rec->old_rdev, __u32, ptr, end);
  141.         LUNLOGV(rec->old_uid, __u64, ptr, end);
  142.         LUNLOGV(rec->old_gid, __u64, ptr, end);
  143. LUNLOGV(rec->pathlen, __u32, ptr, end);
  144. LUNLOGV(rec->targetlen, __u32, ptr, end);
  145. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  146. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  147. *buf = ptr;
  148. return 0;
  149. }
  150. static int kml_unpack_close(struct kml_rec *rec, char **buf, char *end)
  151. {
  152. char *ptr = *buf;
  153. LUNLOGV(rec->mode, __u32, ptr, end);  // used for open_mode
  154. LUNLOGV(rec->uid, __u32, ptr, end);   // used for open_uid
  155. LUNLOGV(rec->gid, __u32, ptr, end);   // used for open_gid
  156. kml_unpack_version(&rec->old_objectv, &ptr, end);
  157. kml_unpack_version(&rec->new_objectv, &ptr, end);
  158. LUNLOGV(rec->ino, __u64, ptr, end);
  159. LUNLOGV(rec->generation, __u32, ptr, end);
  160. LUNLOGV(rec->pathlen, __u32, ptr, end);
  161. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  162. *buf = ptr;
  163. return 0;
  164. }
  165. static int kml_unpack_symlink(struct kml_rec *rec, char **buf, char *end)
  166. {
  167. char *ptr = *buf;
  168. kml_unpack_version(&rec->old_parentv, &ptr, end);
  169. kml_unpack_version(&rec->new_parentv, &ptr, end);
  170. kml_unpack_version(&rec->new_objectv, &ptr, end);
  171. LUNLOGV(rec->uid, __u32, ptr, end);
  172. LUNLOGV(rec->gid, __u32, ptr, end);
  173. LUNLOGV(rec->pathlen, __u32, ptr, end);
  174. LUNLOGV(rec->targetlen, __u32, ptr, end);
  175. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  176. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  177. *buf = ptr;
  178. return 0;
  179. }
  180. static int kml_unpack_rename(struct kml_rec *rec, char **buf, char *end)
  181. {
  182. char *ptr = *buf;
  183. kml_unpack_version(&rec->old_objectv, &ptr, end);
  184. kml_unpack_version(&rec->new_objectv, &ptr, end);
  185. kml_unpack_version(&rec->old_parentv, &ptr, end);
  186. kml_unpack_version(&rec->new_parentv, &ptr, end);
  187. LUNLOGV(rec->pathlen, __u32, ptr, end);
  188. LUNLOGV(rec->targetlen, __u32, ptr, end);
  189. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  190. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  191. *buf = ptr;
  192. return 0;
  193. }
  194. static int kml_unpack_setattr(struct kml_rec *rec, char **buf, char *end)
  195. {
  196. char *ptr = *buf;
  197. kml_unpack_version(&rec->old_objectv, &ptr, end);
  198. LUNLOGV(rec->valid, __u32, ptr, end);
  199. LUNLOGV(rec->mode, __u32, ptr, end);
  200. LUNLOGV(rec->uid, __u32, ptr, end);
  201. LUNLOGV(rec->gid, __u32, ptr, end);
  202. LUNLOGV(rec->size, __u64, ptr, end);
  203. LUNLOGV(rec->mtime, __u64, ptr, end);
  204. LUNLOGV(rec->ctime, __u64, ptr, end);
  205. LUNLOGV(rec->flags, __u32, ptr, end);
  206.         LUNLOGV(rec->old_mode, __u32, ptr, end);
  207.         LUNLOGV(rec->old_rdev, __u32, ptr, end);
  208.         LUNLOGV(rec->old_uid, __u64, ptr, end);
  209.         LUNLOGV(rec->old_gid, __u64, ptr, end);
  210. LUNLOGV(rec->pathlen, __u32, ptr, end);
  211. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  212. *buf = ptr;
  213. return 0;
  214. }
  215. static int kml_unpack_link(struct kml_rec *rec, char **buf, char *end)
  216. {
  217. char *ptr = *buf;
  218. kml_unpack_version(&rec->old_parentv, &ptr, end);
  219. kml_unpack_version(&rec->new_parentv, &ptr, end);
  220. kml_unpack_version(&rec->new_objectv, &ptr, end);
  221. LUNLOGV(rec->pathlen, __u32, ptr, end);
  222. LUNLOGV(rec->targetlen, __u32, ptr, end);
  223. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  224. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  225. *buf = ptr;
  226. return 0;
  227. }
  228. static int kml_unpack_mknod(struct kml_rec *rec, char **buf, char *end)
  229. {
  230. char *ptr = *buf;
  231. kml_unpack_version(&rec->old_parentv, &ptr, end);
  232. kml_unpack_version(&rec->new_parentv, &ptr, end);
  233. kml_unpack_version(&rec->new_objectv, &ptr, end);
  234. LUNLOGV(rec->mode, __u32, ptr, end);
  235. LUNLOGV(rec->uid, __u32, ptr, end);
  236. LUNLOGV(rec->gid, __u32, ptr, end);
  237. LUNLOGV(rec->major, __u32, ptr, end);
  238. LUNLOGV(rec->minor, __u32, ptr, end);
  239. LUNLOGV(rec->pathlen, __u32, ptr, end);
  240. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  241. *buf = ptr;
  242. return 0;
  243. }
  244. static int kml_unpack_write(struct kml_rec *rec, char **buf, char *end)
  245. {
  246. printf("NOT IMPLEMENTED");
  247. return 0;
  248. }
  249. static int kml_unpack_release(struct kml_rec *rec, char **buf, char *end)
  250. {
  251. printf("NOT IMPLEMENTED");
  252. return 0;
  253. }
  254. static int kml_unpack_trunc(struct kml_rec *rec, char **buf, char *end)
  255. {
  256. printf("NOT IMPLEMENTED");
  257. return 0;
  258. }
  259. static int kml_unpack_setextattr(struct kml_rec *rec, char **buf, char *end)
  260. {
  261. char *ptr = *buf;
  262. kml_unpack_version(&rec->old_objectv, &ptr, end);
  263. kml_unpack_version(&rec->new_objectv, &ptr, end);
  264. LUNLOGV(rec->flags, __u32, ptr, end);
  265. LUNLOGV(rec->mode, __u32, ptr, end);
  266. LUNLOGV(rec->pathlen, __u32, ptr, end);
  267. LUNLOGV(rec->namelen, __u32, ptr, end);
  268. LUNLOGV(rec->targetlen, __u32, ptr, end);
  269.         UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  270. UNLOGL(rec->name, char, rec->namelen, ptr, end);
  271. UNLOGL(rec->target, char, rec->targetlen, ptr, end);
  272. *buf = ptr;
  273. return 0;
  274. }
  275. static int kml_unpack_delextattr(struct kml_rec *rec, char **buf, char *end)
  276. {
  277. char *ptr = *buf;
  278. kml_unpack_version(&rec->old_objectv, &ptr, end);
  279. kml_unpack_version(&rec->new_objectv, &ptr, end);
  280. LUNLOGV(rec->flags, __u32, ptr, end);
  281. LUNLOGV(rec->mode, __u32, ptr, end);
  282. LUNLOGV(rec->pathlen, __u32, ptr, end);
  283. LUNLOGV(rec->namelen, __u32, ptr, end);
  284. LUNLOGV(rec->targetlen, __u32, ptr, end);
  285. UNLOGL(rec->path, char, rec->pathlen, ptr, end);
  286. UNLOGL(rec->name, char, rec->namelen, ptr, end);
  287. *buf = ptr;
  288. return 0;
  289. }
  290. static int kml_unpack_open(struct kml_rec *rec, char **buf, char *end)
  291. {
  292. printf("NOT IMPLEMENTED");
  293. return 0;
  294. }
  295. static int kml_unpack_kml_trunc(struct kml_rec *rec, char **buf, char *end)
  296. {
  297. printf("NOT IMPLEMENTED");
  298. return 0;
  299. }
  300. typedef int (*unpacker)(struct kml_rec *rec, char **buf, char *end);
  301. static unpacker unpackers[KML_OPCODE_NUM] = 
  302. {
  303. [KML_OPCODE_NOOP] = kml_unpack_noop,
  304. [KML_OPCODE_CREATE] = kml_unpack_create, 
  305. [KML_OPCODE_MKDIR] = kml_unpack_mkdir,
  306. [KML_OPCODE_UNLINK] = kml_unpack_unlink,
  307. [KML_OPCODE_RMDIR] = kml_unpack_rmdir,
  308. [KML_OPCODE_CLOSE] = kml_unpack_close,
  309. [KML_OPCODE_SYMLINK] = kml_unpack_symlink,
  310. [KML_OPCODE_RENAME] = kml_unpack_rename,
  311. [KML_OPCODE_SETATTR] = kml_unpack_setattr,
  312. [KML_OPCODE_LINK] = kml_unpack_link,
  313. [KML_OPCODE_OPEN] = kml_unpack_open,
  314. [KML_OPCODE_MKNOD] = kml_unpack_mknod,
  315. [KML_OPCODE_WRITE] = kml_unpack_write,
  316. [KML_OPCODE_RELEASE] = kml_unpack_release,
  317. [KML_OPCODE_TRUNC] = kml_unpack_trunc,
  318. [KML_OPCODE_SETEXTATTR] = kml_unpack_setextattr,
  319. [KML_OPCODE_DELEXTATTR] = kml_unpack_delextattr,
  320. [KML_OPCODE_KML_TRUNC] = kml_unpack_kml_trunc,
  321. [KML_OPCODE_GET_FILEID] = kml_unpack_get_fileid
  322. };
  323. int kml_unpack_prefix(struct kml_rec *rec, char **buf, char *end) 
  324. {
  325. char *ptr = *buf;
  326.         int n;
  327.         UNLOGP(rec->prefix.hdr, struct kml_prefix_hdr, ptr, end);
  328.         rec->prefix.hdr->len     = NTOH__u32(rec->prefix.hdr->len);
  329.         rec->prefix.hdr->version = NTOH__u32(rec->prefix.hdr->version);
  330.         rec->prefix.hdr->pid     = NTOH__u32(rec->prefix.hdr->pid);
  331.         rec->prefix.hdr->auid    = NTOH__u32(rec->prefix.hdr->auid);
  332.         rec->prefix.hdr->fsuid   = NTOH__u32(rec->prefix.hdr->fsuid);
  333.         rec->prefix.hdr->fsgid   = NTOH__u32(rec->prefix.hdr->fsgid);
  334.         rec->prefix.hdr->opcode  = NTOH__u32(rec->prefix.hdr->opcode);
  335.         rec->prefix.hdr->ngroups = NTOH__u32(rec->prefix.hdr->ngroups);
  336. UNLOGL(rec->prefix.groups, __u32, rec->prefix.hdr->ngroups, ptr, end);
  337.         for (n = 0; n < rec->prefix.hdr->ngroups; n++) {
  338.                 rec->prefix.groups[n] = NTOH__u32(rec->prefix.groups[n]);
  339.         }
  340. *buf = ptr;
  341.         return 0;
  342. }
  343. int kml_unpack_suffix(struct kml_rec *rec, char **buf, char *end) 
  344. {
  345. char *ptr = *buf;
  346. UNLOGP(rec->suffix, struct kml_suffix, ptr, end);
  347.         rec->suffix->prevrec   = NTOH__u32(rec->suffix->prevrec);
  348.         rec->suffix->recno    = NTOH__u32(rec->suffix->recno);
  349.         rec->suffix->time     = NTOH__u32(rec->suffix->time);
  350.         rec->suffix->len      = NTOH__u32(rec->suffix->len);
  351. *buf = ptr;
  352.         return 0;
  353. }
  354. int kml_unpack(struct kml_rec *rec, char **buf, char *end)
  355. {
  356. char *ptr = *buf;
  357. int err; 
  358.         if (((unsigned long)ptr % 4) != 0) {
  359.                 printf("InterMezzo: %s: record misaligned.n", __FUNCTION__);
  360.                 return -EINVAL;
  361.         }
  362.         while (ptr < end) { 
  363.                 __u32 *i = (__u32 *)ptr;
  364.                 if (*i)
  365.                         break;
  366.                 ptr += sizeof(*i);
  367.         }
  368. *buf = ptr;
  369. memset(rec, 0, sizeof(*rec));
  370.         err = kml_unpack_prefix(rec, &ptr, end);
  371. if (err) {
  372.                 printf("InterMezzo: %s: unpack_prefix failed: %dn",
  373.                        __FUNCTION__, err);
  374. return err;
  375.         }
  376.         if (rec->prefix.hdr->opcode < 0  ||
  377.             rec->prefix.hdr->opcode >= KML_OPCODE_NUM) {
  378.                 printf("InterMezzo: %s: invalid opcode (%d)n",
  379.                        __FUNCTION__, rec->prefix.hdr->opcode);
  380. return -EINVAL;
  381.         }
  382. err = unpackers[rec->prefix.hdr->opcode](rec, &ptr, end);
  383. if (err) {
  384.                 printf("InterMezzo: %s: unpacker failed: %dn",
  385.                        __FUNCTION__, err);
  386. return err;
  387.         }
  388.         err = kml_unpack_suffix(rec, &ptr, end);
  389. if (err) {
  390.                 printf("InterMezzo: %s: unpack_suffix failed: %dn",
  391.                        __FUNCTION__, err);
  392. return err;
  393.         }
  394. if (rec->prefix.hdr->len != rec->suffix->len) {
  395.                 printf("InterMezzo: %s: lengths don't matchn",
  396.                        __FUNCTION__);
  397. return -EINVAL;
  398.         }
  399.         if ((rec->prefix.hdr->len % 4) != 0) {
  400.                 printf("InterMezzo: %s: record length not a "
  401.                        "multiple of 4.n", __FUNCTION__);
  402.                 return -EINVAL;
  403.         }
  404.         if (ptr - *buf != rec->prefix.hdr->len) {
  405.                 printf("InterMezzo: %s: unpacking errorn",
  406.                        __FUNCTION__);
  407.                 return -EINVAL;
  408.         }
  409.         while (ptr < end) { 
  410.                 __u32 *i = (__u32 *)ptr;
  411.                 if (*i)
  412.                         break;
  413.                 ptr += sizeof(*i);
  414.         }
  415. *buf = ptr;
  416. return 0;
  417. }
  418. #ifndef __KERNEL__
  419. #define STR(ptr) ((ptr))? (ptr) : ""
  420. #define OPNAME(n) [KML_OPCODE_##n] = #n
  421. static char *opnames[KML_OPCODE_NUM] = {
  422. OPNAME(NOOP),
  423. OPNAME(CREATE),
  424. OPNAME(MKDIR), 
  425. OPNAME(UNLINK),
  426. OPNAME(RMDIR),
  427. OPNAME(CLOSE),
  428. OPNAME(SYMLINK),
  429. OPNAME(RENAME),
  430. OPNAME(SETATTR),
  431. OPNAME(LINK),
  432. OPNAME(OPEN),
  433. OPNAME(MKNOD),
  434. OPNAME(WRITE),
  435. OPNAME(RELEASE),
  436. OPNAME(TRUNC),
  437. OPNAME(SETEXTATTR),
  438. OPNAME(DELEXTATTR),
  439. OPNAME(KML_TRUNC),
  440. OPNAME(GET_FILEID)
  441. };
  442. #undef OPNAME
  443. static char *print_opname(int op)
  444. {
  445. if (op < 0 || op >= sizeof (opnames) / sizeof (*opnames))
  446. return NULL;
  447. return opnames[op];
  448. }
  449. static char *print_time(__u64 i)
  450. {
  451. char buf[128];
  452. memset(buf, 0, 128);
  453. #ifndef __KERNEL__
  454. strftime(buf, 128, "%Y/%m/%d %H:%M:%S", gmtime((time_t *)&i));
  455. #else
  456. sprintf(buf, "%Ldn", i);
  457. #endif
  458. return strdup(buf);
  459. }
  460. static char *print_version(struct presto_version *ver)
  461. {
  462. char ver_buf[128];
  463. char *mtime;
  464. char *ctime;
  465. if (!ver || ver->pv_ctime == 0) {
  466. return strdup("");
  467. mtime = print_time(ver->pv_mtime);
  468. ctime = print_time(ver->pv_ctime);
  469. sprintf(ver_buf, "mtime %s, ctime %s, len %lld", 
  470. mtime, ctime, ver->pv_size);
  471. free(mtime);
  472. free(ctime);
  473. return strdup(ver_buf);
  474. }
  475. char *kml_print_rec(struct kml_rec *rec, int brief)
  476. {
  477. char *str;
  478. char *nov, *oov, *ntv, *otv, *npv, *opv;
  479. char *rectime, *mtime, *ctime;
  480.         if (brief) {
  481. str = g_strdup_printf(" %08d %7s %*s %*s", 
  482.                                       rec->suffix->recno,
  483.                                       print_opname (rec->prefix.hdr->opcode),
  484.                                       rec->pathlen, STR(rec->path),
  485.                                       rec->targetlen, STR(rec->target));
  486.                 
  487. return str;
  488. }
  489. rectime = print_time(rec->suffix->time);
  490. mtime = print_time(rec->mtime);
  491. ctime = print_time(rec->ctime);
  492. nov = print_version(rec->new_objectv);
  493. oov = print_version(rec->old_objectv);
  494. ntv = print_version(rec->new_targetv);
  495. otv = print_version(rec->old_targetv);
  496. npv = print_version(rec->new_parentv);
  497. opv = print_version(rec->old_parentv);
  498. str = g_strdup_printf("n -- Record:n"
  499. "    Recno     %dn"
  500. "    KML off   %lldn" 
  501. "    Version   %dn" 
  502. "    Len       %dn"
  503. "    Suf len   %dn"
  504. "    Time      %sn"
  505. "    Opcode    %dn"
  506. "    Op        %sn"
  507. "    Pid       %dn"
  508. "    AUid      %dn"
  509. "    Fsuid     %dn" 
  510. "    Fsgid     %dn"
  511. "    Prevrec   %dn" 
  512. "    Ngroups   %dn"
  513. //"    Groups    @{$self->{groups}}n" 
  514. " -- Path:n"
  515. "    Inode     %dn"
  516. "    Gen num   %un"
  517.                 "    Old mode  %on"
  518.                 "    Old rdev  %xn"
  519.                 "    Old uid   %llun"
  520.                 "    Old gid   %llun"
  521. "    Path      %*sn"
  522. //"    Open_mode %on",
  523. "    Pathlen   %dn"
  524. "    Tgt       %*sn"
  525. "    Tgtlen    %dn" 
  526. "    Old Tgt   %*sn"
  527. "    Old Tgtln %dn" 
  528. " -- Attr:n"
  529. "    Valid     %xn"
  530. "    mode %o, uid %d, gid %d, size %lld, mtime %s, ctime %s rdev %x (%d:%d)n"
  531. " -- Versions:n"
  532. "    New object %sn"
  533. "    Old object %sn"
  534. "    New target %sn"
  535. "    Old target %sn"
  536. "    New parent %sn"
  537. "    Old parent %sn", 
  538. rec->suffix->recno, 
  539. rec->offset, 
  540. rec->prefix.hdr->version, 
  541. rec->prefix.hdr->len, 
  542. rec->suffix->len, 
  543. rectime,
  544. rec->prefix.hdr->opcode, 
  545. print_opname (rec->prefix.hdr->opcode),
  546. rec->prefix.hdr->pid,
  547. rec->prefix.hdr->auid,
  548. rec->prefix.hdr->fsuid,
  549. rec->prefix.hdr->fsgid,
  550. rec->suffix->prevrec,
  551. rec->prefix.hdr->ngroups,
  552. rec->ino,
  553. rec->generation,
  554.                 rec->old_mode,
  555.                 rec->old_rdev,
  556.                 rec->old_uid,
  557.                 rec->old_gid,
  558. rec->pathlen,
  559. STR(rec->path),
  560. rec->pathlen,
  561. rec->targetlen,
  562. STR(rec->target),
  563. rec->targetlen,
  564. rec->old_targetlen,
  565. STR(rec->old_target),
  566. rec->old_targetlen,
  567. rec->valid, 
  568. rec->mode,
  569. rec->uid,
  570. rec->gid,
  571. rec->size,
  572. mtime,
  573. ctime,
  574. rec->rdev, rec->major, rec->minor,
  575. nov, oov, ntv, otv, npv, opv);
  576. free(nov);
  577. free(oov);
  578. free(ntv);
  579. free(otv);
  580. free(npv);
  581. free(opv);
  582. free(rectime); 
  583. free(ctime);
  584. free(mtime);
  585. return str;
  586. }
  587. #endif