/* uipc_syscalls.c 4.42 83/01/13 */
#include "../h/protosw.h"
#include "../h/socketvar.h"
#include "../h/descrip.h"
* System call interface to the socket abstraction.
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if ((fp
= falloc()) == NULL
)
fp
->f_flag
= FREAD
|FWRITE
;
fp
->f_type
= DTYPE_SOCKET
;
u
.u_error
= socreate(uap
->domain
, &so
, uap
->type
, uap
->protocol
);
u
.u_ofile
[u
.u_r
.r_val1
] = 0;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
u
.u_error
= sockname(&nam
, uap
->name
, uap
->namelen
);
u
.u_error
= sobind(fp
->f_socket
, nam
);
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
u
.u_error
= solisten(fp
->f_socket
, uap
->backlog
);
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
register struct socket
*so
;
u
.u_error
= copyin((caddr_t
)uap
->anamelen
, (caddr_t
)&namelen
,
if (useracc((caddr_t
)uap
->name
, (u_int
)namelen
, B_WRITE
) == 0) {
if (fp
->f_type
!= DTYPE_SOCKET
) {
if ((so
->so_options
& SO_ACCEPTCONN
) == 0) {
if ((so
->so_state
& SS_NBIO
) && so
->so_qlen
== 0) {
while (so
->so_qlen
== 0 && so
->so_error
== 0) {
if (so
->so_state
& SS_CANTRCVMORE
) {
so
->so_error
= ECONNABORTED
;
sleep((caddr_t
)&so
->so_timeo
, PZERO
+1);
u
.u_error
= so
->so_error
;
if ((so
->so_options
& SO_NEWFDONCONN
) == 0) {
struct socket
*nso
= so
->so_q
;
(void) soqremque(nso
, 1);
u
.u_error
= soclose(so
, 1);
u
.u_ofile
[u
.u_r
.r_val1
] = 0;
{ struct socket
*aso
= so
->so_q
;
if (soqremque(aso
, 1) == 0)
fp
->f_type
= DTYPE_SOCKET
;
fp
->f_flag
= FREAD
|FWRITE
;
nam
= m_get(M_WAIT
, MT_SONAME
);
(void) soaccept(so
, nam
);
if (namelen
> nam
->m_len
)
/* SHOULD COPY OUT A CHAIN HERE */
(void) copyout(mtod(nam
, caddr_t
), (caddr_t
)uap
->name
,
(void) copyout((caddr_t
)&namelen
, (caddr_t
)uap
->anamelen
,
sizeof (*uap
->anamelen
));
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
register struct socket
*so
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
u
.u_error
= sockname(&nam
, uap
->name
, uap
->namelen
);
u
.u_error
= soconnect(so
, nam
);
if ((so
->so_state
& SS_NBIO
) &&
(so
->so_state
& SS_ISCONNECTING
)) {
while ((so
->so_state
& SS_ISCONNECTING
) && so
->so_error
== 0)
sleep((caddr_t
)&so
->so_timeo
, PZERO
+1);
u
.u_error
= so
->so_error
;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
aiov
.iov_base
= uap
->buf
;
auio
.uio_resid
= uap
->len
;
auio
.uio_offset
= 0; /* XXX */
if (useracc(uap
->buf
, (u_int
)uap
->len
, B_READ
) == 0) {
u
.u_error
= sockname(&to
, uap
->to
, uap
->tolen
);
u
.u_error
= sosend(fp
->f_socket
, to
, &auio
, uap
->flags
);
u
.u_r
.r_val1
= uap
->len
- auio
.uio_resid
;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
aiov
.iov_base
= uap
->buf
;
auio
.uio_resid
= uap
->len
;
auio
.uio_offset
= 0; /* XXX */
if (useracc(uap
->buf
, (u_int
)uap
->len
, B_READ
) == 0) {
u
.u_error
= sosend(fp
->f_socket
, (struct mbuf
*)0, &auio
, uap
->flags
);
u
.u_r
.r_val1
= uap
->len
- auio
.uio_resid
;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
u
.u_error
= copyin((caddr_t
)uap
->fromlenaddr
, (caddr_t
)&fromlen
,
if (fp
->f_type
!= DTYPE_SOCKET
) {
aiov
.iov_base
= uap
->buf
;
auio
.uio_resid
= uap
->len
;
auio
.uio_offset
= 0; /* XXX */
if (useracc(uap
->buf
, (u_int
)uap
->len
, B_WRITE
) == 0) {
u
.u_error
= soreceive(fp
->f_socket
, &from
, &auio
, uap
->flags
);
if (fromlen
> from
->m_len
)
u
.u_error
= copyout(mtod(from
, caddr_t
), uap
->from
,
u
.u_error
= copyout((caddr_t
)&fromlen
, (caddr_t
)uap
->fromlenaddr
,
u
.u_r
.r_val1
= uap
->len
- auio
.uio_resid
;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
aiov
.iov_base
= uap
->buf
;
auio
.uio_resid
= uap
->len
;
auio
.uio_offset
= 0; /* XXX */
if (useracc(uap
->buf
, (u_int
)uap
->len
, B_WRITE
) == 0) {
soreceive(fp
->f_socket
, (struct mbuf
**)0, &auio
, uap
->flags
);
u
.u_r
.r_val1
= uap
->len
- auio
.uio_resid
;
} *uap
= (struct a
*)u
.u_ap
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
u
.u_error
= soshutdown(fp
->f_socket
, uap
->how
);
} *uap
= (struct a
*)u
.u_ap
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
if (uap
->valsize
> MLEN
) {
m
= m_get(M_WAIT
, MT_SOOPTS
);
u
.u_error
= copyin(uap
->val
, mtod(m
, caddr_t
),
u
.u_error
= sosetopt(fp
->f_socket
, uap
->level
, uap
->name
, m
);
} *uap
= (struct a
*)u
.u_ap
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
u
.u_error
= copyin((caddr_t
)uap
->avalsize
, (caddr_t
)&valsize
,
m
= m_get(M_WAIT
, MT_SOOPTS
);
u
.u_error
= sogetopt(fp
->f_socket
, uap
->level
, uap
->name
, m
);
u
.u_error
= copyout(mtod(m
, caddr_t
), uap
->val
, (u_int
)valsize
);
u
.u_error
= copyout((caddr_t
)&valsize
, (caddr_t
)uap
->avalsize
,
register struct file
*rf
, *wf
;
struct socket
*rso
, *wso
;
u
.u_error
= socreate(AF_UNIX
, &rso
, SOCK_STREAM
, 0,
u
.u_error
= socreate(AF_UNIX
, &wso
, SOCK_STREAM
, 0,
rf
->f_type
= DTYPE_SOCKET
;
wf
->f_type
= DTYPE_SOCKET
;
u
.u_r
.r_val2
= u
.u_r
.r_val1
;
if (piconnect(wso
, rso
) == 0)
u
.u_ofile
[u
.u_r
.r_val2
] = 0;
wso
->so_state
|= SS_NOFDREF
;
rso
->so_state
|= SS_NOFDREF
;
} *uap
= (struct a
*)u
.u_ap
;
register struct file
*fp
;
register struct socket
*so
;
if (fp
->f_type
!= DTYPE_SOCKET
) {
m
= m_getclr(M_WAIT
, MT_SONAME
);
(*so
->so_proto
->pr_usrreq
)(so
, PRU_SOCKADDR
, 0, m
, 0);
u
.u_error
= copyout(mtod(m
, caddr_t
), (caddr_t
)uap
->asa
,
sizeof (struct sockaddr
));
sockname(aname
, name
, namelen
)
m
= m_get(M_WAIT
, MT_SONAME
);
error
= copyin(name
, mtod(m
, caddr_t
), (u_int
)namelen
);