#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: ping.c,v 1.2 2020/02/05 14:10:47 pgoyette Exp $");
#include <sys/param.h>
#include <sys/conf.h>
#include <sys/device.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include "ping.h"
dev_type_open(ping_open);
dev_type_close(ping_close);
dev_type_ioctl(ping_ioctl);
static struct cdevsw ping_cdevsw = {
.d_open = noopen,
.d_close = noclose,
.d_read = noread,
.d_write = nowrite,
.d_ioctl = noioctl,
.d_stop = nostop,
.d_tty = notty,
.d_poll = nopoll,
.d_mmap = nommap,
.d_kqfilter = nokqfilter,
.d_discard = nodiscard,
.d_flag = D_OTHER
};
static struct bdevsw ping_bdevsw = {
.d_open = ping_open,
.d_close = ping_close,
.d_strategy = NULL,
.d_ioctl = ping_ioctl,
.d_dump = nodump,
.d_psize = nosize,
.d_discard = nodiscard,
.d_flag = D_OTHER
};
struct ping_softc {
int refcnt;
};
static struct ping_softc sc;
int
ping_open(dev_t self __unused, int flag __unused, int mode __unused,
struct lwp *l __unused)
{
if (sc.refcnt > 0)
return EBUSY;
++sc.refcnt;
return 0;
}
int
ping_close(dev_t self __unused, int flag __unused, int mode __unused,
struct lwp *l __unused)
{
--sc.refcnt;
return 0;
}
int
ping_ioctl(dev_t self __unused, u_long cmd, void *data, int flag,
struct lwp *l __unused)
{
switch(cmd) {
case CMD_PING:
printf("ping: pong!\n");
return 0;
default:
return ENOTTY;
}
}
MODULE(MODULE_CLASS_MISC, ping, NULL);
static int
ping_modcmd(modcmd_t cmd, void *arg __unused)
{
int bmajor = 351, cmajor = -1;
switch (cmd) {
case MODULE_CMD_INIT:
if (devsw_attach("ping", &ping_bdevsw, &bmajor, &ping_cdevsw, &cmajor))
return ENXIO;
return 0;
case MODULE_CMD_FINI:
if (sc.refcnt > 0)
return EBUSY;
devsw_detach(&ping_bdevsw, &ping_cdevsw);
return 0;
default:
return ENOTTY;
}
}