STREAMS를 통해 int 포인터를 반환하는 올바른(효율적인) 방법은 무엇입니까?

STREAMS를 통해 int 포인터를 반환하는 올바른(효율적인) 방법은 무엇입니까?

직렬 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가 답을 찾을 수 없을 정도로 신비스러워지지 않기를 바랍니다.

질문하고 도움을 주신 모든 분들께 감사드립니다.

표시

관련 정보