smbservice.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "headers.h"
  2. static SmbService local = {
  3. .name = "local",
  4. .type = "A:",
  5. .stype = STYPE_DISKTREE,
  6. .remark = "The standard namespace",
  7. .path = "/n/local",
  8. };
  9. static SmbService ipc = {
  10. .name = "IPC$",
  11. .type = "IPC",
  12. .stype = STYPE_IPC,
  13. .remark = "The aquarela IPC service",
  14. .path = nil,
  15. .next = &local,
  16. };
  17. SmbService *smbservices = &ipc;
  18. static int
  19. run9fs(char *arg)
  20. {
  21. int rv;
  22. Waitmsg *w;
  23. rv = fork();
  24. if (rv < 0)
  25. return -1;
  26. if (rv == 0) {
  27. char *argv[3];
  28. argv[0] = "/rc/bin/9fs";
  29. argv[1] = arg;
  30. argv[2] = 0;
  31. exec(argv[0], argv);
  32. exits("failed to exec 9fs");
  33. }
  34. for (;;) {
  35. w = wait();
  36. if (w == nil)
  37. return -1;
  38. if (w->pid == rv)
  39. break;
  40. free(w);
  41. }
  42. if (w->msg[0]) {
  43. smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: %s\n", w->msg);
  44. free(w);
  45. return -1;
  46. }
  47. free(w);
  48. smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: 9fs %s executed successfully\n", arg);
  49. return 0;
  50. }
  51. SmbService *
  52. smbservicefind(SmbSession *s, char *uncpath, char *servicetype, uchar *errclassp, ushort *errorp)
  53. {
  54. char *p, *q;
  55. if ((uncpath[0] == '/' && uncpath[1] == '/')
  56. || (uncpath[0] == '\\' && uncpath[1] == '\\')) {
  57. /* check that the server name matches mine */
  58. p = uncpath + 2;
  59. q = strchr(p, uncpath[0]);
  60. if (q == nil)
  61. goto bad;
  62. *q++ = 0;
  63. // if (cistrcmp(p, smbglobals.serverinfo.name) != 0)
  64. // goto bad;
  65. }
  66. else
  67. q = uncpath + 1;
  68. if (strcmp(servicetype, "?????") == 0 && strcmp(q, "IPC$") == 0)
  69. return &ipc;
  70. if ((strcmp(servicetype, "?????") == 0 || strcmp(servicetype, "A:") == 0)) {
  71. SmbService *serv;
  72. if (cistrcmp(q, local.name) == 0)
  73. return &local;
  74. /* try the session specific list */
  75. for (serv = s->serv; serv; serv = serv->next)
  76. if (cistrcmp(q, serv->name) == 0)
  77. return serv;
  78. /* exec "9fs q" in case it invents /n/q */
  79. for (p = q; *p; p++)
  80. if (*p >= 'A' && *p <= 'Z')
  81. *p = tolower(*p);
  82. if (run9fs(q) >= 0) {
  83. serv = smbemallocz(sizeof(*serv), 1);
  84. serv->name = smbestrdup(q);
  85. serv->type = smbestrdup("A:");
  86. serv->stype = STYPE_DISKTREE;
  87. smbstringprint(&serv->remark, "9fs %s", q);
  88. smbstringprint(&serv->path, "/n/%s", q);
  89. serv->next = s->serv;
  90. s->serv = serv;
  91. return serv;
  92. }
  93. }
  94. bad:
  95. *errclassp = ERRDOS;
  96. *errorp = ERRbadpath;
  97. return nil;
  98. }
  99. void
  100. smbserviceget(SmbService *serv)
  101. {
  102. incref(serv);
  103. }
  104. void
  105. smbserviceput(SmbService *serv)
  106. {
  107. decref(serv);
  108. }