struct chan chans
[NCHANS
];
struct group
*groups
[NGROUPS
];
#define MIN(a,b) ((a<b)?a:b)
010000, 020000, 040000, 0100000
#define FP ((struct file *)cp)
register struct group
*gp
;
register struct file
*fp
;
register struct chan
*cp
;
if (gp
->g_state
== COPEN
) {
gp
->g_state
= INUSE
+ISGRP
;
if (!(gp
->g_state
&INUSE
))
fp
= u
.u_ofile
[u
.u_r
.r_val1
];
if (fp
->f_inode
!= gp
->g_inode
)
if ((cp
=addch(gp
->g_inode
, 0))==NULL
)
cp
->c_ottyp
= cp
->c_ttyp
= (struct tty
*)cp
;
cp
->c_line
= cp
->c_oline
= mpxline
;
fp
->f_flag
|= FREAD
+FWRITE
;
if (gp
->g_inode
== mpxip
) {
scontrol(cp
, msg
, u
.u_uid
);
sleep((caddr_t
)cp
,TTIPRI
);
if (cp
->c_flags
& WCLOSE
) {
cp
->c_pgrp
= u
.u_procp
->p_pgrp
;
register struct chan
*cp
;
u
.u_dirp
= (caddr_t
)u
.u_arg
[0];
while (np
< &mxnmbuf
[NMSIZE
]) {
register struct chan
*cp
;
register struct group
*gp
;
register struct inode
*ip
;
register struct file
*fp
;
if (cp
!=NULL
&& fmp
&& fmp
!=FMP
) {
for(fp
=file
; fp
< &file
[NFILE
]; fp
++)
if(fp
->f_count
&& fp
->f_flag
&FMP
&& fp
->f_un
.f_chan
==cp
){
if ((cp
->c_flags
&WCLOSE
)==0) {
scontrol(cp
, M_CLOSE
, 0);
if ((gp
= getmpx(dev
)) == NULL
)
if (ip
==NULL
|| (ip
->i_mode
&IFMT
)!=IFMPC
) {
for(fp
=file
; fp
< &file
[NFILE
]; fp
++) {
if (fp
->f_count
&& (fp
->f_flag
&FMP
)==FMP
&& fp
->f_inode
==ip
) {
if ((cp
=gp
->g_chans
[i
])!=NULL
)
groups
[minor(dev
)] = NULL
;
zero((caddr_t
)gp
, sizeof (struct group
));
char m_eot
[] ={ M_EOT
, 0, 0, 0};
* Mxread + mxwrite are entered from cdevsw
* for all read/write calls. Operations on
* an mpx file are handled here.
* Calls are made through linesw to handle actual
register struct group
*gp
;
register struct chan
*cp
;
if ((gp
=getmpx(dev
))==NULL
) {
msread(fmp
, FP
->f_un
.f_chan
);
while (gp
->g_datq
== 0) {
sleep((caddr_t
)&gp
->g_datq
, TTIPRI
);
while (gp
->g_datq
&& u
.u_count
>= CNTLSIZ
+ 2) {
if (count
= cp
->c_ctlx
.c_cc
) {
if (esc
&& cp
->c_flags
&PORT
) {
more
= (*linesw
[cp
->c_line
].l_read
)(cp
->c_ttyp
);
scontrol(cp
, M_CLOSE
, 0);
iomove((caddr_t
)m_eot
, sizeof m_eot
, B_READ
);
mxrstrt(cp
, &cp
->cx
.datq
, BLOCK
|ALT
);
if (u
.u_count
&& (xfr
&1)) {
copyout((caddr_t
)&h
, base
, sizeof h
);
register struct chan
*cp
;
int ucount
, esc
, fmp
, burpcount
;
if ((gp
=getmpx(dev
))==NULL
) {
mswrite(fmp
, FP
->f_un
.f_chan
);
while (u
.u_count
>= sizeof h
) {
iomove((caddr_t
)&h
, sizeof h
, B_WRITE
);
waddr
= (caddr_t
)(*linesw
[line
].l_write
)(tp
);
if (gp
->g_state
&ENAMSG
) {
scontrol(cp, M_BLK, u.u_count);
copyout((caddr_t
)&h
, hbase
, sizeof h
);
* Mcread and mcwrite move data on an mpx file.
* Transfer addr and length is controlled by mxread/mxwrite.
* Kernel-to-Kernel and other special transfers are not
register struct chan
*cp
;
register struct clist
*q
;
q
= (cp
->c_ctlx
.c_cc
) ? &cp
->c_ctlx
: &cp
->cx
.datq
;
if (cp
->c_flags
&NMBUF
&& q
== &cp
->c_ctlx
) {
return(cp
->c_ctlx
.c_cc
+ cp
->c_ttyp
->t_rawq
.c_cc
); else
return(cp
->c_ctlx
.c_cc
+ cp
->cx
.datq
.c_cc
);
register struct chan
*cp
;
register struct clist
*q
;
if (q
->c_cc
> HIQ
|| (cp
->c_flags
&EOTMARK
)) {
* Msread and mswrite move bytes
* between user and non-multiplexed channel.
register struct chan
*cp
;
register struct clist
*q
;
q
= (fmp
&FMPX
) ? &cp
->cx
.datq
: &cp
->cy
.datq
;
if (cp
->c_flags
& EOTMARK
) {
if (cp
->c_flags
&WCLOSE
) {
sleep((caddr_t
)q
,TTIPRI
);
while (mxmove(q
, B_READ
) > 0)
register struct chan
*cp
;
register struct clist
*q
;
q
= (fmp
&FMPX
) ? &cp
->cy
.datq
: &cp
->cx
.datq
;
if (cp
->c_flags
&WCLOSE
) {
signal(SIGPIPE
, cp
->c_pgrp
);
sleep((caddr_t
)q
+1,TTOPRI
);
* move chars between clist and user space.
register struct clist
*q
;
cc
= MIN(u
.u_count
, sizeof buf
);
iomove((caddr_t
)buf
, cc
, dir
);
register struct chan
*cp
;
register struct clist
*q
;
if (cp
->c_flags
&b
&& q
->c_cc
<LOQ
) {
wakeup((caddr_t
)q
+1); else
* called from driver start or xint routines
* to wakeup output sleeper.
register struct chan
*cp
;
if (cp
->c_flags
&(BLKMSG
)) {
register struct chan
*cp
;
iomove((caddr_t
)cmd
, sizeof cmd
, B_WRITE
);
* not ready to queue this up yet.
while (cp
->c_flags
& EOTMARK
)
if (cp
->c_flags
&ENAMSG
) {
sleep((caddr_t
)cp
, TTOPRI
);
mxioctl(dev
, cmd
, addr
, flag
)
if ((gp
= getmpx(dev
)) == NULL
) {
register struct chan
*cp
;
wflag
= (cp
->c_flags
&WCLOSE
)==0;
if (tp
== NULL
) /* prob not required */
if (cp
->c_flags
&PORT
&& tp
->t_chan
== cp
) {
wflush(cp
,&cp
->cx
.datq
); else
if (!(cp
->c_flags
&YGRP
)) {
register struct chan
*cp
;
p
= (char *)&cp
->cx
.datq
;
wakeup((caddr_t
)p
); wakeup((caddr_t
)++p
); wakeup((caddr_t
)++p
);
p
= (char *)&cp
->cy
.datq
;
wakeup((caddr_t
)p
); wakeup((caddr_t
)++p
); wakeup((caddr_t
)++p
);
register struct chan
*cp
;
register struct group
*gp
;
if (cp
== gp
->g_chans
[i
]) {
register struct clist
*q
;
register struct chan
*cp
;
register struct clist
*q
;
if (cp
->c_flags
& WCLOSE
) {
sleep((caddr_t
)q
+2,TTOPRI
);
register struct chan
*cp
;
register struct clist
*q
;
register struct chan
*cp
;
register struct group
*gp
;
register struct group
*lgp
;
if ((gp
->g_state
&ISGRP
)==0) {
wakeup((caddr_t
)&gp
->g_datq
);
register struct group
*gp
;
while (i
<NLEVELS
&& gp
->g_state
&ISGRP
) {
gp
= (struct group
*)gp
->g_chans
[x
&017];
return((struct chan
*)gp
);
register struct chan
*cp
;
register struct group
*gp
;
x
= (-1<<4) + cp
->c_index
;
if (gp
==NULL
|| (gp
->g_state
&ISGRP
)==0)
while (gp
&& gp
->g_state
&ISGRP
) {
register struct group
*gp
;
while (gp
!= NULL
&& gp
->g_state
&ISGRP
) {
while ( (gp
->g_datq
& gp
->g_rotmask
) == 0) {
gp
->g_rotmask
<<= 1; else
gp
= (struct group
*)gp
->g_chans
[gp
->g_rot
];
return((struct chan
*)gp
);
register struct chan
*cp
;
register struct group
*gp
;