open.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "local.h"
  4. char *
  5. logfsserveropen(LogfsServer *server, u32int fid, uchar mode, Qid *qid)
  6. {
  7. Fid *f;
  8. Entry *e;
  9. ulong modemask;
  10. if(server->trace > 1)
  11. print("logfsserveropen(%ud, %d)\n", fid, mode);
  12. f = logfsfidmapfindentry(server->fidmap, fid);
  13. if(f == nil)
  14. return logfsebadfid;
  15. if(f->openmode >= 0)
  16. return logfsefidopen;
  17. e = f->entry;
  18. SET(modemask);
  19. switch(mode & 3) {
  20. case OEXEC:
  21. modemask = DMEXEC;
  22. break;
  23. case OREAD:
  24. modemask = DMREAD;
  25. break;
  26. case OWRITE:
  27. modemask = DMWRITE;
  28. break;
  29. case ORDWR:
  30. modemask = DMWRITE | DMREAD;
  31. break;
  32. }
  33. if(e->qid.type & QTDIR) {
  34. if((modemask & DMWRITE) != 0 || (mode & (ORCLOSE | OTRUNC)) != 0)
  35. return Eperm;
  36. }
  37. else {
  38. if(mode & OTRUNC)
  39. modemask |= DMWRITE;
  40. if((mode & ORCLOSE) != 0 && !logfsuserpermcheck(server, e->parent, f, DMWRITE))
  41. return Eperm;
  42. }
  43. if(!logfsuserpermcheck(server, e, f, modemask))
  44. return Eperm;
  45. if((e->qid.type & QTDIR) == 0 && (mode & OTRUNC) != 0 && (e->perm & DMAPPEND) == 0 && e->u.file.length != 0) {
  46. LogMessage s;
  47. char *errmsg;
  48. s.type = LogfsLogTtrunc;
  49. s.path = e->qid.path;
  50. s.u.trunc.mtime = logfsnow();
  51. s.u.trunc.cvers = e->u.file.cvers + 1;
  52. s.u.trunc.muid = logfsisfindidfromname(server->is, f->uname);
  53. errmsg = logfslog(server, 1, &s);
  54. if(errmsg)
  55. return errmsg;
  56. e->muid = s.u.trunc.muid;
  57. e->mtime = s.u.trunc.mtime;
  58. e->qid.vers++;
  59. e->u.file.cvers = s.u.trunc.cvers;
  60. /*
  61. * zap all data and extents
  62. */
  63. logfsextentlistwalk(e->u.file.extent, logfsunconditionallymarkfreeanddirty, server);
  64. logfsextentlistreset(e->u.file.extent);
  65. e->u.file.length = 0;
  66. }
  67. f->openmode = mode;
  68. *qid = e->qid;
  69. return nil;
  70. }