~kris/9p

9hist

ref: 5e772204e3ec6143d876b40f7864e34efb217d01 9hist/port/devdup.c -rw-r--r-- 1.7 KiB
5e772204 — David du Colombier Plan 9 from Bell Labs 1996-02-07 30 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include	"u.h"
#include	"../port/lib.h"
#include	"mem.h"
#include	"dat.h"
#include	"fns.h"
#include	"../port/error.h"

#include	"devtab.h"


int
dupgen(Chan *c, Dirtab*, int, int s, Dir *dp)
{
	char buf[8];
	Fgrp *fgrp = up->fgrp;
	Chan *f;
	static int perm[] = { 0400, 0200, 0600, 0 };

	if(s >= NFD)
		return -1;
	if((f=fgrp->fd[s]) == 0)
		return 0;
	sprint(buf, "%ld", s);
	devdir(c, (Qid){s, 0}, buf, 0, eve, perm[f->mode&3], dp);
	return 1;
}

void
dupinit(void)
{
}

void
dupreset(void)
{
}

Chan *
dupattach(char *spec)
{
	return devattach('d', spec);
}

Chan *
dupclone(Chan *c, Chan *nc)
{
	return devclone(c, nc);
}

int
dupwalk(Chan *c, char *name)
{
	return devwalk(c, name, (Dirtab *)0, 0, dupgen);
}

void
dupstat(Chan *c, char *db)
{
	devstat(c, db, (Dirtab *)0, 0L, dupgen);
}

Chan *
dupopen(Chan *c, int omode)
{
	Chan *f;

	if(c->qid.path == CHDIR){
		if(omode != 0)
			error(Eisdir);
		c->mode = 0;
		c->flag |= COPEN;
		c->offset = 0;
		return c;
	}
	fdtochan(c->qid.path, openmode(omode), 0, 0);	/* error check only */
	f = up->fgrp->fd[c->qid.path];
	close(c);
	incref(f);
	if(omode & OCEXEC)
		f->flag |= CCEXEC;
	return f;
}

void
dupcreate(Chan*, char*, int, ulong)
{
	error(Eperm);
}

void
dupremove(Chan*)
{
	error(Eperm);
}

void
dupwstat(Chan*, char*)
{
	error(Egreg);
}

void
dupclose(Chan*)
{
}

long
dupread(Chan *c, void *va, long n, ulong)
{
	char *a = va;

	if(c->qid.path != CHDIR)
		panic("dupread");
	return devdirread(c, a, n, (Dirtab *)0, 0L, dupgen);
}

Block*
dupbread(Chan *c, long n, ulong offset)
{
	return devbread(c, n, offset);
}

long
dupwrite(Chan*, void*, long, ulong)
{
	panic("dupwrite");
	return 0;		/* not reached */
}

long
dupbwrite(Chan *c, Block *bp, ulong offset)
{
	return devbwrite(c, bp, offset);
}