18ccd4a63SDavid du Colombier #include "headers.h"
28ccd4a63SDavid du Colombier
38ccd4a63SDavid du Colombier static SmbService local = {
48ccd4a63SDavid du Colombier .name = "local",
58ccd4a63SDavid du Colombier .type = "A:",
68ccd4a63SDavid du Colombier .stype = STYPE_DISKTREE,
78ccd4a63SDavid du Colombier .remark = "The standard namespace",
88ccd4a63SDavid du Colombier .path = "/n/local",
98ccd4a63SDavid du Colombier };
108ccd4a63SDavid du Colombier
118ccd4a63SDavid du Colombier static SmbService ipc = {
128ccd4a63SDavid du Colombier .name = "IPC$",
138ccd4a63SDavid du Colombier .type = "IPC",
148ccd4a63SDavid du Colombier .stype = STYPE_IPC,
158ccd4a63SDavid du Colombier .remark = "The aquarela IPC service",
168ccd4a63SDavid du Colombier .path = nil,
178ccd4a63SDavid du Colombier .next = &local,
188ccd4a63SDavid du Colombier };
198ccd4a63SDavid du Colombier
208ccd4a63SDavid du Colombier SmbService *smbservices = &ipc;
218ccd4a63SDavid du Colombier
228ccd4a63SDavid du Colombier static int
run9fs(char * arg)238ccd4a63SDavid du Colombier run9fs(char *arg)
248ccd4a63SDavid du Colombier {
258ccd4a63SDavid du Colombier int rv;
268ccd4a63SDavid du Colombier Waitmsg *w;
278ccd4a63SDavid du Colombier
288ccd4a63SDavid du Colombier rv = fork();
298ccd4a63SDavid du Colombier if (rv < 0)
308ccd4a63SDavid du Colombier return -1;
318ccd4a63SDavid du Colombier if (rv == 0) {
328ccd4a63SDavid du Colombier char *argv[3];
338ccd4a63SDavid du Colombier argv[0] = "/rc/bin/9fs";
348ccd4a63SDavid du Colombier argv[1] = arg;
358ccd4a63SDavid du Colombier argv[2] = 0;
368ccd4a63SDavid du Colombier exec(argv[0], argv);
378ccd4a63SDavid du Colombier exits("failed to exec 9fs");
388ccd4a63SDavid du Colombier }
398ccd4a63SDavid du Colombier for (;;) {
408ccd4a63SDavid du Colombier w = wait();
418ccd4a63SDavid du Colombier if (w == nil)
428ccd4a63SDavid du Colombier return -1;
438ccd4a63SDavid du Colombier if (w->pid == rv)
448ccd4a63SDavid du Colombier break;
458ccd4a63SDavid du Colombier free(w);
468ccd4a63SDavid du Colombier }
478ccd4a63SDavid du Colombier if (w->msg[0]) {
488ccd4a63SDavid du Colombier smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: %s\n", w->msg);
498ccd4a63SDavid du Colombier free(w);
508ccd4a63SDavid du Colombier return -1;
518ccd4a63SDavid du Colombier }
528ccd4a63SDavid du Colombier free(w);
538ccd4a63SDavid du Colombier smblogprint(SMB_COM_TREE_CONNECT_ANDX, "smbservicefind: 9fs %s executed successfully\n", arg);
548ccd4a63SDavid du Colombier return 0;
558ccd4a63SDavid du Colombier }
568ccd4a63SDavid du Colombier
578ccd4a63SDavid du Colombier SmbService *
smbservicefind(SmbSession * s,char * uncpath,char * servicetype,uchar * errclassp,ushort * errorp)588ccd4a63SDavid du Colombier smbservicefind(SmbSession *s, char *uncpath, char *servicetype, uchar *errclassp, ushort *errorp)
598ccd4a63SDavid du Colombier {
608ccd4a63SDavid du Colombier char *p, *q;
61*b698dcfaSDavid du Colombier if ((uncpath[0] == '/' && uncpath[1] == '/')
62*b698dcfaSDavid du Colombier || (uncpath[0] == '\\' && uncpath[1] == '\\')) {
638ccd4a63SDavid du Colombier /* check that the server name matches mine */
648ccd4a63SDavid du Colombier p = uncpath + 2;
65*b698dcfaSDavid du Colombier q = strchr(p, uncpath[0]);
668ccd4a63SDavid du Colombier if (q == nil)
678ccd4a63SDavid du Colombier goto bad;
688ccd4a63SDavid du Colombier *q++ = 0;
698ccd4a63SDavid du Colombier // if (cistrcmp(p, smbglobals.serverinfo.name) != 0)
708ccd4a63SDavid du Colombier // goto bad;
718ccd4a63SDavid du Colombier }
728ccd4a63SDavid du Colombier else
738ccd4a63SDavid du Colombier q = uncpath + 1;
748ccd4a63SDavid du Colombier if (strcmp(servicetype, "?????") == 0 && strcmp(q, "IPC$") == 0)
758ccd4a63SDavid du Colombier return &ipc;
768ccd4a63SDavid du Colombier if ((strcmp(servicetype, "?????") == 0 || strcmp(servicetype, "A:") == 0)) {
778ccd4a63SDavid du Colombier SmbService *serv;
788ccd4a63SDavid du Colombier if (cistrcmp(q, local.name) == 0)
798ccd4a63SDavid du Colombier return &local;
808ccd4a63SDavid du Colombier /* try the session specific list */
818ccd4a63SDavid du Colombier for (serv = s->serv; serv; serv = serv->next)
828ccd4a63SDavid du Colombier if (cistrcmp(q, serv->name) == 0)
838ccd4a63SDavid du Colombier return serv;
848ccd4a63SDavid du Colombier /* exec "9fs q" in case it invents /n/q */
858ccd4a63SDavid du Colombier for (p = q; *p; p++)
868ccd4a63SDavid du Colombier if (*p >= 'A' && *p <= 'Z')
878ccd4a63SDavid du Colombier *p = tolower(*p);
888ccd4a63SDavid du Colombier if (run9fs(q) >= 0) {
898ccd4a63SDavid du Colombier serv = smbemallocz(sizeof(*serv), 1);
908ccd4a63SDavid du Colombier serv->name = smbestrdup(q);
918ccd4a63SDavid du Colombier serv->type = smbestrdup("A:");
928ccd4a63SDavid du Colombier serv->stype = STYPE_DISKTREE;
938ccd4a63SDavid du Colombier smbstringprint(&serv->remark, "9fs %s", q);
948ccd4a63SDavid du Colombier smbstringprint(&serv->path, "/n/%s", q);
958ccd4a63SDavid du Colombier serv->next = s->serv;
968ccd4a63SDavid du Colombier s->serv = serv;
978ccd4a63SDavid du Colombier return serv;
988ccd4a63SDavid du Colombier }
998ccd4a63SDavid du Colombier }
1008ccd4a63SDavid du Colombier bad:
1018ccd4a63SDavid du Colombier *errclassp = ERRDOS;
1028ccd4a63SDavid du Colombier *errorp = ERRbadpath;
1038ccd4a63SDavid du Colombier return nil;
1048ccd4a63SDavid du Colombier }
1058ccd4a63SDavid du Colombier
1068ccd4a63SDavid du Colombier void
smbserviceget(SmbService * serv)1078ccd4a63SDavid du Colombier smbserviceget(SmbService *serv)
1088ccd4a63SDavid du Colombier {
1098ccd4a63SDavid du Colombier incref(serv);
1108ccd4a63SDavid du Colombier }
1118ccd4a63SDavid du Colombier
1128ccd4a63SDavid du Colombier void
smbserviceput(SmbService * serv)1138ccd4a63SDavid du Colombier smbserviceput(SmbService *serv)
1148ccd4a63SDavid du Colombier {
1158ccd4a63SDavid du Colombier decref(serv);
1168ccd4a63SDavid du Colombier }
117