## diffname port/net.c 1991/1107
## diff -e /dev/null /n/bootesdump/1991/1107/sys/src/9/port/net.c
0a
#include "u.h"
#include "lib.h"
#include "mem.h"
#include "dat.h"
#include "fns.h"
#include "errno.h"
enum
{
Qlisten= 1,
Qclone= 2,
Q2nd= 3,
Q3rd= 4,
};
/*
* generate a 3 level directory
*/
int
netgen(Chan *c, void *vp, int ntab, int i, Dir *dp)
{
Qid q;
char buf[32];
Network *np = vp;
q.vers = 0;
/* top level directory contains the name of the network */
if(c->qid.path == CHDIR){
switch(i){
case 0:
q.path = CHDIR | Q2nd;
strcpy(buf, np->name);
devdir(c, q, buf, 0, 0666, dp);
break;
default:
return -1;
}
return 1;
}
/* second level contains clone plus all the conversations */
if(c->qid.path == (CHDIR | Q2nd)){
if(i == 0){
q.path = Qclone;
devdir(c, q, "clone", 0, 0666, dp);
}else if(i < np->nconv){
q.path = CHDIR|STREAMQID(i, Q3rd);
sprint(buf, "%d", i);
devdir(c, q, buf, 0, 0666, dp);
}else
return -1;
return 1;
}
if((c->qid.path & CHDIR) == 0)
return -1;
/* third level depends on the number of info files */
switch(i){
case 0:
q.path = STREAMQID(STREAMID(c->qid.path), Sdataqid);
devdir(c, q, "data", 0, 0666, dp);
break;
case 1:
q.path = STREAMQID(STREAMID(c->qid.path), Sctlqid);
devdir(c, q, "ctl", 0, 0666, dp);
break;
case 2:
if(np->listen == 0)
return 0;
q.path = STREAMQID(STREAMID(c->qid.path), Qlisten);
devdir(c, q, "listen", 0, 0666, dp);
break;
default:
if(i >= 3 + np->ninfo)
return -1;
i -= 3;
q.path = Qlisten + i + 1;
devdir(c, q, np->info[i].name, 0, 0666, dp);
}
return 1;
}
Chan *
netopen(Chan *c, int omode, Network *np)
{
int conv;
if(c->qid.path & CHDIR){
if(omode != OREAD)
error(Eperm);
} else {
switch(STREAMTYPE(c->qid.path)){
case Sdataqid:
case Sctlqid:
break;
case Qlisten:
conv = (*np->listen)(c);
c->qid.path = STREAMQID(conv, Sctlqid);
break;
case Qclone:
conv = (*np->clone)(c);
c->qid.path = STREAMQID(conv, Sctlqid);
break;
default:
if(omode != OREAD)
error(Ebadarg);
}
switch(STREAMTYPE(c->qid.path)){
case Sdataqid:
case Sctlqid:
streamopen(c, np->devp);
if(np->protop && c->stream->devq->next->info != np->protop)
pushq(c->stream, np->protop);
break;
}
}
c->mode = openmode(omode);
c->flag |= COPEN;
c->offset = 0;
return c;
}
long
netread(Chan *c, void *a, long n, ulong offset, Network *np)
{
int i;
char buf[256];
if(c->stream)
return streamread(c, a, n);
if(c->qid.path&CHDIR)
return devdirread(c, a, n, (Dirtab*)np, 0, netgen);
if(c->qid.path <= Qlisten || c->qid.path > Qlisten + np->ninfo)
error(Ebadusefd);
i = c->qid.path - Qlisten - 1;
(*np->info[i].fill)(c, buf, sizeof(buf));
return stringread(c, a, n, buf, offset);
}
.
## diffname port/net.c 1991/1108
## diff -e /n/bootesdump/1991/1107/sys/src/9/port/net.c /n/bootesdump/1991/1108/sys/src/9/port/net.c
140,141c
(*np->info[t-Qinf].fill)(c, buf, sizeof(buf));
.
137c
t = STREAMTYPE(c->qid.path);
if(t < Qinf || t >= Qinf + np->ninfo)
.
128c
int t;
.
84a
int
netwalk(Chan *c, char *name, Network *np)
{
if(strcmp(name, "..") == 0) {
switch(STREAMTYPE(c->qid.path)){
case Q2nd:
c->qid.path = CHDIR;
break;
case Q3rd:
c->qid.path = CHDIR|Q2nd;
break;
default:
panic("netwalk %lux", c->qid.path);
}
return 1;
}
return devwalk(c, name, (Dirtab*)np, 0, netgen);
}
void
netstat(Chan *c, char *db, Network *np)
{
int i;
Dir dir;
for(i=0;; i++)
switch(netgen(c, (Dirtab*)np, 0, i, &dir)){
case -1:
/*
* devices with interesting directories usually don't get
* here, which is good because we've lost the name by now.
*/
if(c->qid.path & CHDIR){
devdir(c, c->qid, ".", 0L, CHDIR|0700, &dir);
convD2M(&dir, db);
return;
}
print("netstat %c %lux\n", devchar[c->type], c->qid.path);
error(Enonexist);
case 0:
break;
case 1:
if(eqqid(c->qid, dir.qid)){
convD2M(&dir, db);
return;
}
break;
}
}
.
80a
break;
.
79c
if(i >= np->ninfo)
return -1;
q.path = STREAMQID(STREAMID(c->qid.path), Qinf+i);
.
76,77d
56,58d
43c
if(STREAMID(c->qid.path) == 0){
.
13a
Qinf= 5,
.
7a
#include "fcall.h"
.
## diffname port/net.c 1991/1109
## diff -e /n/bootesdump/1991/1108/sys/src/9/port/net.c /n/bootesdump/1991/1109/sys/src/9/port/net.c
120c
devdir(c, c->qid, ".", 0L, eve, CHDIR|0700, &dir);
.
80c
devdir(c, q, np->info[i].name, 0, eve, 0666, dp);
.
73c
devdir(c, q, "listen", 0, eve, 0666, dp);
.
67c
devdir(c, q, "ctl", 0, eve, 0666, dp);
.
63c
devdir(c, q, "data", 0, eve, 0666, dp);
.
53c
devdir(c, q, buf, 0, eve, 0666, dp);
.
49c
devdir(c, q, "clone", 0, eve, 0666, dp);
.
37c
devdir(c, q, buf, 0, eve, 0666, dp);
.
## diffname port/net.c 1991/1114
## diff -e /n/bootesdump/1991/1109/sys/src/9/port/net.c /n/bootesdump/1991/1114/sys/src/9/port/net.c
50,52c
}else if(i <= np->nconv){
q.path = CHDIR|STREAMQID(i-1, Q3rd);
sprint(buf, "%d", i-1);
.
46c
if(STREAMTYPE(c->qid.path) == Q2nd){
.
## diffname port/net.c 1991/1115
## diff -e /n/bootesdump/1991/1114/sys/src/9/port/net.c /n/bootesdump/1991/1115/sys/src/9/port/net.c
194c
return stringread(a, n, buf, offset);
}
int
netown(Network *np, int id, char *o, int omode)
{
static int access[] = { 0400, 0200, 0600, 0100 };
Netprot *p;
int mode;
int t;
p = &np->prot[id];
lock(np);
if(*p->owner){
if(strncmp(o, p->owner, NAMELEN) == 0) /* User */
mode = p->mode;
else if(strncmp(o, eve, NAMELEN) == 0) /* Bootes is group */
mode = p->mode<<3;
else
mode = p->mode<<6; /* Other */
t = access[omode&3];
if((t & mode) == t){
unlock(np);
return 0;
} else {
unlock(np);
return -1;
}
}
strncpy(p->owner, o, NAMELEN);
np->prot[id].mode = 0660;
unlock(np);
return 0;
}
void
netdisown(Network *np, int id)
{
*np->prot[id].owner = 0;
.
155,156c
id = (*np->clone)(c);
c->qid.path = STREAMQID(id, Sctlqid);
.
151,152c
streamopen(c, np->devp);
id = (*np->listen)(c);
streamclose(c);
c->qid.path = STREAMQID(id, Sctlqid);
.
148a
id = STREAMID(c->qid.path);
if(netown(np, id, u->p->user, omode&7) < 0)
error(Eperm);
.
140c
int id;
.
136a
void
netwstat(Chan *c, char *db, Network *np)
{
Dir dir;
Netprot *p;
p = &np->prot[STREAMID(c->qid.path)];
lock(np);
if(strncmp(p->owner, u->p->user, NAMELEN)){
unlock(np);
error(Eperm);
}
convM2D(db, &dir);
strncpy(p->owner, dir.uid, NAMELEN);
p->mode = dir.mode;
unlock(np);
}
.
120c
devdir(c, c->qid, ".", 0L, eve, CHDIR|0555, &dir);
.
80c
devdir(c, q, np->info[i].name, 0, eve, 0444, dp);
.
73c
devdir(c, q, "listen", 0, o, perm, dp);
.
67c
devdir(c, q, "ctl", 0, o, perm, dp);
.
63c
devdir(c, q, "data", 0, o, perm, dp);
.
59a
id = STREAMID(c->qid.path);
p = &np->prot[id];
if(*p->owner){
o = p->owner;
perm = p->mode;
} else {
o = eve;
perm = 0666;
}
.
53c
devdir(c, q, buf, 0, eve, 0555, dp);
.
46c
t = STREAMTYPE(c->qid.path);
if(t == Q2nd || t == Qclone){
.
37c
devdir(c, q, buf, 0, eve, 0555, dp);
.
27a
int t;
int id;
Netprot *p;
int perm;
char *o;
.
## diffname port/net.c 1991/1116
## diff -e /n/bootesdump/1991/1115/sys/src/9/port/net.c /n/bootesdump/1991/1116/sys/src/9/port/net.c
205a
if(netown(np, id, u->p->user, omode&7) < 0)
error(Eperm);
.
183,184d
## diffname port/net.c 1991/1122
## diff -e /n/bootesdump/1991/1116/sys/src/9/port/net.c /n/bootesdump/1991/1122/sys/src/9/port/net.c
173c
int id = 0;
.
## diffname port/net.c 1992/0111
## diff -e /n/bootesdump/1991/1122/sys/src/9/port/net.c /n/bootesdump/1992/0111/sys/src/9/port/net.c
6c
#include "../port/error.h"
.
## diffname port/net.c 1992/0321
## diff -e /n/bootesdump/1992/0111/sys/src/9/port/net.c /n/bootesdump/1992/0321/sys/src/9/port/net.c
2c
#include "../port/lib.h"
.
## diffname port/net.c 1992/0416
## diff -e /n/bootesdump/1992/0321/sys/src/9/port/net.c /n/bootesdump/1992/0416/sys/src/9/port/net.c
270a
if(np == 0) panic("np == 0");
.
## diffname port/net.c 1992/0619
## diff -e /n/bootesdump/1992/0416/sys/src/9/port/net.c /n/bootesdump/1992/0619/sys/src/9/port/net.c
8,9d
## diffname port/net.c 1992/0623
## diff -e /n/bootesdump/1992/0619/sys/src/9/port/net.c /n/bootesdump/1992/0623/sys/src/9/port/net.c
269,270c
p->owner[0] = 0;
.
267c
netdisown(Netprot *p)
.
261,262c
p->mode = 0660;
unlock(&netlock);
.
256c
unlock(&netlock);
.
253c
unlock(&netlock);
.
241,242c
lock(&netlock);
.
237d
234c
netown(Netprot *p, char *o, int omode)
.
232a
void
netadd(Network *np, Netprot *p, int id)
{
Netprot **l, *pp;
memset(p, 0, sizeof(Netprot));
p->id = id;
l = &np->prot;
for(pp = np->prot; pp; pp = pp->next){
if(pp->id == id)
panic("netadd");
l = &pp->next;
}
*l = p;
}
Lock netlock;
.
230c
return readstr(offset, a, n, buf);
.
202c
p = findprot(np, id);
if(p == 0) print("netopen: can't find %d\n", id);
if(netown(p, u->p->user, omode&7) < 0)
.
171a
Netprot *p;
.
156c
p = findprot(np, STREAMID(c->qid.path));
if(p == 0)
error(Enonexist);
.
64,66c
p = findprot(np, STREAMID(c->qid.path));
if(p && *p->owner){
.
27d
17a
* find protection structure
*/
static Netprot*
findprot(Network *np, int id)
{
Netprot *p;
for(p = np->prot; p; p = p->next)
if(p->id == id)
break;
return p;
}
/*
.
## diffname port/net.c 1992/0625
## diff -e /n/bootesdump/1992/0623/sys/src/9/port/net.c /n/bootesdump/1992/0625/sys/src/9/port/net.c
218d
78c
if(p == 0)
return 0;
if(*p->owner){
.
67a
if(findprot(np, i-1) == 0)
return 0;
.
## diffname port/net.c 1992/0711
## diff -e /n/bootesdump/1992/0625/sys/src/9/port/net.c /n/bootesdump/1992/0711/sys/src/9/port/net.c
44a
USED(ntab);
.
## diffname port/net.c 1992/0819
## diff -e /n/bootesdump/1992/0711/sys/src/9/port/net.c /n/bootesdump/1992/0819/sys/src/9/port/net.c
307a
}
#undef CHDIR /* BUG */
#include "/sys/src/libc/9syscall/sys.h"
void
netwstat(Chan *c, char *db, Network *np)
{
Dir dir;
Netprot *p;
p = findprot(np, STREAMID(c->qid.path));
if(p == 0)
error(Enonexist);
lock(np);
/*
* A network channel's ownership/permissions can be changed only if the
* wstat is by the owner or (HACK!) if it is performed using an fwstat.
* The latter allows processes started by a network listener to gain
* ownership of the connection. The open file descriptor is used as
* a capability for the connection.
*/
if(strncmp(p->owner, u->p->user, NAMELEN) != 0 && u->scallnr != FWSTAT){
unlock(np);
error(Eperm);
}
convM2D(db, &dir);
strncpy(p->owner, dir.uid, NAMELEN);
p->mode = dir.mode;
unlock(np);
.
167,186d
## diffname port/net.c 1992/0906
## diff -e /n/bootesdump/1992/0819/sys/src/9/port/net.c /n/bootesdump/1992/0906/sys/src/9/port/net.c
10,14c
Qlisten = 1,
Qclone = 2,
Q2nd = 3,
Q3rd = 4,
Qinf = 5,
.
## diffname port/net.c 1992/1217
## diff -e /n/bootesdump/1992/0906/sys/src/9/port/net.c /n/bootesdump/1992/1217/sys/src/9/port/net.c
154c
print("netstat %C %lux\n", devchar[c->type], c->qid.path);
.
## diffname port/net.c 1993/0323
## diff -e /n/bootesdump/1992/1217/sys/src/9/port/net.c /n/bootesdump/1993/0323/sys/src/9/port/net.c
159a
if(c->flag&CMSG)
dir.mode |= CHMOUNT;
.
## diffname port/net.c 1993/0330
## diff -e /n/bootesdump/1993/0323/sys/src/9/port/net.c /n/bootesdump/1993/0330/sys/src/9/port/net.c
139,166c
devstat(c, db, (Dirtab*)np, 1, netgen);
.
## diffname port/net.c 1993/0501
## diff -e /n/bootesdump/1993/0330/sys/src/9/port/net.c /n/fornaxdump/1993/0501/sys/src/brazil/port/net.c
286c
if(strncmp(p->owner, up->user, NAMELEN) != 0 && up->scallnr != FWSTAT){
.
178c
if(netown(p, up->user, omode&7) < 0)
.
165a
ptclone(c, 0, id);
.
161a
ptclone(c, 1, id);
.
139c
int i;
Dir dir;
for(i=0;; i++)
switch(netgen(c, (Dirtab*)np, 0, i, &dir)){
case -1:
/*
* devices with interesting directories usually don't get
* here, which is good because we've lost the name by now.
*/
if(c->qid.path & CHDIR){
devdir(c, c->qid, c->path->elem, 0L, eve, CHDIR|0555, &dir);
convD2M(&dir, db);
return;
}
print("netstat %C %lux\n", devchar[c->type], c->qid.path);
error(Enonexist);
case 0:
break;
case 1:
if(eqqid(c->qid, dir.qid)){
if(c->flag&CMSG)
dir.mode |= CHMOUNT;
convD2M(&dir, db);
return;
}
break;
}
.
## diffname port/net.c 1993/0508
## diff -e /n/fornaxdump/1993/0501/sys/src/brazil/port/net.c /n/fornaxdump/1993/0508/sys/src/brazil/port/net.c
244a
p->net = np;
.
224,226d
203,205d
192c
id = (*np->open)(c, -1);
.
187d
185d
182a
id = (*np->open)(c, id);
.
## diffname port/net.c 1993/0522
## diff -e /n/fornaxdump/1993/0508/sys/src/brazil/port/net.c /n/fornaxdump/1993/0522/sys/src/brazil/port/net.c
297c
p = findprot(np, NETID(c->qid.path));
.
223c
t = NETTYPE(c->qid.path);
if(t == Nctlqid)
readnum(offset, a, n, NETID(c->qid.path), NUMSIZE);
.
199,201c
switch(NETTYPE(c->qid.path)){
case Ndataqid:
case Nctlqid:
.
192c
c->qid.path = NETQID(id, Nctlqid);
.
187c
c->qid.path = NETQID(id, Nctlqid);
.
179,182c
switch(NETTYPE(c->qid.path)){
case Ndataqid:
case Nctlqid:
id = NETID(c->qid.path);
.
120c
switch(NETTYPE(c->qid.path)){
.
109c
q.path = NETQID(NETID(c->qid.path), Qinf+i);
.
102c
q.path = NETQID(NETID(c->qid.path), Qlisten);
.
96c
q.path = NETQID(NETID(c->qid.path), Nctlqid);
.
92c
q.path = NETQID(NETID(c->qid.path), Ndataqid);
.
80c
p = findprot(np, NETID(c->qid.path));
.
71c
q.path = CHDIR|NETQID(i-1, Q3rd);
.
63c
t = NETTYPE(c->qid.path);
.
## diffname port/net.c 1995/0804
## diff -e /n/fornaxdump/1993/0522/sys/src/brazil/port/net.c /n/fornaxdump/1995/0804/sys/src/brazil/port/net.c
45d
35c
netgen(Chan *c, void *vp, int, int i, Dir *dp)
.
## diffname port/net.c 1996/0531 # deleted
## diff -e /n/fornaxdump/1995/0804/sys/src/brazil/port/net.c /n/fornaxdump/1996/0531/sys/src/brazil/port/net.c
1,320d
|