Приношу свои извенения за допущенные оплошности

.
QNX 6.3.2
код запроса со стороны пользователя:
int ioctl( int fd, int cmd, ... )
{
va_list ap;
unsigned long arg = 0;
va_start(ap, cmd);
arg = va_arg(ap, unsigned long);
va_end(ap);
if(!arg) {
fprintf(stderr, "Invalid parameters: arg = %lx
", arg);
return(EINVAL);
}
//по cmd возвращает количество байт
size_t nbytes = get_size_by_cmd( cmd );
int res = devctl(fd, cmd, (void*)arg, nbytes, NULL);
if(0 > res) {
fprintf(stderr, "Error: %s
", strerror(errno));
return res;
}
return 0;
}
код обработчика _IO_DEVCTL со стороны менеджера ресурсов:
int dev_ctl(resmgr_context_t *ctp, io_devctl_t *msg, RESMGR_OCB_T *ocb)
{
int nbytes, status;
if (((uint32_t)status = iofunc_devctl_default(ctp, msg, ocb)) != _RESMGR_DEFAULT) {
return(status);
}
status = nbytes = 0;
nbytes = msg->i.nbytes;
memset( dev->get_ioctl_buf_addr(), 0, nbytes );
resmgr_msgread(ctp, dev->get_ioctl_buf_addr(), nbytes, sizeof(msg->i));
status = dev->dev_ioctl( dev->get_ioctl_buf_addr(), msg->i.dcmd, &nbytes );
if(0 > status) {
fprintf(stderr,
"dev_ctl: Error in adp_ioctl().
"[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
return(EINVAL);
}
resmgr_msgwrite(ctp,
dev->get_ioctl_buf_addr(),
nbytes,
sizeof(msg->o));
memset(&msg->o, 0, sizeof(msg->o));
msg->o.ret_val = status;
msg->o.nbytes = nbytes;
return( _RESMGR_PTR(ctp, &msg->o, sizeof(msg->o)));
}
dev::get_ioctl_buf_addr() - возвращает адрес буфера который выделяется при создании объекта dev.
dev::dev_ioctl(void *buf_addr, int cmd, uint32_t *nbytes) - обрабатывает запрос, помещая в буфер объекта dev массив с данными из менеджера ресурсов, возвращая в nbytes - число положенных в буфер байт.
int ret = ioctl( fd, IOCTL_GET_BRD_INFO, &sGetInfo );
Спасибо.