smbtree.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #include "headers.h"
  2. typedef struct DisconnectData {
  3. SmbSession *s;
  4. SmbTree *t;
  5. } DisconnectData;
  6. static void
  7. smbtreefree(SmbTree **tp)
  8. {
  9. SmbTree *t = *tp;
  10. if (t) {
  11. smbserviceput(t->serv);
  12. free(t);
  13. *tp = nil;
  14. }
  15. }
  16. static void
  17. closesearch(void *magic, void *a)
  18. {
  19. SmbSearch *search = a;
  20. DisconnectData *d = magic;
  21. if (search->t == d->t)
  22. smbsearchclose(d->s, search);
  23. }
  24. static void
  25. closefile(void *magic, void *a)
  26. {
  27. SmbFile *f = a;
  28. DisconnectData *d = magic;
  29. if (f->t == d->t)
  30. smbfileclose(d->s, f);
  31. }
  32. void
  33. smbtreedisconnect(SmbSession *s, SmbTree *t)
  34. {
  35. if (t) {
  36. DisconnectData data;
  37. smblogprintif(smbglobals.log.tids, "smbtreedisconnect: 0x%.4ux\n", t->id);
  38. data.s = s;
  39. data.t = t;
  40. smbserviceput(t->serv);
  41. smbidmapapply(s->sidmap, closesearch, &data);
  42. smbidmapapply(s->fidmap, closefile, &data);
  43. smbidmapremove(s->tidmap, t);
  44. smbtreefree(&t);
  45. }
  46. }
  47. void
  48. smbtreedisconnectbyid(SmbSession *s, ushort id)
  49. {
  50. smbtreedisconnect(s, smbidmapfind(s->tidmap, id));
  51. }
  52. SmbTree *
  53. smbtreeconnect(SmbSession *s, SmbService *serv)
  54. {
  55. SmbTree *t;
  56. if (s->tidmap == nil)
  57. s->tidmap = smbidmapnew();
  58. t = smbemallocz(sizeof(*t), 1);
  59. smbidmapadd(s->tidmap, t);
  60. t->serv = serv;
  61. smbserviceget(serv);
  62. smblogprintif(smbglobals.log.tids, "smbtreeconnect: 0x%.4ux\n", t->id);
  63. return t;
  64. }