1/* 2 * Copyright (c) 1982, 1986, 1989, 1990, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * sendfile(2) and related extensions: 6 * Copyright (c) 1998, David Greenman. All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 23 unchanged lines hidden (view full) --- 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)uipc_syscalls.c 8.4 (Berkeley) 2/21/94 37 */ 38 39#include <sys/cdefs.h> |
40__FBSDID("$FreeBSD: head/sys/kern/uipc_syscalls.c 123811 2003-12-24 18:47:43Z alfred $"); |
41 42#include "opt_compat.h" 43#include "opt_ktrace.h" 44#include "opt_mac.h" 45 46#include <sys/param.h> 47#include <sys/systm.h> 48#include <sys/kernel.h> --- 179 unchanged lines hidden (view full) --- 228 * accept1() 229 * MPSAFE 230 */ 231static int 232accept1(td, uap, compat) 233 struct thread *td; 234 register struct accept_args /* { 235 int s; |
236 struct sockaddr * __restrict name; 237 socklen_t * __restrict anamelen; |
238 } */ *uap; 239 int compat; 240{ 241 struct filedesc *fdp; 242 struct file *nfp = NULL; 243 struct sockaddr *sa; |
244 socklen_t namelen; 245 int error, s; |
246 struct socket *head, *so; 247 int fd; 248 u_int fflag; 249 pid_t pgid; 250 int tmp; 251 252 fdp = td->td_proc->p_fd; 253 if (uap->name) { --- 658 unchanged lines hidden (view full) --- 912 register struct thread *td; 913 int s; 914 register struct msghdr *mp; 915 void *namelenp; 916{ 917 struct uio auio; 918 register struct iovec *iov; 919 register int i; |
920 socklen_t len; 921 int error; |
922 struct mbuf *m, *control = 0; 923 caddr_t ctlbuf; 924 struct socket *so; 925 struct sockaddr *fromsa = 0; 926#ifdef KTRACE 927 struct iovec *ktriov = NULL; 928 struct uio ktruio; 929 int iovlen; --- 36 unchanged lines hidden (view full) --- 966 ktruio = auio; 967 } 968#endif 969 len = auio.uio_resid; 970 error = so->so_proto->pr_usrreqs->pru_soreceive(so, &fromsa, &auio, 971 (struct mbuf **)0, mp->msg_control ? &control : (struct mbuf **)0, 972 &mp->msg_flags); 973 if (error) { |
974 if (auio.uio_resid != (int)len && (error == ERESTART || |
975 error == EINTR || error == EWOULDBLOCK)) 976 error = 0; 977 } 978#ifdef KTRACE 979 if (ktriov != NULL) { 980 if (error == 0) { 981 ktruio.uio_iov = ktriov; |
982 ktruio.uio_resid = (int)len - auio.uio_resid; |
983 ktrgenio(s, UIO_READ, &ktruio, error); 984 } 985 FREE(ktriov, M_TEMP); 986 } 987#endif 988 if (error) 989 goto out; |
990 td->td_retval[0] = (int)len - auio.uio_resid; |
991 if (mp->msg_name) { 992 len = mp->msg_namelen; 993 if (len <= 0 || fromsa == 0) 994 len = 0; 995 else { 996 /* save sa_len before it is destroyed by MSG_COMPAT */ 997 len = MIN(len, fromsa->sa_len); 998#ifdef COMPAT_OLDSOCK 999 if (mp->msg_flags & MSG_COMPAT) 1000 ((struct osockaddr *)fromsa)->sa_family = 1001 fromsa->sa_family; 1002#endif 1003 error = copyout(fromsa, mp->msg_name, (unsigned)len); 1004 if (error) 1005 goto out; 1006 } 1007 mp->msg_namelen = len; 1008 if (namelenp && |
1009 (error = copyout(&len, namelenp, sizeof (socklen_t)))) { |
1010#ifdef COMPAT_OLDSOCK 1011 if (mp->msg_flags & MSG_COMPAT) 1012 error = 0; /* old recvfrom didn't check */ 1013 else 1014#endif 1015 goto out; 1016 } 1017 } --- 59 unchanged lines hidden (view full) --- 1077int 1078recvfrom(td, uap) 1079 struct thread *td; 1080 register struct recvfrom_args /* { 1081 int s; 1082 caddr_t buf; 1083 size_t len; 1084 int flags; |
1085 struct sockaddr * __restrict from; 1086 socklen_t * __restrict fromlenaddr; |
1087 } */ *uap; 1088{ 1089 struct msghdr msg; 1090 struct iovec aiov; 1091 int error; 1092 1093 if (uap->fromlenaddr) { 1094 error = copyin(uap->fromlenaddr, --- 237 unchanged lines hidden (view full) --- 1332/* ARGSUSED */ 1333int 1334getsockopt(td, uap) 1335 struct thread *td; 1336 register struct getsockopt_args /* { 1337 int s; 1338 int level; 1339 int name; |
1340 void * __restrict val; 1341 socklen_t * __restrict avalsize; |
1342 } */ *uap; 1343{ |
1344 socklen_t valsize; 1345 int error; |
1346 struct socket *so; 1347 struct sockopt sopt; 1348 1349 mtx_lock(&Giant); 1350 if ((error = fgetsock(td, uap->s, &so, NULL)) != 0) 1351 goto done2; 1352 if (uap->val) { 1353 error = copyin(uap->avalsize, &valsize, sizeof (valsize)); --- 32 unchanged lines hidden (view full) --- 1386 * MPSAFE 1387 */ 1388/* ARGSUSED */ 1389static int 1390getsockname1(td, uap, compat) 1391 struct thread *td; 1392 register struct getsockname_args /* { 1393 int fdes; |
1394 struct sockaddr * __restrict asa; 1395 socklen_t * __restrict alen; |
1396 } */ *uap; 1397 int compat; 1398{ 1399 struct socket *so; 1400 struct sockaddr *sa; |
1401 socklen_t len; 1402 int error; |
1403 1404 mtx_lock(&Giant); 1405 if ((error = fgetsock(td, uap->fdes, &so, NULL)) != 0) 1406 goto done2; 1407 error = copyin(uap->alen, &len, sizeof (len)); 1408 if (error) 1409 goto done1; 1410 if (len < 0) { --- 60 unchanged lines hidden (view full) --- 1471 * MPSAFE 1472 */ 1473/* ARGSUSED */ 1474static int 1475getpeername1(td, uap, compat) 1476 struct thread *td; 1477 register struct getpeername_args /* { 1478 int fdes; |
1479 struct sockaddr * __restrict asa; 1480 socklen_t * __restrict alen; |
1481 } */ *uap; 1482 int compat; 1483{ 1484 struct socket *so; 1485 struct sockaddr *sa; |
1486 socklen_t len; 1487 int error; |
1488 1489 mtx_lock(&Giant); 1490 if ((error = fgetsock(td, uap->fdes, &so, NULL)) != 0) 1491 goto done2; 1492 if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) { 1493 error = ENOTCONN; 1494 goto done1; 1495 } --- 514 unchanged lines hidden --- |