xref: /plan9-contrib/sys/src/cmd/aquarela/smbservice.c (revision b698dcfadb276a6209fd40d3fd699dab70955a1b)
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