]> git.lizzy.rs Git - plan9front.git/blob - sys/src/cmd/ip/cifsd/share.c
separate MSCHAP(v2) and NTLM(v2) authentication
[plan9front.git] / sys / src / cmd / ip / cifsd / share.c
1 #include <u.h>
2 #include <libc.h>
3 #include "dat.h"
4 #include "fns.h"
5
6 static int
7 run9fs(char *arg)
8 {
9         char buf[1024], *argv[3], *s;
10         Waitmsg *w;
11         int fd, pid;
12
13         switch(pid = rfork(RFCFDG|RFREND|RFPROC)){
14         case -1:
15                 return -1;
16         case 0:
17                 open("/dev/null", ORDWR);
18                 snprint(buf, sizeof(buf), "/sys/log/%s", progname);
19                 if((fd = open(buf, OWRITE)) >= 0)
20                         seek(fd, 0, 2);
21                 else
22                         fd = 0;
23                 dup(fd, 1);
24                 dup(fd, 2);
25                 argv[0] = "/bin/9fs";
26                 argv[1] = arg;
27                 argv[2] = 0;
28                 exec(argv[0], argv);
29                 exits("failed to exec 9fs");
30         }
31         for (;;) {
32                 if((w = wait()) == nil)
33                         return -1;
34                 if (w->pid == pid)
35                         break;
36                 free(w);
37         }
38         if(w->msg[0]){
39                 if(s = strchr(w->msg, ':'))
40                         s = s+1;
41                 else
42                         s = w->msg;
43                 werrstr("%s", s);
44                 free(w);
45                 return -1;
46         } else {
47                 free(w);
48                 return 0;
49         }
50 }
51
52 static Share *shares;
53
54 Share*
55 mapshare(char *path)
56 {
57         char *tmp, *tmp2, *name, *root, *service, *fsname, *remark;
58         int stype;
59         Share *s;
60
61         if(name = strrchr(path, '/'))
62                 name++;
63         else if(name = strrchr(path, '\\'))
64                 name++;
65         else
66                 name = path;
67         if(name==nil || *name==0 || *name=='.' || strchrs(name, "\\* ") || strstr(name, ".."))
68                 return nil;
69         root = tmp = smprint("/n/%s", name);
70         name = strtr(strrchr(root, '/')+1, tolowerrune);
71         service = "A:";
72         stype = STYPE_DISKTREE;
73         fsname = "9fs";
74         remark = tmp2 = smprint("9fs %s; cd %s", name, root);
75         if(!strcmp(name, "local")){
76                 root = "/";
77                 fsname = "local";
78                 remark = "The standard namespace";
79         }
80         if(!strcmp(name, "ipc$")){
81                 root = "/dev/null";
82                 name = "IPC$";
83                 fsname = "";
84                 service = "IPC";
85                 stype = STYPE_IPC;
86                 remark = "The IPC service";
87         }
88
89         for(s = shares; s; s=s->next)
90                 if(!strcmp(s->name, name))
91                         goto out;
92
93         logit("mapshare %s -> %s %s %s", path, service, name, root);
94
95         if(!strcmp(service, "A:") && (stype == STYPE_DISKTREE)){
96                 if(!strcmp(fsname, "9fs") && (run9fs(name) < 0)){
97                         logit("9fs %s: %r", name);
98                         goto out;
99                 }
100         }
101
102         s = malloc(sizeof(*s));
103         s->service = strdup(service);
104         s->stype = stype;
105
106         s->name = strdup(name);
107         s->root = strdup(root);
108
109         s->remark = strdup(remark);
110         s->fsname = strdup(fsname);
111         s->namelen = 255;
112         s->sectorsize = 0x200;
113         s->blocksize = 0x2000;
114         s->allocsize = 0;
115         s->freesize = s->blocksize;
116
117         s->next = shares;
118         shares = s;
119
120 out:
121         free(tmp);
122         free(tmp2);
123         return s;
124 }