1*671dfc47SDavid du Colombier #include <u.h>
2*671dfc47SDavid du Colombier #include <libc.h>
3*671dfc47SDavid du Colombier #include <auth.h>
4*671dfc47SDavid du Colombier #include <fcall.h>
5*671dfc47SDavid du Colombier #include <thread.h>
6*671dfc47SDavid du Colombier #include <9p.h>
7*671dfc47SDavid du Colombier #include "cifs.h"
8*671dfc47SDavid du Colombier
9*671dfc47SDavid du Colombier
10*671dfc47SDavid du Colombier struct {
11*671dfc47SDavid du Colombier char *name;
12*671dfc47SDavid du Colombier int (*func)(Fmt *f);
13*671dfc47SDavid du Colombier char *buf;
14*671dfc47SDavid du Colombier int len;
15*671dfc47SDavid du Colombier } Infdir[] = {
16*671dfc47SDavid du Colombier { "Users", userinfo },
17*671dfc47SDavid du Colombier { "Groups", groupinfo },
18*671dfc47SDavid du Colombier { "Shares", shareinfo },
19*671dfc47SDavid du Colombier { "Connection", conninfo },
20*671dfc47SDavid du Colombier { "Sessions", sessioninfo },
21*671dfc47SDavid du Colombier { "Dfsroot", dfsrootinfo },
22*671dfc47SDavid du Colombier { "Dfscache", dfscacheinfo },
23*671dfc47SDavid du Colombier { "Domains", domaininfo },
24*671dfc47SDavid du Colombier { "Openfiles", openfileinfo },
25*671dfc47SDavid du Colombier { "Workstations", workstationinfo },
26*671dfc47SDavid du Colombier { "Filetable", filetableinfo },
27*671dfc47SDavid du Colombier };
28*671dfc47SDavid du Colombier
29*671dfc47SDavid du Colombier int
walkinfo(char * name)30*671dfc47SDavid du Colombier walkinfo(char *name)
31*671dfc47SDavid du Colombier {
32*671dfc47SDavid du Colombier int i;
33*671dfc47SDavid du Colombier
34*671dfc47SDavid du Colombier for(i = 0; i < nelem(Infdir); i++)
35*671dfc47SDavid du Colombier if(strcmp(Infdir[i].name, name) == 0)
36*671dfc47SDavid du Colombier return(i);
37*671dfc47SDavid du Colombier return -1;
38*671dfc47SDavid du Colombier }
39*671dfc47SDavid du Colombier
40*671dfc47SDavid du Colombier int
numinfo(void)41*671dfc47SDavid du Colombier numinfo(void)
42*671dfc47SDavid du Colombier {
43*671dfc47SDavid du Colombier return nelem(Infdir);
44*671dfc47SDavid du Colombier }
45*671dfc47SDavid du Colombier
46*671dfc47SDavid du Colombier int
dirgeninfo(int slot,Dir * d)47*671dfc47SDavid du Colombier dirgeninfo(int slot, Dir *d)
48*671dfc47SDavid du Colombier {
49*671dfc47SDavid du Colombier if(slot < 0 || slot > nelem(Infdir))
50*671dfc47SDavid du Colombier return -1;
51*671dfc47SDavid du Colombier
52*671dfc47SDavid du Colombier memset(d, 0, sizeof(Dir));
53*671dfc47SDavid du Colombier d->type = 'N';
54*671dfc47SDavid du Colombier d->dev = 99;
55*671dfc47SDavid du Colombier d->name = estrdup9p(Infdir[slot].name);
56*671dfc47SDavid du Colombier d->uid = estrdup9p("other");
57*671dfc47SDavid du Colombier d->muid = estrdup9p("other");
58*671dfc47SDavid du Colombier d->gid = estrdup9p("other");
59*671dfc47SDavid du Colombier d->mode = 0666;
60*671dfc47SDavid du Colombier d->atime = time(0);
61*671dfc47SDavid du Colombier d->mtime = d->atime;
62*671dfc47SDavid du Colombier d->qid = mkqid(Infdir[slot].name, 0, 1, Pinfo, slot);
63*671dfc47SDavid du Colombier d->qid.vers = 1;
64*671dfc47SDavid du Colombier d->qid.path = slot;
65*671dfc47SDavid du Colombier d->qid.type = 0;
66*671dfc47SDavid du Colombier return 0;
67*671dfc47SDavid du Colombier }
68*671dfc47SDavid du Colombier
69*671dfc47SDavid du Colombier int
makeinfo(int path)70*671dfc47SDavid du Colombier makeinfo(int path)
71*671dfc47SDavid du Colombier {
72*671dfc47SDavid du Colombier Fmt f;
73*671dfc47SDavid du Colombier
74*671dfc47SDavid du Colombier if(path < 0 || path > nelem(Infdir))
75*671dfc47SDavid du Colombier return -1;
76*671dfc47SDavid du Colombier if(Infdir[path].buf != nil)
77*671dfc47SDavid du Colombier return 0;
78*671dfc47SDavid du Colombier fmtstrinit(&f);
79*671dfc47SDavid du Colombier if((*Infdir[path].func)(&f) == -1l)
80*671dfc47SDavid du Colombier return -1;
81*671dfc47SDavid du Colombier Infdir[path].buf = fmtstrflush(&f);
82*671dfc47SDavid du Colombier Infdir[path].len = strlen(Infdir[path].buf);
83*671dfc47SDavid du Colombier return 0;
84*671dfc47SDavid du Colombier }
85*671dfc47SDavid du Colombier
86*671dfc47SDavid du Colombier int
readinfo(int path,char * buf,int len,int off)87*671dfc47SDavid du Colombier readinfo(int path, char *buf, int len, int off)
88*671dfc47SDavid du Colombier {
89*671dfc47SDavid du Colombier if(path < 0 || path > nelem(Infdir))
90*671dfc47SDavid du Colombier return -1;
91*671dfc47SDavid du Colombier if(off > Infdir[path].len)
92*671dfc47SDavid du Colombier return 0;
93*671dfc47SDavid du Colombier if(len + off > Infdir[path].len)
94*671dfc47SDavid du Colombier len = Infdir[path].len - off;
95*671dfc47SDavid du Colombier memmove(buf, Infdir[path].buf + off, len);
96*671dfc47SDavid du Colombier return len;
97*671dfc47SDavid du Colombier }
98*671dfc47SDavid du Colombier
99*671dfc47SDavid du Colombier void
freeinfo(int path)100*671dfc47SDavid du Colombier freeinfo(int path)
101*671dfc47SDavid du Colombier {
102*671dfc47SDavid du Colombier if(path < 0 || path > nelem(Infdir))
103*671dfc47SDavid du Colombier return;
104*671dfc47SDavid du Colombier free(Infdir[path].buf);
105*671dfc47SDavid du Colombier Infdir[path].buf = nil;
106*671dfc47SDavid du Colombier }
107