Описание тега empathy
Я делал некоторые работы с Старый с svr4 коробка с серийным I/O, когда я обнаружил, что драйвер на адаптер не поддерживает TIOCMGET через функции ioctl вызов (например, вызов ioctl(FD, то TIOCMGET, &арг);). Имея источник для водитель, и, глядя на это, кажется, не слишком трудно добавить ответ на звонок. Однако, я столкнулся с немного корягу в том, что я делаю, кажется, не работает. Взглянув на водителя, он имеет следующий код для TCGETS услуги:
дело TCGETS:
{ /* немедленное получение Парм */
зарегистрировать структуру struct termios *ЦБ;
если (Мп->b_cont) /* плохой пользовательский параметр */
freemsg(Мп->b_cont);
если (!(вр1 = allocb(оператор sizeof(структура termios), BPRI_MED)))
{
putbq(м, Мп);
bufcall(оператор sizeof(структура termios), BPRI_MED, getoblk, (долго)ТП);
возврат;
}
Мп->b_cont = вр1;
КБ = (структуры struct termios *)Мп->b_cont->b_rptr;
КБ->c_iflag = ТП->t_iflag;
КБ->c_oflag = ТП->t_oflag;
КБ->c_cflag = ТП->t_cflag;
Мп->b_cont->b_wptr += оператор sizeof(структура termios);
Мп->b_datap->параметре = M_IOCACK;
iocbp->ioc_count = оператор sizeof(структура termios);
putnext(РД(м), Мп);
перерыв;
}
Моя мысль заключалась в том, чтобы просто скопировать этот код и вместо того, чтобы вернуть структуру termios, просто вернуть инт. Как таковой, мой код похож:
дело TIOCMGET:
{ /* немедленное получение Парм */
зарегистрировать инт *ЦБ;
если (Мп->b_cont) /* плохой пользовательский параметр */
freemsg(Мп->b_cont);
если (!(вр1 = allocb(оператор sizeof(тип int), BPRI_MED)))
{
putbq(м, Мп);
bufcall(оператор sizeof(тип int), BPRI_MED, getoblk, (долго)ТП);
возврат;
}
Мп->b_cont = вр1;
КБ = (инт *)Мп->b_cont->b_rptr;
/* моя оригинальная попытка получить некоторые биты */
*КБ = (КЖ->перевозчик * TIOCM_CAR | КЖ->РЦ * TIOCM_RTS | (КЖ->ЛП->Команда & 1) * TIOCM_DTR)
/* Пробовал это для отладки:
*КБ = 0;
Не похоже, чтобы изменить переменную я прохожу в */
/* Пробовал это, компилируется нормально,
*(инт *)Мп->b_cont->b_rptr = 0;
но я получаю неправильный аргумент, передаваемый ошибки во время выполнения */
qreply(м, Мп);
Мп->b_cont->b_wptr += оператор sizeof(тип int);
Мп->b_datap->параметре = M_IOCACK;
iocbp->ioc_count = оператор sizeof(тип int);
putnext(РД(м), Мп);
перерыв;
}
Делая вызов, как показано ранее, в ioctl(FD, то TIOCMGET, &арг), значение ARG, кажется, не изменилось. Я пробовал пару разных попыток возвращают значение 0 в случае, если проблема была в моем разрядный код назначения. Однако, у меня не было никаких удачи.
Я написал программу, чтобы убедиться, что TCGETS работает как надо - и он делает. Так что я не уверен, куда я иду неправильно - наверное, что-то невероятно глупое и прямо передо мной. Надеюсь, что это с svr4 и потоки не так уж и тайная, чтобы поставить ответ вне досягаемости.
Спасибо всем, кто смотрит и попытаться помочь.
Мак