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
|
#include <sys/types.h>
#include <sys/errno.h>
#include <sys/conf.h>
#include <sun/vddrv.h>
extern struct streamtab pppinfo;
extern int ppp_count;
extern int nchrdev;
static struct vdldrv vd = {
VDMAGIC_PSEUDO,
"ppp"
};
extern int nodev();
static struct cdevsw ppp_cdevsw = {
nodev, nodev, nodev, nodev, nodev, nodev, nodev, 0,
&pppinfo
};
static struct cdevsw old_entry;
int
ppp_vdcmd(fun, vdp, vdi, vds)
unsigned int fun;
struct vddrv *vdp;
addr_t vdi;
struct vdstat *vds;
{
static int majnum = -1;
int n, maj;
switch (fun) {
case VDLOAD:
/*
* It seems like modload doesn't install the cdevsw entry
* for us. Oh well...
*/
for (maj = 1; maj < nchrdev; ++maj)
if (cdevsw[maj].d_open == vd_unuseddev)
break;
if (maj >= nchrdev)
return ENODEV;
vd.Drv_charmajor = maj;
old_entry = cdevsw[maj];
cdevsw[maj] = ppp_cdevsw;
vd.Drv_cdevsw = &ppp_cdevsw;
vdp->vdd_vdtab = (struct vdlinkage *) &vd;
majnum = maj;
break;
case VDUNLOAD:
if (ppp_count > 0)
return EBUSY;
if (vd.Drv_charmajor > 0)
cdevsw[vd.Drv_charmajor] = old_entry;
break;
case VDSTAT:
/*
* We have to fool the modstat command into thinking
* that this module is actually a driver! This is
* so that installation commands that use the -exec
* option of modload to run a shell script find out
* the block and/or char major numbers of the driver
* loaded (so that the shell script can go off to
* /dev and *MAKE* the bloody device nodes- remember
* they might change from one load to another if
* you don't hardwire the number!).
*/
vds->vds_magic = VDMAGIC_DRV;
vds->vds_modinfo[0] = (char) 0;
vds->vds_modinfo[1] = (char) majnum;
break;
default:
return EIO;
}
return 0;
}
|