Date: Thu, 6 May 2004 10:57:25 +0300 From: Artis Caune <artis-ml@fbsd.lv> To: freebsd-hackers@freebsd.org Subject: ioctl Message-ID: <20040506075725.GA1056@fbsd.lv>
next in thread | raw e-mail | index | archive | help
Is it correct to use code like this
instead of copyin() / copyout() ?
Kernel module gets pointer to structure
which resides in userland memory space
and modify it directly!!!
> userland: ioctl(tp_fd, TP_GET_TP_STATS, &tp_stats)
> kernel: tp_stats->hooked = hooked;
(freebsd 5.x, KLD)
----- START userland -----
#define TP_GET_TP_STATS _IOR('D', 200, struct tp_stats_s)
struct tp_stats_s {
int hooked;
u_short policer_active_pipes;
} tp_stats;
if (ioctl(tp_fd, TP_GET_TP_STATS, &tp_stats) != -1) {
printf("Traffic Policer is %s\n",
tp_stats.hooked ? "enabled" : "disabled");
printf("statistics:\n");
printf(" %-30s%u\n", "pipes hash table depth",
tp_stats.policer_pipes_hash_depth);
printf(" %-30s%u\n", "active pipes",
tp_stats.policer_active_pipes);
} else
fprintf(stderr, "IOCTL error\n");
----- END userland -----
----- START kernel -----
static int
tp_dev_ioctl (dev_t dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
{
switch (cmd) {
case TP_GET_TP_STATS:
err = get_tp_stats((struct tp_stats_s *)addr);
break;
...
}
static int
get_tp_stats (struct tp_stats_s *tp_stats)
{
TP_LOCK;
tp_stats->hooked = hooked;
/* hash depth will be gone in -release, just for debug */
tp_stats->policer_pipes_hash_depth = policer_pipes_hash_depth;
tp_stats->policer_active_pipes = policer_get_active_pipes();
TP_UNLOCK;
return (0);
}
...
----- END kernel -----
thanks,
--
Artis
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040506075725.GA1056>
