stub.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include <u.h>
  10. #include <libc.h>
  11. #include <fcall.h>
  12. #include <thread.h>
  13. #include <9p.h>
  14. uint time0;
  15. enum
  16. {
  17. Qroot = 0,
  18. Qkid,
  19. };
  20. char *kidname;
  21. uint kidmode;
  22. void
  23. fsattach(Req *r)
  24. {
  25. char *spec;
  26. spec = r->ifcall.aname;
  27. if(spec && spec[0]){
  28. respond(r, "invalid attach specifier");
  29. return;
  30. }
  31. r->ofcall.qid = (Qid){Qroot, 0, QTDIR};
  32. r->fid->qid = r->ofcall.qid;
  33. respond(r, nil);
  34. }
  35. char*
  36. fswalk1(Fid *fid, char *name, Qid *qid)
  37. {
  38. switch((int)fid->qid.path){
  39. default:
  40. return "path not found";
  41. case Qroot:
  42. if(strcmp(name, "..") == 0)
  43. break;
  44. if(strcmp(name, kidname) == 0){
  45. fid->qid = (Qid){Qkid, 0, kidmode>>24};
  46. break;
  47. }
  48. return "path not found";
  49. case Qkid:
  50. if(strcmp(name, "..") == 0){
  51. fid->qid = (Qid){Qroot, 0, QTDIR};
  52. break;
  53. }
  54. return "path not found";
  55. }
  56. *qid = fid->qid;
  57. return nil;
  58. }
  59. void
  60. fsstat(Req *r)
  61. {
  62. int q;
  63. Dir *d;
  64. d = &r->d;
  65. memset(d, 0, sizeof *d);
  66. q = r->fid->qid.path;
  67. d->qid = r->fid->qid;
  68. switch(q){
  69. case Qroot:
  70. d->name = estrdup9p("/");
  71. d->mode = DMDIR|0777;
  72. break;
  73. case Qkid:
  74. d->name = estrdup9p(kidname);
  75. d->mode = kidmode;
  76. break;
  77. }
  78. d->atime = d->mtime = time0;
  79. d->uid = estrdup9p("stub");
  80. d->gid = estrdup9p("stub");
  81. d->muid = estrdup9p("");
  82. respond(r, nil);
  83. }
  84. int
  85. dirgen(int off, Dir *d, void *v)
  86. {
  87. if(off != 0)
  88. return -1;
  89. memset(d, 0, sizeof *d);
  90. d->atime = d->mtime = time0;
  91. d->name = estrdup9p(kidname);
  92. d->mode = kidmode;
  93. d->qid = (Qid){Qkid, 0, kidmode>>24};
  94. d->qid.type = d->mode>>24;
  95. d->uid = estrdup9p("stub");
  96. d->gid = estrdup9p("stub");
  97. d->muid = estrdup9p("");
  98. return 0;
  99. }
  100. void
  101. fsread(Req *r)
  102. {
  103. int q;
  104. q = r->fid->qid.path;
  105. switch(q){
  106. default:
  107. respond(r, "bug");
  108. return;
  109. case Qroot:
  110. dirread9p(r, dirgen, nil);
  111. respond(r, nil);
  112. return;
  113. }
  114. }
  115. void
  116. fswrite(Req *r)
  117. {
  118. respond(r, "no writing");
  119. }
  120. void
  121. fsopen(Req *r)
  122. {
  123. if(r->fid->qid.path != Qroot){
  124. respond(r, "permission denied");
  125. return;
  126. }
  127. if(r->ifcall.mode != OREAD)
  128. respond(r, "permission denied");
  129. else
  130. respond(r, nil);
  131. }
  132. Srv fs = {
  133. .attach= fsattach,
  134. .open= fsopen,
  135. .read= fsread,
  136. .write= fswrite,
  137. .stat= fsstat,
  138. .walk1= fswalk1,
  139. };
  140. void
  141. usage(void)
  142. {
  143. fprint(2, "usage: aux/stub [-Dd] path/name\n");
  144. exits("usage");
  145. }
  146. void
  147. main(int argc, char **argv)
  148. {
  149. char *p, *mtpt;
  150. quotefmtinstall();
  151. time0 = time(0);
  152. ARGBEGIN{
  153. case 'D':
  154. chatty9p++;
  155. break;
  156. case 'd':
  157. kidmode = DMDIR;
  158. break;
  159. default:
  160. usage();
  161. }ARGEND
  162. if(argc != 1)
  163. usage();
  164. if((p = strrchr(argv[0], '/')) == 0){
  165. mtpt = ".";
  166. kidname = argv[0];
  167. }else if(p == argv[0]){
  168. mtpt = "/";
  169. kidname = argv[0]+1;
  170. }else{
  171. mtpt = argv[0];
  172. *p++ = '\0';
  173. kidname = p;
  174. }
  175. /* don't leave standard descriptors open to confuse mk */
  176. close(0);
  177. close(1);
  178. close(2);
  179. postmountsrv(&fs, nil, mtpt, MBEFORE);
  180. exits(nil);
  181. }