xref: /plan9/sys/src/cmd/cifs/info.c (revision 671dfc474d1a5bcbeda8be1356d2abfa05b91489)
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