직렬 I/O가 있는 오래된 SVR4 상자로 작업을 수행하던 중 직렬 카드용 드라이버가 ioctl 호출(예: ioctl(fd, TIOCMGET, &arg);)을 통해 TIOCMGET을 지원하지 않는다는 것을 발견했습니다. 드라이버의 소스 코드를 갖고 이를 살펴보십시오. 호출에 대한 응답을 추가하는 것은 그리 어렵지 않은 것 같습니다. 그러나 내가 하고 있는 일이 제대로 작동하지 않는 것 같아서 약간의 장애물에 부딪혔습니다. 드라이버를 살펴보면 TCGETS를 제공하는 다음 코드가 있습니다.
case TCGETS:
{ /* immediate parm retrieve */
register struct termios *cb;
if (mp->b_cont) /* Bad user supplied parameter */
freemsg(mp->b_cont);
if (!(bp1 = allocb(sizeof(struct termios), BPRI_MED)))
{
putbq(q, mp);
bufcall(sizeof(struct termios), BPRI_MED, getoblk, (long)tp);
return;
}
mp->b_cont = bp1;
cb = (struct termios *)mp->b_cont->b_rptr;
cb->c_iflag = tp->t_iflag;
cb->c_oflag = tp->t_oflag;
cb->c_cflag = tp->t_cflag;
mp->b_cont->b_wptr += sizeof(struct termios);
mp->b_datap->db_type = M_IOCACK;
iocbp->ioc_count = sizeof(struct termios);
putnext(RD(q), mp);
break;
}
내 생각은 단순히 이 코드를 복사하고 termios 구조를 반환하는 대신 int를 반환하는 것입니다. 내 코드는 다음과 같습니다.
case TIOCMGET:
{ /* immediate parm retrieve */
register int *cb;
if (mp->b_cont) /* Bad user supplied parameter */
freemsg(mp->b_cont);
if (!(bp1 = allocb(sizeof(int), BPRI_MED)))
{
putbq(q, mp);
bufcall(sizeof(int), BPRI_MED, getoblk, (long)tp);
return;
}
mp->b_cont = bp1;
cb = (int *)mp->b_cont->b_rptr;
/* my original attempt to get some bits */
*cb = (ql->carrier * TIOCM_CAR | ql->rts * TIOCM_RTS | (ql->lp->command & 1) * TIOCM_DTR)
/* Tried this to debug:
*cb = 0;
Doesn't seem to change the variable I pass in */
/* Tried this, compiles fine,
*(int *)mp->b_cont->b_rptr = 0;
but I get an improper argument passed error while running */
/* qreply(q, mp); not in my code, was a note to try it */
mp->b_cont->b_wptr += sizeof(int);
mp->b_datap->db_type = M_IOCACK;
iocbp->ioc_count = sizeof(int);
putnext(RD(q), mp);
break;
}
이전에 표시된 대로 ioctl(fd, TIOCMGET, &arg)를 호출하면 arg 값이 변경되지 않는 것으로 보입니다. 문제가 내 비트 할당 코드에 있는 경우를 대비해 0 값을 반환하기 위해 몇 가지 다른 시도를 시도했습니다. 그러나 나는 운이 좋지 않습니다.
나는 TCGETS가 제대로 작동하는지 확인하는 프로그램을 작성했으며 실제로 작동합니다. 그래서 나는 나에게 무엇이 잘못되었는지 잘 모르겠습니다. 아마도 매우 어리석은 일이 바로 내 앞에서 일어나고 있었을 것입니다. SVR4와 STREAMS가 답을 찾을 수 없을 정도로 신비스러워지지 않기를 바랍니다.
질문하고 도움을 주신 모든 분들께 감사드립니다.
표시