nfs_trace.c

Upload User: acmefrp
Upload Date: 2010-03-06
Package Size: 23768k
Code Size: 6k
Category: OS Develop
Development Platform: C/C++
  1. #ifndef lint
  2. static  char sccsid[] = "@(#)nfs_trace.c 1.1 92/07/30 Copyr 1987 Sun Micro";
  3. #endif
  4. /*
  5.  * Copyright (c) 1987 by Sun Microsystems, Inc.
  6.  */
  7. #include <stdio.h>
  8. #include <sys/types.h>
  9. #include <rpc/types.h>
  10. #include "nfs_prot.h"
  11. p_void()
  12. {
  13. }
  14. struct statent {
  15. nfsstat val;
  16. char *str;
  17. } stattab[] = {
  18. #define doit(XXX) { XXX, "XXX" },
  19. doit(NFS_OK)
  20. doit(NFSERR_PERM)
  21. doit(NFSERR_NOENT)
  22. doit(NFSERR_IO)
  23. doit(NFSERR_NXIO)
  24. doit(NFSERR_ACCES)
  25. doit(NFSERR_EXIST)
  26. doit(NFSERR_NODEV)
  27. doit(NFSERR_NOTDIR)
  28. doit(NFSERR_ISDIR)
  29. doit(NFSERR_FBIG)
  30. doit(NFSERR_NOSPC)
  31. doit(NFSERR_ROFS)
  32. doit(NFSERR_NAMETOOLONG)
  33. doit(NFSERR_NOTEMPTY)
  34. doit(NFSERR_DQUOT)
  35. doit(NFSERR_STALE)
  36. doit(NFSERR_WFLUSH)
  37. #undef doit
  38. };
  39. #define STATTABSIZE (sizeof(stattab)/sizeof(struct statent))
  40. p_nfsstat(status)
  41. nfsstat *status;
  42. {
  43. int i;
  44. for (i = 0; i < STATTABSIZE; i++) {
  45. if (stattab[i].val == *status) {
  46. fprintf(stderr, "stat=%s", stattab[i].str);
  47. return;
  48. }
  49. }
  50. fprintf(stderr, "stat=%d", *status);
  51. }
  52. p_fhandle(fh)
  53. nfs_fh *fh;
  54. {
  55. register int *ip = (int *)fh;
  56. fprintf(stderr, "fh=[%d, %d, %d]", ip[0], ip[1], ip[2]);
  57. }
  58. p_diropargs(d)
  59. diropargs *d;
  60. {
  61. p_fhandle(&d->dir);
  62. fprintf(stderr, ", name=%s", d->name);
  63. }
  64. p_nfstime(t)
  65. nfstime *t;
  66. {
  67. char *s;
  68. char *ctime();
  69. s = ctime((long *)&t->seconds);
  70. s[strlen(s) - 1] = 0;
  71. fprintf(stderr, "%s", s);
  72. }
  73. p_fattr(f)
  74. fattr *f;
  75. {
  76. fprintf(stderr, "type=%u, mode=%o, nlink=%u, uid=%u, gid=%u,
  77. size=%u, blocksize=%u, rdev=%u, blocks=%u, fsid=%u, fileid=%u",
  78. f->type, f->mode, f->nlink, f->uid, f->gid, f->size, 
  79. f->blocksize, f->rdev, f->blocks, f->fsid, f->fileid);
  80. fprintf(stderr, ", atime=");
  81. p_nfstime(&f->atime);
  82. fprintf(stderr, ", mtime=");
  83. p_nfstime(&f->mtime);
  84. fprintf(stderr, ", ctime=");
  85. p_nfstime(&f->ctime);
  86. }
  87. p_sattr(s)
  88. sattr *s;
  89. {
  90. fprintf(stderr, "mode=%o, uid=%u, gid=%u, size=%u", 
  91. s->mode, s->uid, s->gid, s->size);
  92. fprintf(stderr, ", atime=");
  93. p_nfstime(&s->atime);
  94. fprintf(stderr, ", mtime=");
  95. p_nfstime(&s->mtime);
  96. }
  97. p_diropres(d)
  98. diropres *d;
  99. {
  100. p_nfsstat(&d->status);
  101. if (d->status == NFS_OK) {
  102. fprintf(stderr, ", ");
  103. p_fhandle(&d->diropres_u.diropres.file);
  104. fprintf(stderr, ", ");
  105. p_fattr(&d->diropres_u.diropres.attributes);
  106. }
  107. }
  108. p_sattrargs(sa)
  109. sattrargs *sa;
  110. {
  111. p_fhandle(&sa->file);
  112. fprintf(stderr, ", ");
  113. p_sattr(&sa->attributes);
  114. }
  115. p_attrstat(as)
  116. attrstat *as;
  117. {
  118. p_nfsstat(&as->status);
  119. if (as->status == NFS_OK) {
  120. fprintf(stderr, ", ");
  121. p_fattr(&as->attrstat_u.attributes);
  122. }
  123. }
  124. p_readlinkres(r)
  125. readlinkres *r;
  126. {
  127. p_nfsstat(&r->status);
  128. if (r->status == NFS_OK) {
  129. fprintf(stderr, ", data=%s", r->readlinkres_u.data);
  130. }
  131. }
  132. p_readargs(r)
  133. readargs *r;
  134. {
  135. p_fhandle(&r->file);
  136. fprintf(stderr, ", offset=%u, count=%u", r->offset, r->count);
  137. }
  138. p_readres(r)
  139. readres *r;
  140. {
  141. p_nfsstat(&r->status);
  142. if (r->status == NFS_OK) {
  143. fprintf(stderr, ", ");
  144. p_fattr(&r->readres_u.reply.attributes);
  145. fprintf(stderr, ", len=%u, data=(data)",
  146. r->readres_u.reply.data.data_len);
  147. }
  148. }
  149. p_writeargs(w)
  150. writeargs *w;
  151. {
  152. p_fhandle(&w->file);
  153. fprintf(stderr, ", offset=%u, len=%u, data=(data)", 
  154. w->offset, w->data.data_len);
  155. }
  156. p_createargs(c)
  157. createargs *c;
  158. {
  159. p_diropargs(&c->where);
  160. fprintf(stderr, ", ");
  161. p_sattr(&c->attributes);
  162. }
  163. p_renameargs(r)
  164. renameargs *r;
  165. {
  166. p_diropargs(&r->from); 
  167. fprintf(stderr, ", ");
  168. p_diropargs(&r->to);
  169. }
  170. p_linkargs(args)
  171. linkargs *args;
  172. {
  173. p_fhandle(&args->from);
  174. fprintf(stderr, ", ");
  175. p_diropargs(&args->to);
  176. }
  177. p_symlinkargs(args)
  178. symlinkargs *args;
  179. {
  180. p_diropargs(&args->from);
  181. fprintf(stderr, ", to=%s, ", args->to);
  182. p_sattr(&args->attributes);
  183. }
  184. p_statfsres(res)
  185. statfsres *res;
  186. {
  187. p_nfsstat(&res->status);
  188. if (res->status == NFS_OK) {
  189. fprintf(stderr, ", tsize=%d, bsize=%d, blocks=%d, bfree=%d, bavail=%d",
  190. res->statfsres_u.reply.tsize, 
  191. res->statfsres_u.reply.bsize, 
  192. res->statfsres_u.reply.blocks,
  193. res->statfsres_u.reply.bfree, 
  194. res->statfsres_u.reply.bavail);
  195. }
  196. }
  197. p_readdirargs(args)
  198. readdirargs *args;
  199. {
  200. p_fhandle(&args->dir);
  201. fprintf(stderr, ", cookie=%d, count=%d",
  202. *(int *)args->cookie, args->count);
  203. }
  204. p_entryp(p)
  205. entry *p;
  206. {
  207. while (p != NULL) {
  208. fprintf(stderr, "(fileid=%u, name=%s, cookie=%u), ", 
  209. p->fileid, p->name, *(int*)p->cookie);
  210. p = p->nextentry;
  211. }
  212. }
  213. p_readdirres(res)
  214. readdirres *res;
  215. {
  216. p_nfsstat(&res->status);
  217. if (res->status == NFS_OK) {
  218. p_entryp(res->readdirres_u.reply.entries);
  219. fprintf(stderr, ", eof=%d", res->readdirres_u.reply.eof);
  220. }
  221. }
  222. struct procinfo {
  223. char *name;
  224. int (*pargs)();
  225. int (*pres)();
  226. } procs[] = {
  227.     { "NULL", p_void, p_void },
  228.     { "GETATTR", p_fhandle, p_attrstat },
  229.     { "SETATTR", p_sattrargs,  p_attrstat },
  230.     { "ROOT", p_void, p_void },
  231.     { "LOOKUP", p_diropargs, p_diropres },
  232.     { "READLINK", p_fhandle, p_readlinkres },
  233.     { "READ", p_readargs, p_readres },
  234.     { "WRITECACHE", p_void, p_void },
  235.     { "WRITE", p_writeargs, p_attrstat },
  236.     { "CREATE", p_createargs, p_diropres },
  237.     { "REMOVE", p_diropargs, p_nfsstat },
  238.     { "RENAME", p_renameargs, p_nfsstat },
  239.     { "LINK", p_linkargs, p_nfsstat },
  240.     { "SYMLINK", p_symlinkargs, p_nfsstat },
  241.     { "MKDIR", p_createargs, p_nfsstat },
  242.     { "RMDIR", p_diropargs, p_nfsstat },
  243.     { "READDIR", p_readdirargs, p_readdirres },
  244.     { "STATFS", p_fhandle, p_statfsres },
  245. };
  246. trace_call(procnum, args)
  247. int procnum;
  248. char *args;
  249. {
  250. fprintf(stderr, "%s call(", procs[procnum].name);
  251. (*procs[procnum].pargs)(args);
  252. fprintf(stderr, ")n");
  253. }
  254. trace_return(procnum, res)
  255. int procnum;
  256. char *res;
  257. {
  258. fprintf(stderr, "%s return(", procs[procnum].name);
  259. (*procs[procnum].pres)(res);
  260. fprintf(stderr, ")n");
  261. }