From ab5559aaabd1167a18ac882e64d97c5adc0e7d03 Mon Sep 17 00:00:00 2001 From: Guillaume Cottenceau Date: Mon, 11 Jun 2001 11:44:34 +0000 Subject: Initial revision --- mdk-stage1/ppp/sunos4/ppp_vdcmd.c | 81 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 mdk-stage1/ppp/sunos4/ppp_vdcmd.c (limited to 'mdk-stage1/ppp/sunos4/ppp_vdcmd.c') diff --git a/mdk-stage1/ppp/sunos4/ppp_vdcmd.c b/mdk-stage1/ppp/sunos4/ppp_vdcmd.c new file mode 100644 index 000000000..68095c92e --- /dev/null +++ b/mdk-stage1/ppp/sunos4/ppp_vdcmd.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include + +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; +} -- cgit v1.2.1