ioctl

John Baldwin jhb at FreeBSD.org
Thu May 6 09:40:08 PDT 2004


On Thursday 06 May 2004 03:57 am, Artis Caune wrote:
> 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!!!

No, that's probably bogus.

>    > 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,

-- 
John Baldwin <jhb at FreeBSD.org>  <><  http://www.FreeBSD.org/~jhb/
"Power Users Use the Power to Serve"  =  http://www.FreeBSD.org


More information about the freebsd-hackers mailing list