Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 1
#include "all.h"
2
 
3
static void	pcinit(int, char**);
4
static int	pcnull(int, Rpccall*, Rpccall*);
5
static int	pcinfo(int, Rpccall*, Rpccall*);
6
static int	pcauth(int, Rpccall*, Rpccall*);
7
static int	pc1auth(int, Rpccall*, Rpccall*);
8
static int	pcfacilities[15];
9
static char	no_comment[] = "Trust me.";
10
static char	pc_vers[] = "@(#)pcnfsd_v2.c	1.6 - rpc.pcnfsd V2.0 (c) 1994 P9, GmbH";
11
static char	pc_home[] = "merrimack:/";
12
 
13
static Procmap pcproc[] = {	/* pcnfsd v2 */
14
	0, pcnull,
15
	1, pcinfo,
16
	13, pcauth,
17
	0, 0
18
};
19
 
20
static Procmap pc1proc[] = { 	/* pc-nfsd v1 */
21
	0, pcnull,
22
	1, pc1auth,
23
	0, 0
24
};
25
 
26
int	myport = 1111;
27
 
28
Progmap progmap[] = {
29
	150001, 2, pcinit, pcproc,
30
	150001, 1, 0, pc1proc,
31
	0, 0, 0,
32
};
33
 
34
void
35
main(int argc, char *argv[])
36
{
37
	server(argc, argv, myport, progmap);
38
}
39
 
40
static void
41
pcinit(int argc, char **argv)
42
{
43
	Procmap *p;
44
	int i;
45
	char *config = "config";
46
 
47
	ARGBEGIN{
48
	case 'c':
49
		config = ARGF();
50
		break;
51
	default:
52
		if(argopt(ARGC()) < 0)
53
			sysfatal("usage: %s %s [-c config]", argv0, commonopts);
54
		break;
55
	}ARGEND;
56
	clog("pc init\n");
57
 
58
	for(i=0; i<nelem(pcfacilities); i++)
59
		pcfacilities[i] = -1;
60
	for(p=pcproc; p->procp; p++)
61
		pcfacilities[p->procno] = 100;
62
	readunixidmaps(config);
63
}
64
 
65
static int
66
pcnull(int n, Rpccall *cmd, Rpccall *reply)
67
{
68
	USED(n, cmd, reply);
69
	return 0;
70
}
71
 
72
static void
73
scramble(String *x)
74
{
75
	int i;
76
 
77
	for(i=0; i<x->n; i++)
78
		x->s[i] = (x->s[i] ^ 0x5b) & 0x7f;
79
}
80
 
81
static int
82
pcinfo(int n, Rpccall *cmd, Rpccall *reply)
83
{
84
	uchar *argptr = cmd->args;
85
	uchar *dataptr = reply->results;
86
	String vers, cm;
87
	int i;
88
 
89
	chat("host=%I, port=%ld: pcinfo...",
90
		cmd->host, cmd->port);
91
	if(n <= 16)
92
		return garbage(reply, "count too small");
93
	argptr += string2S(argptr, &vers);
94
	argptr += string2S(argptr, &cm);
95
	if(argptr != &((uchar *)cmd->args)[n])
96
		return garbage(reply, "bad count");
97
	chat("\"%.*s\",\"%.*s\"\n", utfnlen(vers.s, vers.n), vers.s, utfnlen(cm.s, cm.n), cm.s);
98
	PLONG(sizeof(pc_vers)-1);
99
	PPTR(pc_vers, sizeof(pc_vers)-1);
100
	PLONG(sizeof(no_comment)-1);
101
	PPTR(no_comment, sizeof(no_comment)-1);
102
	PLONG(nelem(pcfacilities));
103
	for(i=0; i<nelem(pcfacilities); i++)
104
		PLONG(pcfacilities[i]);
105
	return dataptr - (uchar *)reply->results;
106
}
107
 
108
static int
109
pc1auth(int n, Rpccall *cmd, Rpccall *reply)
110
{
111
	uchar *argptr = cmd->args;
112
	uchar *dataptr = reply->results;
113
	String id, pw;
114
	Unixidmap *m;
115
	int uid;
116
 
117
	chat("host=%I, port=%ld: pcauth...",
118
		cmd->host, cmd->port);
119
	if(n <= 8)
120
		return garbage(reply, "count too small");
121
	argptr += string2S(argptr, &id);
122
	argptr += string2S(argptr, &pw);
123
	if(argptr != &((uchar*)cmd->args)[n])
124
		return garbage(reply, "bad count");
125
	scramble(&id);
126
	scramble(&pw);
127
	m = pair2idmap("pcnfsd", cmd->host);
128
	uid = -1;
129
	if(m)
130
		uid = name2id(&m->u.ids, id.s);
131
	if(uid < 0)
132
		uid = 1;
133
	chat("\"%.*s\",\"%.*s\" uid=%d\n", utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, uid);
134
	PLONG(0);	/* status */
135
	PLONG(uid);	/* uid */
136
	PLONG(uid);	/* gid */
137
	return dataptr - (uchar*)reply->results;
138
}
139
 
140
static int
141
pcauth(int n, Rpccall *cmd, Rpccall *reply)
142
{
143
	uchar *argptr = cmd->args;
144
	uchar *dataptr = reply->results;
145
	String sys, id, pw, cm;
146
	Unixidmap *m;
147
	int uid;
148
 
149
	chat("host=%I, port=%ld: pcauth...",
150
		cmd->host, cmd->port);
151
	if(n <= 16)
152
		return garbage(reply, "count too small");
153
	argptr += string2S(argptr, &sys);
154
	argptr += string2S(argptr, &id);
155
	argptr += string2S(argptr, &pw);
156
	argptr += string2S(argptr, &cm);
157
	if(argptr != &((uchar *)cmd->args)[n])
158
		return garbage(reply, "bad count");
159
	scramble(&id);
160
	scramble(&pw);
161
 
162
	m = pair2idmap("pcnfsd", cmd->host);
163
	uid = -1;
164
	if(m)
165
		uid = name2id(&m->u.ids, id.s);
166
	if(uid < 0)
167
		uid = 1;
168
	chat("\"%.*s\",\"%.*s\",\"%.*s\",\"%.*s\"\n", utfnlen(sys.s, sys.n), sys.s,
169
		utfnlen(id.s, id.n), id.s, utfnlen(pw.s, pw.n), pw.s, utfnlen(cm.s, cm.n), cm.s);
170
	PLONG(0);	/* status - OK */
171
	PLONG(uid);
172
	PLONG(uid);	/* gid */
173
	PLONG(0);	/* ngids */
174
	PLONG(sizeof(pc_home)-1);
175
	PPTR(pc_home, sizeof(pc_home)-1);
176
	PLONG(0);	/* umask */
177
	PLONG(sizeof(no_comment)-1);
178
	PPTR(no_comment, sizeof(no_comment)-1);
179
	return dataptr - (uchar *)reply->results;
180
}