-/* uipc_syscalls.c 4.27 82/10/03 */
+/* uipc_syscalls.c 4.39 82/12/28 */
#include "../h/param.h"
#include "../h/systm.h"
#include "../h/protosw.h"
#include "../h/socket.h"
#include "../h/socketvar.h"
-#include "../net/in.h"
-#include "../net/in_systm.h"
#include "../h/descrip.h"
#include "../h/uio.h"
register struct file *fp;
struct socketopt aopt;
- if ((fp = falloc()) == NULL)
+ u.u_error = sockopt(&aopt, (caddr_t)uap->opt);
+ if (u.u_error)
return;
+ if ((fp = falloc()) == NULL)
+ goto freeopt;
fp->f_flag = FREAD|FWRITE;
fp->f_type = DTYPE_SOCKET;
- u.u_error = sockopt(&aopt, uap->opt);
- if (u.u_error)
- goto bad;
- u.u_error = socreate(0, &so, uap->type, uap->protocol, &aopt);
+ u.u_error = socreate(uap->domain, &so, uap->type, uap->protocol, &aopt);
if (u.u_error)
goto bad;
fp->f_socket = so;
freeopt:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+ (void) m_free(dtom(aopt.so_optdata));
return;
bad:
u.u_ofile[u.u_r.r_val1] = 0;
u.u_error = sockname(&nam, uap->name, uap->namelen);
if (u.u_error)
return;
- u.u_error = sockopt(&aopt, uap->opt);
+ u.u_error = sockopt(&aopt, (caddr_t)uap->opt);
if (u.u_error) {
m_freem(nam);
- return;
+ goto freeopt;
}
u.u_error = sobind(fp->f_socket, nam, &aopt);
m_freem(nam);
+freeopt:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+ (void) m_free(dtom(aopt.so_optdata));
}
listen()
if (uap->name == 0)
goto noname;
- if (copyin((caddr_t)uap->anamelen, (caddr_t)&namelen, sizeof (namelen))) {
- u.u_error = EFAULT;
+ u.u_error = copyin((caddr_t)uap->anamelen, (caddr_t)&namelen,
+ sizeof (namelen));
+ if (u.u_error)
return;
- }
- if (useracc((caddr_t)uap->name, namelen, B_WRITE) == 0) {
+ if (useracc((caddr_t)uap->name, (u_int)namelen, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
}
noname:
- u.u_error = sockopt(&aopt, uap->opt);
+ u.u_error = sockopt(&aopt, (caddr_t)uap->opt);
if (u.u_error)
return;
fp = getf(uap->s);
if ((so->so_options & SO_NEWFDONCONN) == 0) {
struct socket *nso = so->so_q;
(void) soqremque(nso, 1);
- soclose(so, 1);
+ u.u_error = soclose(so, 1);
fp->f_socket = nso;
nso->so_q = 0;
so = nso;
fp->f_flag = FREAD|FWRITE;
fp->f_socket = so;
ret:
- nam = m_get(M_WAIT);
- nam->m_off = MMINOFF;
- soaccept(so, nam, &aopt);
+ nam = m_get(M_WAIT, MT_SONAME);
+ (void) soaccept(so, nam, &aopt);
if (uap->name) {
if (namelen > nam->m_len)
namelen = nam->m_len;
/* SHOULD COPY OUT A CHAIN HERE */
- (void) copyout(mtod(nam, caddr_t), uap->name, namelen);
- (void) copyout((caddr_t)&namelen, uap->anamelen,
+ (void) copyout(mtod(nam, caddr_t), (caddr_t)uap->name,
+ (u_int)namelen);
+ (void) copyout((caddr_t)&namelen, (caddr_t)uap->anamelen,
sizeof (*uap->anamelen));
}
m_freem(nam);
splx(s);
bad:
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+ (void) m_free(dtom(aopt.so_optdata));
}
connect()
u.u_error = sockname(&nam, uap->name, uap->namelen);
if (u.u_error)
return;
- u.u_error = sockopt(&aopt, uap->opt);
+ u.u_error = sockopt(&aopt, (caddr_t)uap->opt);
if (u.u_error) {
m_freem(nam);
return;
bad:
m_freem(nam);
if (uap->opt)
- m_free(dtom(aopt.so_optdata));
+ (void) m_free(dtom(aopt.so_optdata));
return;
}
auio.uio_resid = uap->len;
auio.uio_segflg = 0;
auio.uio_offset = 0; /* XXX */
- if (useracc(uap->buf, uap->len, B_READ) == 0) {
+ if (useracc(uap->buf, (u_int)uap->len, B_READ) == 0) {
u.u_error = EFAULT;
return;
}
u.u_error = sockname(&to, uap->to, uap->tolen);
if (u.u_error)
goto bad;
- u.u_error = sosend(fp->f_socket, to, &auio);
+ u.u_error = sosend(fp->f_socket, to, &auio, uap->flags);
+ u.u_r.r_val1 = uap->len - auio.uio_resid;
bad:
m_freem(to);
}
register struct file *fp;
struct uio auio;
struct iovec aiov;
- struct mbuf *nam;
fp = getf(uap->s);
if (fp == 0)
auio.uio_resid = uap->len;
auio.uio_segflg = 0;
auio.uio_offset = 0; /* XXX */
- if (useracc(uap->buf, uap->len, B_READ) == 0) {
+ if (useracc(uap->buf, (u_int)uap->len, B_READ) == 0) {
u.u_error = EFAULT;
return;
}
if (u.u_error)
return;
- u.u_error = sosend(fp->f_socket, (struct mbuf *)0, &auio);
+ u.u_error = sosend(fp->f_socket, (struct mbuf *)0, &auio, uap->flags);
+ u.u_r.r_val1 = uap->len - auio.uio_resid;
}
recvfrom()
struct mbuf *from;
int fromlen;
- if (copyin((caddr_t)uap->fromlenaddr, (caddr_t)&fromlen, sizeof (fromlen))) {
- u.u_error = EFAULT;
+ u.u_error = copyin((caddr_t)uap->fromlenaddr, (caddr_t)&fromlen,
+ sizeof (fromlen));
+ if (u.u_error)
return;
- }
fp = getf(uap->s);
if (fp == 0)
return;
auio.uio_resid = uap->len;
auio.uio_segflg = 0;
auio.uio_offset = 0; /* XXX */
- if (useracc(uap->buf, uap->len, B_WRITE) == 0) {
+ if (useracc(uap->buf, (u_int)uap->len, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
}
from = 0;
- u.u_error = soreceive(fp->f_socket, &from, &auio);
+ u.u_error = soreceive(fp->f_socket, &from, &auio, uap->flags);
if (u.u_error)
goto bad;
if (from == 0)
else {
if (fromlen > from->m_len)
fromlen = from->m_len;
- if (copyout(mtod(from, caddr_t), uap->from, fromlen)) {
- u.u_error = EFAULT;
+ u.u_error = copyout(mtod(from, caddr_t), uap->from,
+ (u_int)fromlen);
+ if (u.u_error)
goto bad;
- }
}
- if (copyout((caddr_t)&fromlen, (caddr_t)uap->fromlenaddr,
- sizeof (fromlen))) {
- u.u_error = EFAULT;
+ u.u_error = copyout((caddr_t)&fromlen, (caddr_t)uap->fromlenaddr,
+ sizeof (fromlen));
+ if (u.u_error)
goto bad;
- }
u.u_r.r_val1 = uap->len - auio.uio_resid;
bad:
if (from)
auio.uio_resid = uap->len;
auio.uio_segflg = 0;
auio.uio_offset = 0; /* XXX */
- if (useracc(uap->buf, uap->len, B_WRITE) == 0) {
+ if (useracc(uap->buf, (u_int)uap->len, B_WRITE) == 0) {
u.u_error = EFAULT;
return;
}
- u.u_error = soreceive(fp->f_socket, (struct mbuf *)0, &auio);
+ u.u_error =
+ soreceive(fp->f_socket, (struct mbuf **)0, &auio, uap->flags);
u.u_r.r_val1 = uap->len - auio.uio_resid;
}
struct socket *rso, *wso;
int r;
- u.u_error = socreate(1, &rso, SOCK_STREAM, 0, 0);
+ u.u_error = socreate(AF_UNIX, &rso, SOCK_STREAM, 0,
+ (struct socketopt *)0);
if (u.u_error)
return;
- u.u_error = socreate(1, &wso, SOCK_STREAM, 0, 0);
+ u.u_error = socreate(AF_UNIX, &wso, SOCK_STREAM, 0,
+ (struct socketopt *)0);
if (u.u_error)
goto free;
rf = falloc();
return;
}
so = fp->f_socket;
- m = m_getclr(M_WAIT);
+ m = m_getclr(M_WAIT, MT_SONAME);
u.u_error =
(*so->so_proto->pr_usrreq)(so, PRU_SOCKADDR, 0, m, 0);
if (u.u_error)
goto bad;
- if (copyout(mtod(m, caddr_t), (caddr_t)uap->asa, sizeof (struct sockaddr)))
- u.u_error = EFAULT;
+ u.u_error = copyout(mtod(m, caddr_t), (caddr_t)uap->asa,
+ sizeof (struct sockaddr));
bad:
m_freem(m);
}
int namelen;
{
register struct mbuf *m;
+ int error;
if (namelen > MLEN)
return (EINVAL);
- m = m_get(M_WAIT);
- m->m_off = MMINOFF;
+ m = m_get(M_WAIT, MT_SONAME);
m->m_len = namelen;
- if (copyin(name, mtod(m, caddr_t), namelen)) {
+ error = copyin(name, mtod(m, caddr_t), (u_int)namelen);
+ if (error)
(void) m_free(m);
- return (EFAULT);
- }
- *aname = m;
- return (0);
+ else
+ *aname = m;
+ return (error);
}
sockopt(so, opt)
caddr_t opt;
{
register struct mbuf *m;
+ int error;
if (opt == 0) {
so->so_optlen = 0;
so->so_optdata = 0;
return (0);
}
- if (copyin((caddr_t)opt, (caddr_t)so, sizeof (struct socketopt)))
- return (EFAULT);
+ error = copyin((caddr_t)opt, (caddr_t)so, sizeof (struct socketopt));
+ if (error)
+ return (error);
if (so->so_optlen < 0 || so->so_optlen > MLEN)
return (EINVAL);
- m = m_get(M_WAIT);
- m->m_off = MMINOFF;
+ m = m_get(M_WAIT, MT_SOOPTS);
m->m_len = so->so_optlen;
- if (copyin(so->so_optdata, mtod(m, caddr_t), m->m_len)) {
+ error = copyin(so->so_optdata, mtod(m, caddr_t), (u_int)m->m_len);
+ if (error) {
(void) m_free(m);
- return (EFAULT);
+ return (error);
}
so->so_optdata = mtod(m, caddr_t);
return (0);