SmbService * smbservicefind(SmbSession *s, char *uncpath, char *servicetype, uint8_t *errclassp, uint16_t *errorp) { char *p, *q; if ((uncpath[0] == '/' && uncpath[1] == '/') || (uncpath[0] == '\\' && uncpath[1] == '\\')) { /* check that the server name matches mine */ p = uncpath + 2; q = strchr(p, uncpath[0]); if (q == nil) goto bad; *q++ = 0; // if (cistrcmp(p, smbglobals.serverinfo.name) != 0) // goto bad; } else q = uncpath + 1; if (strcmp(servicetype, "?????") == 0 && strcmp(q, "IPC$") == 0) return &ipc; if ((strcmp(servicetype, "?????") == 0 || strcmp(servicetype, "A:") == 0)) { SmbService *serv; if (cistrcmp(q, local.name) == 0) return &local; /* try the session specific list */ for (serv = s->serv; serv; serv = serv->next) if (cistrcmp(q, serv->name) == 0) return serv; /* exec "9fs q" in case it invents /n/q */ for (p = q; *p; p++) if (*p >= 'A' && *p <= 'Z') *p = tolower(*p); if (run9fs(q) >= 0) { serv = smbemallocz(sizeof(*serv), 1); serv->name = smbestrdup(q); serv->type = smbestrdup("A:"); serv->stype = STYPE_DISKTREE; smbstringprint(&serv->remark, "9fs %s", q); smbstringprint(&serv->path, "/n/%s", q); serv->next = s->serv; s->serv = serv; return serv; } } bad: *errclassp = ERRDOS; *errorp = ERRbadpath; return nil; }
char * smbstrdup(uchar **bdatap, uchar *edata) { char *p; uchar *np; np = memchr(*bdatap, 0, edata - *bdatap); if (np == nil) return nil; p = smbestrdup((char *)(*bdatap)); *bdatap = np + 1; return p; }