]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/kern/uipc_syscalls.c
Add atf pkg-config files from the vendor branch.
[FreeBSD/FreeBSD.git] / sys / kern / uipc_syscalls.c
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
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 4. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  *      @(#)uipc_syscalls.c     8.4 (Berkeley) 2/21/94
33  */
34
35 #include <sys/cdefs.h>
36 __FBSDID("$FreeBSD$");
37
38 #include "opt_capsicum.h"
39 #include "opt_inet.h"
40 #include "opt_inet6.h"
41 #include "opt_sctp.h"
42 #include "opt_compat.h"
43 #include "opt_ktrace.h"
44
45 #include <sys/param.h>
46 #include <sys/systm.h>
47 #include <sys/capability.h>
48 #include <sys/condvar.h>
49 #include <sys/kernel.h>
50 #include <sys/lock.h>
51 #include <sys/mutex.h>
52 #include <sys/sysproto.h>
53 #include <sys/malloc.h>
54 #include <sys/filedesc.h>
55 #include <sys/event.h>
56 #include <sys/proc.h>
57 #include <sys/fcntl.h>
58 #include <sys/file.h>
59 #include <sys/filio.h>
60 #include <sys/jail.h>
61 #include <sys/mman.h>
62 #include <sys/mount.h>
63 #include <sys/mbuf.h>
64 #include <sys/protosw.h>
65 #include <sys/rwlock.h>
66 #include <sys/sf_buf.h>
67 #include <sys/sf_sync.h>
68 #include <sys/sf_base.h>
69 #include <sys/sysent.h>
70 #include <sys/socket.h>
71 #include <sys/socketvar.h>
72 #include <sys/signalvar.h>
73 #include <sys/syscallsubr.h>
74 #include <sys/sysctl.h>
75 #include <sys/uio.h>
76 #include <sys/vnode.h>
77 #ifdef KTRACE
78 #include <sys/ktrace.h>
79 #endif
80 #ifdef COMPAT_FREEBSD32
81 #include <compat/freebsd32/freebsd32_util.h>
82 #endif
83
84 #include <net/vnet.h>
85
86 #include <security/audit/audit.h>
87 #include <security/mac/mac_framework.h>
88
89 #include <vm/vm.h>
90 #include <vm/vm_param.h>
91 #include <vm/vm_object.h>
92 #include <vm/vm_page.h>
93 #include <vm/vm_pager.h>
94 #include <vm/vm_kern.h>
95 #include <vm/vm_extern.h>
96 #include <vm/uma.h>
97
98 #if defined(INET) || defined(INET6)
99 #ifdef SCTP
100 #include <netinet/sctp.h>
101 #include <netinet/sctp_peeloff.h>
102 #endif /* SCTP */
103 #endif /* INET || INET6 */
104
105 /*
106  * Flags for accept1() and kern_accept4(), in addition to SOCK_CLOEXEC
107  * and SOCK_NONBLOCK.
108  */
109 #define ACCEPT4_INHERIT 0x1
110 #define ACCEPT4_COMPAT  0x2
111
112 static int sendit(struct thread *td, int s, struct msghdr *mp, int flags);
113 static int recvit(struct thread *td, int s, struct msghdr *mp, void *namelenp);
114
115 static int accept1(struct thread *td, int s, struct sockaddr *uname,
116                    socklen_t *anamelen, int flags);
117 static int do_sendfile(struct thread *td, struct sendfile_args *uap,
118                    int compat);
119 static int getsockname1(struct thread *td, struct getsockname_args *uap,
120                         int compat);
121 static int getpeername1(struct thread *td, struct getpeername_args *uap,
122                         int compat);
123
124 counter_u64_t sfstat[sizeof(struct sfstat) / sizeof(uint64_t)];
125
126 /*
127  * sendfile(2)-related variables and associated sysctls
128  */
129 static SYSCTL_NODE(_kern_ipc, OID_AUTO, sendfile, CTLFLAG_RW, 0,
130     "sendfile(2) tunables");
131 static int sfreadahead = 1;
132 SYSCTL_INT(_kern_ipc_sendfile, OID_AUTO, readahead, CTLFLAG_RW,
133     &sfreadahead, 0, "Number of sendfile(2) read-ahead MAXBSIZE blocks");
134
135 static uma_zone_t       zone_sfsync;
136
137 static void
138 sfstat_init(const void *unused)
139 {
140
141         COUNTER_ARRAY_ALLOC(sfstat, sizeof(struct sfstat) / sizeof(uint64_t),
142             M_WAITOK);
143 }
144 SYSINIT(sfstat, SI_SUB_MBUF, SI_ORDER_FIRST, sfstat_init, NULL);
145
146 static void
147 sf_sync_init(const void *unused)
148 {
149
150         zone_sfsync = uma_zcreate("sendfile_sync", sizeof(struct sendfile_sync),
151             NULL, NULL,
152             NULL, NULL,
153             UMA_ALIGN_CACHE,
154             0);
155 }
156 SYSINIT(sf_sync, SI_SUB_MBUF, SI_ORDER_FIRST, sf_sync_init, NULL);
157
158 static int
159 sfstat_sysctl(SYSCTL_HANDLER_ARGS)
160 {
161         struct sfstat s;
162
163         COUNTER_ARRAY_COPY(sfstat, &s, sizeof(s) / sizeof(uint64_t));
164         if (req->newptr)
165                 COUNTER_ARRAY_ZERO(sfstat, sizeof(s) / sizeof(uint64_t));
166         return (SYSCTL_OUT(req, &s, sizeof(s)));
167 }
168 SYSCTL_PROC(_kern_ipc, OID_AUTO, sfstat, CTLTYPE_OPAQUE | CTLFLAG_RW,
169     NULL, 0, sfstat_sysctl, "I", "sendfile statistics");
170
171 /*
172  * Convert a user file descriptor to a kernel file entry and check if required
173  * capability rights are present.
174  * A reference on the file entry is held upon returning.
175  */
176 static int
177 getsock_cap(struct filedesc *fdp, int fd, cap_rights_t *rightsp,
178     struct file **fpp, u_int *fflagp)
179 {
180         struct file *fp;
181         int error;
182
183         error = fget_unlocked(fdp, fd, rightsp, 0, &fp, NULL);
184         if (error != 0)
185                 return (error);
186         if (fp->f_type != DTYPE_SOCKET) {
187                 fdrop(fp, curthread);
188                 return (ENOTSOCK);
189         }
190         if (fflagp != NULL)
191                 *fflagp = fp->f_flag;
192         *fpp = fp;
193         return (0);
194 }
195
196 /*
197  * System call interface to the socket abstraction.
198  */
199 #if defined(COMPAT_43)
200 #define COMPAT_OLDSOCK
201 #endif
202
203 int
204 sys_socket(td, uap)
205         struct thread *td;
206         struct socket_args /* {
207                 int     domain;
208                 int     type;
209                 int     protocol;
210         } */ *uap;
211 {
212         struct socket *so;
213         struct file *fp;
214         int fd, error, type, oflag, fflag;
215
216         AUDIT_ARG_SOCKET(uap->domain, uap->type, uap->protocol);
217
218         type = uap->type;
219         oflag = 0;
220         fflag = 0;
221         if ((type & SOCK_CLOEXEC) != 0) {
222                 type &= ~SOCK_CLOEXEC;
223                 oflag |= O_CLOEXEC;
224         }
225         if ((type & SOCK_NONBLOCK) != 0) {
226                 type &= ~SOCK_NONBLOCK;
227                 fflag |= FNONBLOCK;
228         }
229
230 #ifdef MAC
231         error = mac_socket_check_create(td->td_ucred, uap->domain, type,
232             uap->protocol);
233         if (error != 0)
234                 return (error);
235 #endif
236         error = falloc(td, &fp, &fd, oflag);
237         if (error != 0)
238                 return (error);
239         /* An extra reference on `fp' has been held for us by falloc(). */
240         error = socreate(uap->domain, &so, type, uap->protocol,
241             td->td_ucred, td);
242         if (error != 0) {
243                 fdclose(td->td_proc->p_fd, fp, fd, td);
244         } else {
245                 finit(fp, FREAD | FWRITE | fflag, DTYPE_SOCKET, so, &socketops);
246                 if ((fflag & FNONBLOCK) != 0)
247                         (void) fo_ioctl(fp, FIONBIO, &fflag, td->td_ucred, td);
248                 td->td_retval[0] = fd;
249         }
250         fdrop(fp, td);
251         return (error);
252 }
253
254 /* ARGSUSED */
255 int
256 sys_bind(td, uap)
257         struct thread *td;
258         struct bind_args /* {
259                 int     s;
260                 caddr_t name;
261                 int     namelen;
262         } */ *uap;
263 {
264         struct sockaddr *sa;
265         int error;
266
267         error = getsockaddr(&sa, uap->name, uap->namelen);
268         if (error == 0) {
269                 error = kern_bind(td, uap->s, sa);
270                 free(sa, M_SONAME);
271         }
272         return (error);
273 }
274
275 static int
276 kern_bindat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
277 {
278         struct socket *so;
279         struct file *fp;
280         cap_rights_t rights;
281         int error;
282
283         AUDIT_ARG_FD(fd);
284         AUDIT_ARG_SOCKADDR(td, dirfd, sa);
285         error = getsock_cap(td->td_proc->p_fd, fd,
286             cap_rights_init(&rights, CAP_BIND), &fp, NULL);
287         if (error != 0)
288                 return (error);
289         so = fp->f_data;
290 #ifdef KTRACE
291         if (KTRPOINT(td, KTR_STRUCT))
292                 ktrsockaddr(sa);
293 #endif
294 #ifdef MAC
295         error = mac_socket_check_bind(td->td_ucred, so, sa);
296         if (error == 0) {
297 #endif
298                 if (dirfd == AT_FDCWD)
299                         error = sobind(so, sa, td);
300                 else
301                         error = sobindat(dirfd, so, sa, td);
302 #ifdef MAC
303         }
304 #endif
305         fdrop(fp, td);
306         return (error);
307 }
308
309 int
310 kern_bind(struct thread *td, int fd, struct sockaddr *sa)
311 {
312
313         return (kern_bindat(td, AT_FDCWD, fd, sa));
314 }
315
316 /* ARGSUSED */
317 int
318 sys_bindat(td, uap)
319         struct thread *td;
320         struct bindat_args /* {
321                 int     fd;
322                 int     s;
323                 caddr_t name;
324                 int     namelen;
325         } */ *uap;
326 {
327         struct sockaddr *sa;
328         int error;
329
330         error = getsockaddr(&sa, uap->name, uap->namelen);
331         if (error == 0) {
332                 error = kern_bindat(td, uap->fd, uap->s, sa);
333                 free(sa, M_SONAME);
334         }
335         return (error);
336 }
337
338 /* ARGSUSED */
339 int
340 sys_listen(td, uap)
341         struct thread *td;
342         struct listen_args /* {
343                 int     s;
344                 int     backlog;
345         } */ *uap;
346 {
347         struct socket *so;
348         struct file *fp;
349         cap_rights_t rights;
350         int error;
351
352         AUDIT_ARG_FD(uap->s);
353         error = getsock_cap(td->td_proc->p_fd, uap->s,
354             cap_rights_init(&rights, CAP_LISTEN), &fp, NULL);
355         if (error == 0) {
356                 so = fp->f_data;
357 #ifdef MAC
358                 error = mac_socket_check_listen(td->td_ucred, so);
359                 if (error == 0)
360 #endif
361                         error = solisten(so, uap->backlog, td);
362                 fdrop(fp, td);
363         }
364         return(error);
365 }
366
367 /*
368  * accept1()
369  */
370 static int
371 accept1(td, s, uname, anamelen, flags)
372         struct thread *td;
373         int s;
374         struct sockaddr *uname;
375         socklen_t *anamelen;
376         int flags;
377 {
378         struct sockaddr *name;
379         socklen_t namelen;
380         struct file *fp;
381         int error;
382
383         if (uname == NULL)
384                 return (kern_accept4(td, s, NULL, NULL, flags, NULL));
385
386         error = copyin(anamelen, &namelen, sizeof (namelen));
387         if (error != 0)
388                 return (error);
389
390         error = kern_accept4(td, s, &name, &namelen, flags, &fp);
391
392         /*
393          * return a namelen of zero for older code which might
394          * ignore the return value from accept.
395          */
396         if (error != 0) {
397                 (void) copyout(&namelen, anamelen, sizeof(*anamelen));
398                 return (error);
399         }
400
401         if (error == 0 && uname != NULL) {
402 #ifdef COMPAT_OLDSOCK
403                 if (flags & ACCEPT4_COMPAT)
404                         ((struct osockaddr *)name)->sa_family =
405                             name->sa_family;
406 #endif
407                 error = copyout(name, uname, namelen);
408         }
409         if (error == 0)
410                 error = copyout(&namelen, anamelen,
411                     sizeof(namelen));
412         if (error != 0)
413                 fdclose(td->td_proc->p_fd, fp, td->td_retval[0], td);
414         fdrop(fp, td);
415         free(name, M_SONAME);
416         return (error);
417 }
418
419 int
420 kern_accept(struct thread *td, int s, struct sockaddr **name,
421     socklen_t *namelen, struct file **fp)
422 {
423         return (kern_accept4(td, s, name, namelen, ACCEPT4_INHERIT, fp));
424 }
425
426 int
427 kern_accept4(struct thread *td, int s, struct sockaddr **name,
428     socklen_t *namelen, int flags, struct file **fp)
429 {
430         struct filedesc *fdp;
431         struct file *headfp, *nfp = NULL;
432         struct sockaddr *sa = NULL;
433         struct socket *head, *so;
434         cap_rights_t rights;
435         u_int fflag;
436         pid_t pgid;
437         int error, fd, tmp;
438
439         if (name != NULL)
440                 *name = NULL;
441
442         AUDIT_ARG_FD(s);
443         fdp = td->td_proc->p_fd;
444         error = getsock_cap(fdp, s, cap_rights_init(&rights, CAP_ACCEPT),
445             &headfp, &fflag);
446         if (error != 0)
447                 return (error);
448         head = headfp->f_data;
449         if ((head->so_options & SO_ACCEPTCONN) == 0) {
450                 error = EINVAL;
451                 goto done;
452         }
453 #ifdef MAC
454         error = mac_socket_check_accept(td->td_ucred, head);
455         if (error != 0)
456                 goto done;
457 #endif
458         error = falloc(td, &nfp, &fd, (flags & SOCK_CLOEXEC) ? O_CLOEXEC : 0);
459         if (error != 0)
460                 goto done;
461         ACCEPT_LOCK();
462         if ((head->so_state & SS_NBIO) && TAILQ_EMPTY(&head->so_comp)) {
463                 ACCEPT_UNLOCK();
464                 error = EWOULDBLOCK;
465                 goto noconnection;
466         }
467         while (TAILQ_EMPTY(&head->so_comp) && head->so_error == 0) {
468                 if (head->so_rcv.sb_state & SBS_CANTRCVMORE) {
469                         head->so_error = ECONNABORTED;
470                         break;
471                 }
472                 error = msleep(&head->so_timeo, &accept_mtx, PSOCK | PCATCH,
473                     "accept", 0);
474                 if (error != 0) {
475                         ACCEPT_UNLOCK();
476                         goto noconnection;
477                 }
478         }
479         if (head->so_error) {
480                 error = head->so_error;
481                 head->so_error = 0;
482                 ACCEPT_UNLOCK();
483                 goto noconnection;
484         }
485         so = TAILQ_FIRST(&head->so_comp);
486         KASSERT(!(so->so_qstate & SQ_INCOMP), ("accept1: so SQ_INCOMP"));
487         KASSERT(so->so_qstate & SQ_COMP, ("accept1: so not SQ_COMP"));
488
489         /*
490          * Before changing the flags on the socket, we have to bump the
491          * reference count.  Otherwise, if the protocol calls sofree(),
492          * the socket will be released due to a zero refcount.
493          */
494         SOCK_LOCK(so);                  /* soref() and so_state update */
495         soref(so);                      /* file descriptor reference */
496
497         TAILQ_REMOVE(&head->so_comp, so, so_list);
498         head->so_qlen--;
499         if (flags & ACCEPT4_INHERIT)
500                 so->so_state |= (head->so_state & SS_NBIO);
501         else
502                 so->so_state |= (flags & SOCK_NONBLOCK) ? SS_NBIO : 0;
503         so->so_qstate &= ~SQ_COMP;
504         so->so_head = NULL;
505
506         SOCK_UNLOCK(so);
507         ACCEPT_UNLOCK();
508
509         /* An extra reference on `nfp' has been held for us by falloc(). */
510         td->td_retval[0] = fd;
511
512         /* connection has been removed from the listen queue */
513         KNOTE_UNLOCKED(&head->so_rcv.sb_sel.si_note, 0);
514
515         if (flags & ACCEPT4_INHERIT) {
516                 pgid = fgetown(&head->so_sigio);
517                 if (pgid != 0)
518                         fsetown(pgid, &so->so_sigio);
519         } else {
520                 fflag &= ~(FNONBLOCK | FASYNC);
521                 if (flags & SOCK_NONBLOCK)
522                         fflag |= FNONBLOCK;
523         }
524
525         finit(nfp, fflag, DTYPE_SOCKET, so, &socketops);
526         /* Sync socket nonblocking/async state with file flags */
527         tmp = fflag & FNONBLOCK;
528         (void) fo_ioctl(nfp, FIONBIO, &tmp, td->td_ucred, td);
529         tmp = fflag & FASYNC;
530         (void) fo_ioctl(nfp, FIOASYNC, &tmp, td->td_ucred, td);
531         sa = 0;
532         error = soaccept(so, &sa);
533         if (error != 0) {
534                 /*
535                  * return a namelen of zero for older code which might
536                  * ignore the return value from accept.
537                  */
538                 if (name)
539                         *namelen = 0;
540                 goto noconnection;
541         }
542         if (sa == NULL) {
543                 if (name)
544                         *namelen = 0;
545                 goto done;
546         }
547         AUDIT_ARG_SOCKADDR(td, AT_FDCWD, sa);
548         if (name) {
549                 /* check sa_len before it is destroyed */
550                 if (*namelen > sa->sa_len)
551                         *namelen = sa->sa_len;
552 #ifdef KTRACE
553                 if (KTRPOINT(td, KTR_STRUCT))
554                         ktrsockaddr(sa);
555 #endif
556                 *name = sa;
557                 sa = NULL;
558         }
559 noconnection:
560         free(sa, M_SONAME);
561
562         /*
563          * close the new descriptor, assuming someone hasn't ripped it
564          * out from under us.
565          */
566         if (error != 0)
567                 fdclose(fdp, nfp, fd, td);
568
569         /*
570          * Release explicitly held references before returning.  We return
571          * a reference on nfp to the caller on success if they request it.
572          */
573 done:
574         if (fp != NULL) {
575                 if (error == 0) {
576                         *fp = nfp;
577                         nfp = NULL;
578                 } else
579                         *fp = NULL;
580         }
581         if (nfp != NULL)
582                 fdrop(nfp, td);
583         fdrop(headfp, td);
584         return (error);
585 }
586
587 int
588 sys_accept(td, uap)
589         struct thread *td;
590         struct accept_args *uap;
591 {
592
593         return (accept1(td, uap->s, uap->name, uap->anamelen, ACCEPT4_INHERIT));
594 }
595
596 int
597 sys_accept4(td, uap)
598         struct thread *td;
599         struct accept4_args *uap;
600 {
601
602         if (uap->flags & ~(SOCK_CLOEXEC | SOCK_NONBLOCK))
603                 return (EINVAL);
604
605         return (accept1(td, uap->s, uap->name, uap->anamelen, uap->flags));
606 }
607
608 #ifdef COMPAT_OLDSOCK
609 int
610 oaccept(td, uap)
611         struct thread *td;
612         struct accept_args *uap;
613 {
614
615         return (accept1(td, uap->s, uap->name, uap->anamelen,
616             ACCEPT4_INHERIT | ACCEPT4_COMPAT));
617 }
618 #endif /* COMPAT_OLDSOCK */
619
620 /* ARGSUSED */
621 int
622 sys_connect(td, uap)
623         struct thread *td;
624         struct connect_args /* {
625                 int     s;
626                 caddr_t name;
627                 int     namelen;
628         } */ *uap;
629 {
630         struct sockaddr *sa;
631         int error;
632
633         error = getsockaddr(&sa, uap->name, uap->namelen);
634         if (error == 0) {
635                 error = kern_connect(td, uap->s, sa);
636                 free(sa, M_SONAME);
637         }
638         return (error);
639 }
640
641 static int
642 kern_connectat(struct thread *td, int dirfd, int fd, struct sockaddr *sa)
643 {
644         struct socket *so;
645         struct file *fp;
646         cap_rights_t rights;
647         int error, interrupted = 0;
648
649         AUDIT_ARG_FD(fd);
650         AUDIT_ARG_SOCKADDR(td, dirfd, sa);
651         error = getsock_cap(td->td_proc->p_fd, fd,
652             cap_rights_init(&rights, CAP_CONNECT), &fp, NULL);
653         if (error != 0)
654                 return (error);
655         so = fp->f_data;
656         if (so->so_state & SS_ISCONNECTING) {
657                 error = EALREADY;
658                 goto done1;
659         }
660 #ifdef KTRACE
661         if (KTRPOINT(td, KTR_STRUCT))
662                 ktrsockaddr(sa);
663 #endif
664 #ifdef MAC
665         error = mac_socket_check_connect(td->td_ucred, so, sa);
666         if (error != 0)
667                 goto bad;
668 #endif
669         if (dirfd == AT_FDCWD)
670                 error = soconnect(so, sa, td);
671         else
672                 error = soconnectat(dirfd, so, sa, td);
673         if (error != 0)
674                 goto bad;
675         if ((so->so_state & SS_NBIO) && (so->so_state & SS_ISCONNECTING)) {
676                 error = EINPROGRESS;
677                 goto done1;
678         }
679         SOCK_LOCK(so);
680         while ((so->so_state & SS_ISCONNECTING) && so->so_error == 0) {
681                 error = msleep(&so->so_timeo, SOCK_MTX(so), PSOCK | PCATCH,
682                     "connec", 0);
683                 if (error != 0) {
684                         if (error == EINTR || error == ERESTART)
685                                 interrupted = 1;
686                         break;
687                 }
688         }
689         if (error == 0) {
690                 error = so->so_error;
691                 so->so_error = 0;
692         }
693         SOCK_UNLOCK(so);
694 bad:
695         if (!interrupted)
696                 so->so_state &= ~SS_ISCONNECTING;
697         if (error == ERESTART)
698                 error = EINTR;
699 done1:
700         fdrop(fp, td);
701         return (error);
702 }
703
704 int
705 kern_connect(struct thread *td, int fd, struct sockaddr *sa)
706 {
707
708         return (kern_connectat(td, AT_FDCWD, fd, sa));
709 }
710
711 /* ARGSUSED */
712 int
713 sys_connectat(td, uap)
714         struct thread *td;
715         struct connectat_args /* {
716                 int     fd;
717                 int     s;
718                 caddr_t name;
719                 int     namelen;
720         } */ *uap;
721 {
722         struct sockaddr *sa;
723         int error;
724
725         error = getsockaddr(&sa, uap->name, uap->namelen);
726         if (error == 0) {
727                 error = kern_connectat(td, uap->fd, uap->s, sa);
728                 free(sa, M_SONAME);
729         }
730         return (error);
731 }
732
733 int
734 kern_socketpair(struct thread *td, int domain, int type, int protocol,
735     int *rsv)
736 {
737         struct filedesc *fdp = td->td_proc->p_fd;
738         struct file *fp1, *fp2;
739         struct socket *so1, *so2;
740         int fd, error, oflag, fflag;
741
742         AUDIT_ARG_SOCKET(domain, type, protocol);
743
744         oflag = 0;
745         fflag = 0;
746         if ((type & SOCK_CLOEXEC) != 0) {
747                 type &= ~SOCK_CLOEXEC;
748                 oflag |= O_CLOEXEC;
749         }
750         if ((type & SOCK_NONBLOCK) != 0) {
751                 type &= ~SOCK_NONBLOCK;
752                 fflag |= FNONBLOCK;
753         }
754 #ifdef MAC
755         /* We might want to have a separate check for socket pairs. */
756         error = mac_socket_check_create(td->td_ucred, domain, type,
757             protocol);
758         if (error != 0)
759                 return (error);
760 #endif
761         error = socreate(domain, &so1, type, protocol, td->td_ucred, td);
762         if (error != 0)
763                 return (error);
764         error = socreate(domain, &so2, type, protocol, td->td_ucred, td);
765         if (error != 0)
766                 goto free1;
767         /* On success extra reference to `fp1' and 'fp2' is set by falloc. */
768         error = falloc(td, &fp1, &fd, oflag);
769         if (error != 0)
770                 goto free2;
771         rsv[0] = fd;
772         fp1->f_data = so1;      /* so1 already has ref count */
773         error = falloc(td, &fp2, &fd, oflag);
774         if (error != 0)
775                 goto free3;
776         fp2->f_data = so2;      /* so2 already has ref count */
777         rsv[1] = fd;
778         error = soconnect2(so1, so2);
779         if (error != 0)
780                 goto free4;
781         if (type == SOCK_DGRAM) {
782                 /*
783                  * Datagram socket connection is asymmetric.
784                  */
785                  error = soconnect2(so2, so1);
786                  if (error != 0)
787                         goto free4;
788         }
789         finit(fp1, FREAD | FWRITE | fflag, DTYPE_SOCKET, fp1->f_data,
790             &socketops);
791         finit(fp2, FREAD | FWRITE | fflag, DTYPE_SOCKET, fp2->f_data,
792             &socketops);
793         if ((fflag & FNONBLOCK) != 0) {
794                 (void) fo_ioctl(fp1, FIONBIO, &fflag, td->td_ucred, td);
795                 (void) fo_ioctl(fp2, FIONBIO, &fflag, td->td_ucred, td);
796         }
797         fdrop(fp1, td);
798         fdrop(fp2, td);
799         return (0);
800 free4:
801         fdclose(fdp, fp2, rsv[1], td);
802         fdrop(fp2, td);
803 free3:
804         fdclose(fdp, fp1, rsv[0], td);
805         fdrop(fp1, td);
806 free2:
807         if (so2 != NULL)
808                 (void)soclose(so2);
809 free1:
810         if (so1 != NULL)
811                 (void)soclose(so1);
812         return (error);
813 }
814
815 int
816 sys_socketpair(struct thread *td, struct socketpair_args *uap)
817 {
818         int error, sv[2];
819
820         error = kern_socketpair(td, uap->domain, uap->type,
821             uap->protocol, sv);
822         if (error != 0)
823                 return (error);
824         error = copyout(sv, uap->rsv, 2 * sizeof(int));
825         if (error != 0) {
826                 (void)kern_close(td, sv[0]);
827                 (void)kern_close(td, sv[1]);
828         }
829         return (error);
830 }
831
832 static int
833 sendit(td, s, mp, flags)
834         struct thread *td;
835         int s;
836         struct msghdr *mp;
837         int flags;
838 {
839         struct mbuf *control;
840         struct sockaddr *to;
841         int error;
842
843 #ifdef CAPABILITY_MODE
844         if (IN_CAPABILITY_MODE(td) && (mp->msg_name != NULL))
845                 return (ECAPMODE);
846 #endif
847
848         if (mp->msg_name != NULL) {
849                 error = getsockaddr(&to, mp->msg_name, mp->msg_namelen);
850                 if (error != 0) {
851                         to = NULL;
852                         goto bad;
853                 }
854                 mp->msg_name = to;
855         } else {
856                 to = NULL;
857         }
858
859         if (mp->msg_control) {
860                 if (mp->msg_controllen < sizeof(struct cmsghdr)
861 #ifdef COMPAT_OLDSOCK
862                     && mp->msg_flags != MSG_COMPAT
863 #endif
864                 ) {
865                         error = EINVAL;
866                         goto bad;
867                 }
868                 error = sockargs(&control, mp->msg_control,
869                     mp->msg_controllen, MT_CONTROL);
870                 if (error != 0)
871                         goto bad;
872 #ifdef COMPAT_OLDSOCK
873                 if (mp->msg_flags == MSG_COMPAT) {
874                         struct cmsghdr *cm;
875
876                         M_PREPEND(control, sizeof(*cm), M_WAITOK);
877                         cm = mtod(control, struct cmsghdr *);
878                         cm->cmsg_len = control->m_len;
879                         cm->cmsg_level = SOL_SOCKET;
880                         cm->cmsg_type = SCM_RIGHTS;
881                 }
882 #endif
883         } else {
884                 control = NULL;
885         }
886
887         error = kern_sendit(td, s, mp, flags, control, UIO_USERSPACE);
888
889 bad:
890         free(to, M_SONAME);
891         return (error);
892 }
893
894 int
895 kern_sendit(td, s, mp, flags, control, segflg)
896         struct thread *td;
897         int s;
898         struct msghdr *mp;
899         int flags;
900         struct mbuf *control;
901         enum uio_seg segflg;
902 {
903         struct file *fp;
904         struct uio auio;
905         struct iovec *iov;
906         struct socket *so;
907         cap_rights_t rights;
908 #ifdef KTRACE
909         struct uio *ktruio = NULL;
910 #endif
911         ssize_t len;
912         int i, error;
913
914         AUDIT_ARG_FD(s);
915         cap_rights_init(&rights, CAP_SEND);
916         if (mp->msg_name != NULL) {
917                 AUDIT_ARG_SOCKADDR(td, AT_FDCWD, mp->msg_name);
918                 cap_rights_set(&rights, CAP_CONNECT);
919         }
920         error = getsock_cap(td->td_proc->p_fd, s, &rights, &fp, NULL);
921         if (error != 0)
922                 return (error);
923         so = (struct socket *)fp->f_data;
924
925 #ifdef KTRACE
926         if (mp->msg_name != NULL && KTRPOINT(td, KTR_STRUCT))
927                 ktrsockaddr(mp->msg_name);
928 #endif
929 #ifdef MAC
930         if (mp->msg_name != NULL) {
931                 error = mac_socket_check_connect(td->td_ucred, so,
932                     mp->msg_name);
933                 if (error != 0)
934                         goto bad;
935         }
936         error = mac_socket_check_send(td->td_ucred, so);
937         if (error != 0)
938                 goto bad;
939 #endif
940
941         auio.uio_iov = mp->msg_iov;
942         auio.uio_iovcnt = mp->msg_iovlen;
943         auio.uio_segflg = segflg;
944         auio.uio_rw = UIO_WRITE;
945         auio.uio_td = td;
946         auio.uio_offset = 0;                    /* XXX */
947         auio.uio_resid = 0;
948         iov = mp->msg_iov;
949         for (i = 0; i < mp->msg_iovlen; i++, iov++) {
950                 if ((auio.uio_resid += iov->iov_len) < 0) {
951                         error = EINVAL;
952                         goto bad;
953                 }
954         }
955 #ifdef KTRACE
956         if (KTRPOINT(td, KTR_GENIO))
957                 ktruio = cloneuio(&auio);
958 #endif
959         len = auio.uio_resid;
960         error = sosend(so, mp->msg_name, &auio, 0, control, flags, td);
961         if (error != 0) {
962                 if (auio.uio_resid != len && (error == ERESTART ||
963                     error == EINTR || error == EWOULDBLOCK))
964                         error = 0;
965                 /* Generation of SIGPIPE can be controlled per socket */
966                 if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
967                     !(flags & MSG_NOSIGNAL)) {
968                         PROC_LOCK(td->td_proc);
969                         tdsignal(td, SIGPIPE);
970                         PROC_UNLOCK(td->td_proc);
971                 }
972         }
973         if (error == 0)
974                 td->td_retval[0] = len - auio.uio_resid;
975 #ifdef KTRACE
976         if (ktruio != NULL) {
977                 ktruio->uio_resid = td->td_retval[0];
978                 ktrgenio(s, UIO_WRITE, ktruio, error);
979         }
980 #endif
981 bad:
982         fdrop(fp, td);
983         return (error);
984 }
985
986 int
987 sys_sendto(td, uap)
988         struct thread *td;
989         struct sendto_args /* {
990                 int     s;
991                 caddr_t buf;
992                 size_t  len;
993                 int     flags;
994                 caddr_t to;
995                 int     tolen;
996         } */ *uap;
997 {
998         struct msghdr msg;
999         struct iovec aiov;
1000
1001         msg.msg_name = uap->to;
1002         msg.msg_namelen = uap->tolen;
1003         msg.msg_iov = &aiov;
1004         msg.msg_iovlen = 1;
1005         msg.msg_control = 0;
1006 #ifdef COMPAT_OLDSOCK
1007         msg.msg_flags = 0;
1008 #endif
1009         aiov.iov_base = uap->buf;
1010         aiov.iov_len = uap->len;
1011         return (sendit(td, uap->s, &msg, uap->flags));
1012 }
1013
1014 #ifdef COMPAT_OLDSOCK
1015 int
1016 osend(td, uap)
1017         struct thread *td;
1018         struct osend_args /* {
1019                 int     s;
1020                 caddr_t buf;
1021                 int     len;
1022                 int     flags;
1023         } */ *uap;
1024 {
1025         struct msghdr msg;
1026         struct iovec aiov;
1027
1028         msg.msg_name = 0;
1029         msg.msg_namelen = 0;
1030         msg.msg_iov = &aiov;
1031         msg.msg_iovlen = 1;
1032         aiov.iov_base = uap->buf;
1033         aiov.iov_len = uap->len;
1034         msg.msg_control = 0;
1035         msg.msg_flags = 0;
1036         return (sendit(td, uap->s, &msg, uap->flags));
1037 }
1038
1039 int
1040 osendmsg(td, uap)
1041         struct thread *td;
1042         struct osendmsg_args /* {
1043                 int     s;
1044                 caddr_t msg;
1045                 int     flags;
1046         } */ *uap;
1047 {
1048         struct msghdr msg;
1049         struct iovec *iov;
1050         int error;
1051
1052         error = copyin(uap->msg, &msg, sizeof (struct omsghdr));
1053         if (error != 0)
1054                 return (error);
1055         error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1056         if (error != 0)
1057                 return (error);
1058         msg.msg_iov = iov;
1059         msg.msg_flags = MSG_COMPAT;
1060         error = sendit(td, uap->s, &msg, uap->flags);
1061         free(iov, M_IOV);
1062         return (error);
1063 }
1064 #endif
1065
1066 int
1067 sys_sendmsg(td, uap)
1068         struct thread *td;
1069         struct sendmsg_args /* {
1070                 int     s;
1071                 caddr_t msg;
1072                 int     flags;
1073         } */ *uap;
1074 {
1075         struct msghdr msg;
1076         struct iovec *iov;
1077         int error;
1078
1079         error = copyin(uap->msg, &msg, sizeof (msg));
1080         if (error != 0)
1081                 return (error);
1082         error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1083         if (error != 0)
1084                 return (error);
1085         msg.msg_iov = iov;
1086 #ifdef COMPAT_OLDSOCK
1087         msg.msg_flags = 0;
1088 #endif
1089         error = sendit(td, uap->s, &msg, uap->flags);
1090         free(iov, M_IOV);
1091         return (error);
1092 }
1093
1094 int
1095 kern_recvit(td, s, mp, fromseg, controlp)
1096         struct thread *td;
1097         int s;
1098         struct msghdr *mp;
1099         enum uio_seg fromseg;
1100         struct mbuf **controlp;
1101 {
1102         struct uio auio;
1103         struct iovec *iov;
1104         struct mbuf *m, *control = NULL;
1105         caddr_t ctlbuf;
1106         struct file *fp;
1107         struct socket *so;
1108         struct sockaddr *fromsa = NULL;
1109         cap_rights_t rights;
1110 #ifdef KTRACE
1111         struct uio *ktruio = NULL;
1112 #endif
1113         ssize_t len;
1114         int error, i;
1115
1116         if (controlp != NULL)
1117                 *controlp = NULL;
1118
1119         AUDIT_ARG_FD(s);
1120         error = getsock_cap(td->td_proc->p_fd, s,
1121             cap_rights_init(&rights, CAP_RECV), &fp, NULL);
1122         if (error != 0)
1123                 return (error);
1124         so = fp->f_data;
1125
1126 #ifdef MAC
1127         error = mac_socket_check_receive(td->td_ucred, so);
1128         if (error != 0) {
1129                 fdrop(fp, td);
1130                 return (error);
1131         }
1132 #endif
1133
1134         auio.uio_iov = mp->msg_iov;
1135         auio.uio_iovcnt = mp->msg_iovlen;
1136         auio.uio_segflg = UIO_USERSPACE;
1137         auio.uio_rw = UIO_READ;
1138         auio.uio_td = td;
1139         auio.uio_offset = 0;                    /* XXX */
1140         auio.uio_resid = 0;
1141         iov = mp->msg_iov;
1142         for (i = 0; i < mp->msg_iovlen; i++, iov++) {
1143                 if ((auio.uio_resid += iov->iov_len) < 0) {
1144                         fdrop(fp, td);
1145                         return (EINVAL);
1146                 }
1147         }
1148 #ifdef KTRACE
1149         if (KTRPOINT(td, KTR_GENIO))
1150                 ktruio = cloneuio(&auio);
1151 #endif
1152         len = auio.uio_resid;
1153         error = soreceive(so, &fromsa, &auio, NULL,
1154             (mp->msg_control || controlp) ? &control : NULL,
1155             &mp->msg_flags);
1156         if (error != 0) {
1157                 if (auio.uio_resid != len && (error == ERESTART ||
1158                     error == EINTR || error == EWOULDBLOCK))
1159                         error = 0;
1160         }
1161         if (fromsa != NULL)
1162                 AUDIT_ARG_SOCKADDR(td, AT_FDCWD, fromsa);
1163 #ifdef KTRACE
1164         if (ktruio != NULL) {
1165                 ktruio->uio_resid = len - auio.uio_resid;
1166                 ktrgenio(s, UIO_READ, ktruio, error);
1167         }
1168 #endif
1169         if (error != 0)
1170                 goto out;
1171         td->td_retval[0] = len - auio.uio_resid;
1172         if (mp->msg_name) {
1173                 len = mp->msg_namelen;
1174                 if (len <= 0 || fromsa == NULL)
1175                         len = 0;
1176                 else {
1177                         /* save sa_len before it is destroyed by MSG_COMPAT */
1178                         len = MIN(len, fromsa->sa_len);
1179 #ifdef COMPAT_OLDSOCK
1180                         if (mp->msg_flags & MSG_COMPAT)
1181                                 ((struct osockaddr *)fromsa)->sa_family =
1182                                     fromsa->sa_family;
1183 #endif
1184                         if (fromseg == UIO_USERSPACE) {
1185                                 error = copyout(fromsa, mp->msg_name,
1186                                     (unsigned)len);
1187                                 if (error != 0)
1188                                         goto out;
1189                         } else
1190                                 bcopy(fromsa, mp->msg_name, len);
1191                 }
1192                 mp->msg_namelen = len;
1193         }
1194         if (mp->msg_control && controlp == NULL) {
1195 #ifdef COMPAT_OLDSOCK
1196                 /*
1197                  * We assume that old recvmsg calls won't receive access
1198                  * rights and other control info, esp. as control info
1199                  * is always optional and those options didn't exist in 4.3.
1200                  * If we receive rights, trim the cmsghdr; anything else
1201                  * is tossed.
1202                  */
1203                 if (control && mp->msg_flags & MSG_COMPAT) {
1204                         if (mtod(control, struct cmsghdr *)->cmsg_level !=
1205                             SOL_SOCKET ||
1206                             mtod(control, struct cmsghdr *)->cmsg_type !=
1207                             SCM_RIGHTS) {
1208                                 mp->msg_controllen = 0;
1209                                 goto out;
1210                         }
1211                         control->m_len -= sizeof (struct cmsghdr);
1212                         control->m_data += sizeof (struct cmsghdr);
1213                 }
1214 #endif
1215                 len = mp->msg_controllen;
1216                 m = control;
1217                 mp->msg_controllen = 0;
1218                 ctlbuf = mp->msg_control;
1219
1220                 while (m && len > 0) {
1221                         unsigned int tocopy;
1222
1223                         if (len >= m->m_len)
1224                                 tocopy = m->m_len;
1225                         else {
1226                                 mp->msg_flags |= MSG_CTRUNC;
1227                                 tocopy = len;
1228                         }
1229
1230                         if ((error = copyout(mtod(m, caddr_t),
1231                                         ctlbuf, tocopy)) != 0)
1232                                 goto out;
1233
1234                         ctlbuf += tocopy;
1235                         len -= tocopy;
1236                         m = m->m_next;
1237                 }
1238                 mp->msg_controllen = ctlbuf - (caddr_t)mp->msg_control;
1239         }
1240 out:
1241         fdrop(fp, td);
1242 #ifdef KTRACE
1243         if (fromsa && KTRPOINT(td, KTR_STRUCT))
1244                 ktrsockaddr(fromsa);
1245 #endif
1246         free(fromsa, M_SONAME);
1247
1248         if (error == 0 && controlp != NULL)
1249                 *controlp = control;
1250         else  if (control)
1251                 m_freem(control);
1252
1253         return (error);
1254 }
1255
1256 static int
1257 recvit(td, s, mp, namelenp)
1258         struct thread *td;
1259         int s;
1260         struct msghdr *mp;
1261         void *namelenp;
1262 {
1263         int error;
1264
1265         error = kern_recvit(td, s, mp, UIO_USERSPACE, NULL);
1266         if (error != 0)
1267                 return (error);
1268         if (namelenp != NULL) {
1269                 error = copyout(&mp->msg_namelen, namelenp, sizeof (socklen_t));
1270 #ifdef COMPAT_OLDSOCK
1271                 if (mp->msg_flags & MSG_COMPAT)
1272                         error = 0;      /* old recvfrom didn't check */
1273 #endif
1274         }
1275         return (error);
1276 }
1277
1278 int
1279 sys_recvfrom(td, uap)
1280         struct thread *td;
1281         struct recvfrom_args /* {
1282                 int     s;
1283                 caddr_t buf;
1284                 size_t  len;
1285                 int     flags;
1286                 struct sockaddr * __restrict    from;
1287                 socklen_t * __restrict fromlenaddr;
1288         } */ *uap;
1289 {
1290         struct msghdr msg;
1291         struct iovec aiov;
1292         int error;
1293
1294         if (uap->fromlenaddr) {
1295                 error = copyin(uap->fromlenaddr,
1296                     &msg.msg_namelen, sizeof (msg.msg_namelen));
1297                 if (error != 0)
1298                         goto done2;
1299         } else {
1300                 msg.msg_namelen = 0;
1301         }
1302         msg.msg_name = uap->from;
1303         msg.msg_iov = &aiov;
1304         msg.msg_iovlen = 1;
1305         aiov.iov_base = uap->buf;
1306         aiov.iov_len = uap->len;
1307         msg.msg_control = 0;
1308         msg.msg_flags = uap->flags;
1309         error = recvit(td, uap->s, &msg, uap->fromlenaddr);
1310 done2:
1311         return (error);
1312 }
1313
1314 #ifdef COMPAT_OLDSOCK
1315 int
1316 orecvfrom(td, uap)
1317         struct thread *td;
1318         struct recvfrom_args *uap;
1319 {
1320
1321         uap->flags |= MSG_COMPAT;
1322         return (sys_recvfrom(td, uap));
1323 }
1324 #endif
1325
1326 #ifdef COMPAT_OLDSOCK
1327 int
1328 orecv(td, uap)
1329         struct thread *td;
1330         struct orecv_args /* {
1331                 int     s;
1332                 caddr_t buf;
1333                 int     len;
1334                 int     flags;
1335         } */ *uap;
1336 {
1337         struct msghdr msg;
1338         struct iovec aiov;
1339
1340         msg.msg_name = 0;
1341         msg.msg_namelen = 0;
1342         msg.msg_iov = &aiov;
1343         msg.msg_iovlen = 1;
1344         aiov.iov_base = uap->buf;
1345         aiov.iov_len = uap->len;
1346         msg.msg_control = 0;
1347         msg.msg_flags = uap->flags;
1348         return (recvit(td, uap->s, &msg, NULL));
1349 }
1350
1351 /*
1352  * Old recvmsg.  This code takes advantage of the fact that the old msghdr
1353  * overlays the new one, missing only the flags, and with the (old) access
1354  * rights where the control fields are now.
1355  */
1356 int
1357 orecvmsg(td, uap)
1358         struct thread *td;
1359         struct orecvmsg_args /* {
1360                 int     s;
1361                 struct  omsghdr *msg;
1362                 int     flags;
1363         } */ *uap;
1364 {
1365         struct msghdr msg;
1366         struct iovec *iov;
1367         int error;
1368
1369         error = copyin(uap->msg, &msg, sizeof (struct omsghdr));
1370         if (error != 0)
1371                 return (error);
1372         error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1373         if (error != 0)
1374                 return (error);
1375         msg.msg_flags = uap->flags | MSG_COMPAT;
1376         msg.msg_iov = iov;
1377         error = recvit(td, uap->s, &msg, &uap->msg->msg_namelen);
1378         if (msg.msg_controllen && error == 0)
1379                 error = copyout(&msg.msg_controllen,
1380                     &uap->msg->msg_accrightslen, sizeof (int));
1381         free(iov, M_IOV);
1382         return (error);
1383 }
1384 #endif
1385
1386 int
1387 sys_recvmsg(td, uap)
1388         struct thread *td;
1389         struct recvmsg_args /* {
1390                 int     s;
1391                 struct  msghdr *msg;
1392                 int     flags;
1393         } */ *uap;
1394 {
1395         struct msghdr msg;
1396         struct iovec *uiov, *iov;
1397         int error;
1398
1399         error = copyin(uap->msg, &msg, sizeof (msg));
1400         if (error != 0)
1401                 return (error);
1402         error = copyiniov(msg.msg_iov, msg.msg_iovlen, &iov, EMSGSIZE);
1403         if (error != 0)
1404                 return (error);
1405         msg.msg_flags = uap->flags;
1406 #ifdef COMPAT_OLDSOCK
1407         msg.msg_flags &= ~MSG_COMPAT;
1408 #endif
1409         uiov = msg.msg_iov;
1410         msg.msg_iov = iov;
1411         error = recvit(td, uap->s, &msg, NULL);
1412         if (error == 0) {
1413                 msg.msg_iov = uiov;
1414                 error = copyout(&msg, uap->msg, sizeof(msg));
1415         }
1416         free(iov, M_IOV);
1417         return (error);
1418 }
1419
1420 /* ARGSUSED */
1421 int
1422 sys_shutdown(td, uap)
1423         struct thread *td;
1424         struct shutdown_args /* {
1425                 int     s;
1426                 int     how;
1427         } */ *uap;
1428 {
1429         struct socket *so;
1430         struct file *fp;
1431         cap_rights_t rights;
1432         int error;
1433
1434         AUDIT_ARG_FD(uap->s);
1435         error = getsock_cap(td->td_proc->p_fd, uap->s,
1436             cap_rights_init(&rights, CAP_SHUTDOWN), &fp, NULL);
1437         if (error == 0) {
1438                 so = fp->f_data;
1439                 error = soshutdown(so, uap->how);
1440                 fdrop(fp, td);
1441         }
1442         return (error);
1443 }
1444
1445 /* ARGSUSED */
1446 int
1447 sys_setsockopt(td, uap)
1448         struct thread *td;
1449         struct setsockopt_args /* {
1450                 int     s;
1451                 int     level;
1452                 int     name;
1453                 caddr_t val;
1454                 int     valsize;
1455         } */ *uap;
1456 {
1457
1458         return (kern_setsockopt(td, uap->s, uap->level, uap->name,
1459             uap->val, UIO_USERSPACE, uap->valsize));
1460 }
1461
1462 int
1463 kern_setsockopt(td, s, level, name, val, valseg, valsize)
1464         struct thread *td;
1465         int s;
1466         int level;
1467         int name;
1468         void *val;
1469         enum uio_seg valseg;
1470         socklen_t valsize;
1471 {
1472         struct socket *so;
1473         struct file *fp;
1474         struct sockopt sopt;
1475         cap_rights_t rights;
1476         int error;
1477
1478         if (val == NULL && valsize != 0)
1479                 return (EFAULT);
1480         if ((int)valsize < 0)
1481                 return (EINVAL);
1482
1483         sopt.sopt_dir = SOPT_SET;
1484         sopt.sopt_level = level;
1485         sopt.sopt_name = name;
1486         sopt.sopt_val = val;
1487         sopt.sopt_valsize = valsize;
1488         switch (valseg) {
1489         case UIO_USERSPACE:
1490                 sopt.sopt_td = td;
1491                 break;
1492         case UIO_SYSSPACE:
1493                 sopt.sopt_td = NULL;
1494                 break;
1495         default:
1496                 panic("kern_setsockopt called with bad valseg");
1497         }
1498
1499         AUDIT_ARG_FD(s);
1500         error = getsock_cap(td->td_proc->p_fd, s,
1501             cap_rights_init(&rights, CAP_SETSOCKOPT), &fp, NULL);
1502         if (error == 0) {
1503                 so = fp->f_data;
1504                 error = sosetopt(so, &sopt);
1505                 fdrop(fp, td);
1506         }
1507         return(error);
1508 }
1509
1510 /* ARGSUSED */
1511 int
1512 sys_getsockopt(td, uap)
1513         struct thread *td;
1514         struct getsockopt_args /* {
1515                 int     s;
1516                 int     level;
1517                 int     name;
1518                 void * __restrict       val;
1519                 socklen_t * __restrict avalsize;
1520         } */ *uap;
1521 {
1522         socklen_t valsize;
1523         int error;
1524
1525         if (uap->val) {
1526                 error = copyin(uap->avalsize, &valsize, sizeof (valsize));
1527                 if (error != 0)
1528                         return (error);
1529         }
1530
1531         error = kern_getsockopt(td, uap->s, uap->level, uap->name,
1532             uap->val, UIO_USERSPACE, &valsize);
1533
1534         if (error == 0)
1535                 error = copyout(&valsize, uap->avalsize, sizeof (valsize));
1536         return (error);
1537 }
1538
1539 /*
1540  * Kernel version of getsockopt.
1541  * optval can be a userland or userspace. optlen is always a kernel pointer.
1542  */
1543 int
1544 kern_getsockopt(td, s, level, name, val, valseg, valsize)
1545         struct thread *td;
1546         int s;
1547         int level;
1548         int name;
1549         void *val;
1550         enum uio_seg valseg;
1551         socklen_t *valsize;
1552 {
1553         struct socket *so;
1554         struct file *fp;
1555         struct sockopt sopt;
1556         cap_rights_t rights;
1557         int error;
1558
1559         if (val == NULL)
1560                 *valsize = 0;
1561         if ((int)*valsize < 0)
1562                 return (EINVAL);
1563
1564         sopt.sopt_dir = SOPT_GET;
1565         sopt.sopt_level = level;
1566         sopt.sopt_name = name;
1567         sopt.sopt_val = val;
1568         sopt.sopt_valsize = (size_t)*valsize; /* checked non-negative above */
1569         switch (valseg) {
1570         case UIO_USERSPACE:
1571                 sopt.sopt_td = td;
1572                 break;
1573         case UIO_SYSSPACE:
1574                 sopt.sopt_td = NULL;
1575                 break;
1576         default:
1577                 panic("kern_getsockopt called with bad valseg");
1578         }
1579
1580         AUDIT_ARG_FD(s);
1581         error = getsock_cap(td->td_proc->p_fd, s,
1582             cap_rights_init(&rights, CAP_GETSOCKOPT), &fp, NULL);
1583         if (error == 0) {
1584                 so = fp->f_data;
1585                 error = sogetopt(so, &sopt);
1586                 *valsize = sopt.sopt_valsize;
1587                 fdrop(fp, td);
1588         }
1589         return (error);
1590 }
1591
1592 /*
1593  * getsockname1() - Get socket name.
1594  */
1595 /* ARGSUSED */
1596 static int
1597 getsockname1(td, uap, compat)
1598         struct thread *td;
1599         struct getsockname_args /* {
1600                 int     fdes;
1601                 struct sockaddr * __restrict asa;
1602                 socklen_t * __restrict alen;
1603         } */ *uap;
1604         int compat;
1605 {
1606         struct sockaddr *sa;
1607         socklen_t len;
1608         int error;
1609
1610         error = copyin(uap->alen, &len, sizeof(len));
1611         if (error != 0)
1612                 return (error);
1613
1614         error = kern_getsockname(td, uap->fdes, &sa, &len);
1615         if (error != 0)
1616                 return (error);
1617
1618         if (len != 0) {
1619 #ifdef COMPAT_OLDSOCK
1620                 if (compat)
1621                         ((struct osockaddr *)sa)->sa_family = sa->sa_family;
1622 #endif
1623                 error = copyout(sa, uap->asa, (u_int)len);
1624         }
1625         free(sa, M_SONAME);
1626         if (error == 0)
1627                 error = copyout(&len, uap->alen, sizeof(len));
1628         return (error);
1629 }
1630
1631 int
1632 kern_getsockname(struct thread *td, int fd, struct sockaddr **sa,
1633     socklen_t *alen)
1634 {
1635         struct socket *so;
1636         struct file *fp;
1637         cap_rights_t rights;
1638         socklen_t len;
1639         int error;
1640
1641         AUDIT_ARG_FD(fd);
1642         error = getsock_cap(td->td_proc->p_fd, fd,
1643             cap_rights_init(&rights, CAP_GETSOCKNAME), &fp, NULL);
1644         if (error != 0)
1645                 return (error);
1646         so = fp->f_data;
1647         *sa = NULL;
1648         CURVNET_SET(so->so_vnet);
1649         error = (*so->so_proto->pr_usrreqs->pru_sockaddr)(so, sa);
1650         CURVNET_RESTORE();
1651         if (error != 0)
1652                 goto bad;
1653         if (*sa == NULL)
1654                 len = 0;
1655         else
1656                 len = MIN(*alen, (*sa)->sa_len);
1657         *alen = len;
1658 #ifdef KTRACE
1659         if (KTRPOINT(td, KTR_STRUCT))
1660                 ktrsockaddr(*sa);
1661 #endif
1662 bad:
1663         fdrop(fp, td);
1664         if (error != 0 && *sa != NULL) {
1665                 free(*sa, M_SONAME);
1666                 *sa = NULL;
1667         }
1668         return (error);
1669 }
1670
1671 int
1672 sys_getsockname(td, uap)
1673         struct thread *td;
1674         struct getsockname_args *uap;
1675 {
1676
1677         return (getsockname1(td, uap, 0));
1678 }
1679
1680 #ifdef COMPAT_OLDSOCK
1681 int
1682 ogetsockname(td, uap)
1683         struct thread *td;
1684         struct getsockname_args *uap;
1685 {
1686
1687         return (getsockname1(td, uap, 1));
1688 }
1689 #endif /* COMPAT_OLDSOCK */
1690
1691 /*
1692  * getpeername1() - Get name of peer for connected socket.
1693  */
1694 /* ARGSUSED */
1695 static int
1696 getpeername1(td, uap, compat)
1697         struct thread *td;
1698         struct getpeername_args /* {
1699                 int     fdes;
1700                 struct sockaddr * __restrict    asa;
1701                 socklen_t * __restrict  alen;
1702         } */ *uap;
1703         int compat;
1704 {
1705         struct sockaddr *sa;
1706         socklen_t len;
1707         int error;
1708
1709         error = copyin(uap->alen, &len, sizeof (len));
1710         if (error != 0)
1711                 return (error);
1712
1713         error = kern_getpeername(td, uap->fdes, &sa, &len);
1714         if (error != 0)
1715                 return (error);
1716
1717         if (len != 0) {
1718 #ifdef COMPAT_OLDSOCK
1719                 if (compat)
1720                         ((struct osockaddr *)sa)->sa_family = sa->sa_family;
1721 #endif
1722                 error = copyout(sa, uap->asa, (u_int)len);
1723         }
1724         free(sa, M_SONAME);
1725         if (error == 0)
1726                 error = copyout(&len, uap->alen, sizeof(len));
1727         return (error);
1728 }
1729
1730 int
1731 kern_getpeername(struct thread *td, int fd, struct sockaddr **sa,
1732     socklen_t *alen)
1733 {
1734         struct socket *so;
1735         struct file *fp;
1736         cap_rights_t rights;
1737         socklen_t len;
1738         int error;
1739
1740         AUDIT_ARG_FD(fd);
1741         error = getsock_cap(td->td_proc->p_fd, fd,
1742             cap_rights_init(&rights, CAP_GETPEERNAME), &fp, NULL);
1743         if (error != 0)
1744                 return (error);
1745         so = fp->f_data;
1746         if ((so->so_state & (SS_ISCONNECTED|SS_ISCONFIRMING)) == 0) {
1747                 error = ENOTCONN;
1748                 goto done;
1749         }
1750         *sa = NULL;
1751         CURVNET_SET(so->so_vnet);
1752         error = (*so->so_proto->pr_usrreqs->pru_peeraddr)(so, sa);
1753         CURVNET_RESTORE();
1754         if (error != 0)
1755                 goto bad;
1756         if (*sa == NULL)
1757                 len = 0;
1758         else
1759                 len = MIN(*alen, (*sa)->sa_len);
1760         *alen = len;
1761 #ifdef KTRACE
1762         if (KTRPOINT(td, KTR_STRUCT))
1763                 ktrsockaddr(*sa);
1764 #endif
1765 bad:
1766         if (error != 0 && *sa != NULL) {
1767                 free(*sa, M_SONAME);
1768                 *sa = NULL;
1769         }
1770 done:
1771         fdrop(fp, td);
1772         return (error);
1773 }
1774
1775 int
1776 sys_getpeername(td, uap)
1777         struct thread *td;
1778         struct getpeername_args *uap;
1779 {
1780
1781         return (getpeername1(td, uap, 0));
1782 }
1783
1784 #ifdef COMPAT_OLDSOCK
1785 int
1786 ogetpeername(td, uap)
1787         struct thread *td;
1788         struct ogetpeername_args *uap;
1789 {
1790
1791         /* XXX uap should have type `getpeername_args *' to begin with. */
1792         return (getpeername1(td, (struct getpeername_args *)uap, 1));
1793 }
1794 #endif /* COMPAT_OLDSOCK */
1795
1796 int
1797 sockargs(mp, buf, buflen, type)
1798         struct mbuf **mp;
1799         caddr_t buf;
1800         int buflen, type;
1801 {
1802         struct sockaddr *sa;
1803         struct mbuf *m;
1804         int error;
1805
1806         if (buflen > MLEN) {
1807 #ifdef COMPAT_OLDSOCK
1808                 if (type == MT_SONAME && buflen <= 112)
1809                         buflen = MLEN;          /* unix domain compat. hack */
1810                 else
1811 #endif
1812                         if (buflen > MCLBYTES)
1813                                 return (EINVAL);
1814         }
1815         m = m_get2(buflen, M_WAITOK, type, 0);
1816         m->m_len = buflen;
1817         error = copyin(buf, mtod(m, caddr_t), (u_int)buflen);
1818         if (error != 0)
1819                 (void) m_free(m);
1820         else {
1821                 *mp = m;
1822                 if (type == MT_SONAME) {
1823                         sa = mtod(m, struct sockaddr *);
1824
1825 #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
1826                         if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
1827                                 sa->sa_family = sa->sa_len;
1828 #endif
1829                         sa->sa_len = buflen;
1830                 }
1831         }
1832         return (error);
1833 }
1834
1835 int
1836 getsockaddr(namp, uaddr, len)
1837         struct sockaddr **namp;
1838         caddr_t uaddr;
1839         size_t len;
1840 {
1841         struct sockaddr *sa;
1842         int error;
1843
1844         if (len > SOCK_MAXADDRLEN)
1845                 return (ENAMETOOLONG);
1846         if (len < offsetof(struct sockaddr, sa_data[0]))
1847                 return (EINVAL);
1848         sa = malloc(len, M_SONAME, M_WAITOK);
1849         error = copyin(uaddr, sa, len);
1850         if (error != 0) {
1851                 free(sa, M_SONAME);
1852         } else {
1853 #if defined(COMPAT_OLDSOCK) && BYTE_ORDER != BIG_ENDIAN
1854                 if (sa->sa_family == 0 && sa->sa_len < AF_MAX)
1855                         sa->sa_family = sa->sa_len;
1856 #endif
1857                 sa->sa_len = len;
1858                 *namp = sa;
1859         }
1860         return (error);
1861 }
1862
1863 /*
1864  * Detach mapped page and release resources back to the system.
1865  */
1866 int
1867 sf_buf_mext(struct mbuf *mb, void *addr, void *args)
1868 {
1869         vm_page_t m;
1870         struct sendfile_sync *sfs;
1871
1872         m = sf_buf_page(args);
1873         sf_buf_free(args);
1874         vm_page_lock(m);
1875         vm_page_unwire(m, 0);
1876         /*
1877          * Check for the object going away on us. This can
1878          * happen since we don't hold a reference to it.
1879          * If so, we're responsible for freeing the page.
1880          */
1881         if (m->wire_count == 0 && m->object == NULL)
1882                 vm_page_free(m);
1883         vm_page_unlock(m);
1884         if (addr != NULL) {
1885                 sfs = addr;
1886                 sf_sync_deref(sfs);
1887         }
1888         return (EXT_FREE_OK);
1889 }
1890
1891 void
1892 sf_sync_deref(struct sendfile_sync *sfs)
1893 {
1894
1895         if (sfs == NULL)
1896                 return;
1897
1898         mtx_lock(&sfs->mtx);
1899         KASSERT(sfs->count> 0, ("Sendfile sync botchup count == 0"));
1900         if (--sfs->count == 0)
1901                 cv_signal(&sfs->cv);
1902         mtx_unlock(&sfs->mtx);
1903 }
1904
1905 /*
1906  * Allocate a sendfile_sync state structure.
1907  *
1908  * For now this only knows about the "sleep" sync, but later it will
1909  * grow various other personalities.
1910  */
1911 struct sendfile_sync *
1912 sf_sync_alloc(uint32_t flags)
1913 {
1914         struct sendfile_sync *sfs;
1915
1916         sfs = uma_zalloc(zone_sfsync, M_WAITOK | M_ZERO);
1917         mtx_init(&sfs->mtx, "sendfile", NULL, MTX_DEF);
1918         cv_init(&sfs->cv, "sendfile");
1919         sfs->flags = flags;
1920
1921         return (sfs);
1922 }
1923
1924 /*
1925  * Take a reference to a sfsync instance.
1926  *
1927  * This has to map 1:1 to free calls coming in via sf_buf_mext(),
1928  * so typically this will be referenced once for each mbuf allocated.
1929  */
1930 void
1931 sf_sync_ref(struct sendfile_sync *sfs)
1932 {
1933
1934         if (sfs == NULL)
1935                 return;
1936
1937         mtx_lock(&sfs->mtx);
1938         sfs->count++;
1939         mtx_unlock(&sfs->mtx);
1940 }
1941
1942 void
1943 sf_sync_syscall_wait(struct sendfile_sync *sfs)
1944 {
1945
1946         if (sfs == NULL)
1947                 return;
1948
1949         mtx_lock(&sfs->mtx);
1950         if (sfs->count != 0)
1951                 cv_wait(&sfs->cv, &sfs->mtx);
1952         KASSERT(sfs->count == 0, ("sendfile sync still busy"));
1953         mtx_unlock(&sfs->mtx);
1954 }
1955
1956 void
1957 sf_sync_free(struct sendfile_sync *sfs)
1958 {
1959
1960         if (sfs == NULL)
1961                 return;
1962
1963         /*
1964          * XXX we should ensure that nothing else has this
1965          * locked before freeing.
1966          */
1967         mtx_lock(&sfs->mtx);
1968         KASSERT(sfs->count == 0, ("sendfile sync still busy"));
1969         cv_destroy(&sfs->cv);
1970         mtx_destroy(&sfs->mtx);
1971         uma_zfree(zone_sfsync, sfs);
1972 }
1973
1974 /*
1975  * sendfile(2)
1976  *
1977  * int sendfile(int fd, int s, off_t offset, size_t nbytes,
1978  *       struct sf_hdtr *hdtr, off_t *sbytes, int flags)
1979  *
1980  * Send a file specified by 'fd' and starting at 'offset' to a socket
1981  * specified by 's'. Send only 'nbytes' of the file or until EOF if nbytes ==
1982  * 0.  Optionally add a header and/or trailer to the socket output.  If
1983  * specified, write the total number of bytes sent into *sbytes.
1984  */
1985 int
1986 sys_sendfile(struct thread *td, struct sendfile_args *uap)
1987 {
1988
1989         return (do_sendfile(td, uap, 0));
1990 }
1991
1992 int
1993 _do_sendfile(struct thread *td, int src_fd, int sock_fd, int flags,
1994     int compat, off_t offset, size_t nbytes, off_t *sbytes,
1995     struct uio *hdr_uio, struct uio *trl_uio)
1996 {
1997         cap_rights_t rights;
1998         struct sendfile_sync *sfs = NULL;
1999         struct file *fp;
2000         int error;
2001
2002         AUDIT_ARG_FD(src_fd);
2003
2004         /*
2005          * sendfile(2) can start at any offset within a file so we require
2006          * CAP_READ+CAP_SEEK = CAP_PREAD.
2007          */
2008         if ((error = fget_read(td, src_fd,
2009             cap_rights_init(&rights, CAP_PREAD), &fp)) != 0) {
2010                 goto out;
2011         }
2012
2013         /*
2014          * If we need to wait for completion, initialise the sfsync
2015          * state here.
2016          */
2017         if (flags & SF_SYNC)
2018                 sfs = sf_sync_alloc(flags & SF_SYNC);
2019
2020         error = fo_sendfile(fp, sock_fd, hdr_uio, trl_uio, offset,
2021             nbytes, sbytes, flags, compat ? SFK_COMPAT : 0, sfs, td);
2022
2023         /*
2024          * If appropriate, do the wait and free here.
2025          */
2026         if (sfs != NULL) {
2027                 sf_sync_syscall_wait(sfs);
2028                 sf_sync_free(sfs);
2029         }
2030
2031         /*
2032          * XXX Should we wait until the send has completed before freeing the source
2033          * file handle? It's the previous behaviour, sure, but is it required?
2034          * We've wired down the page references after all.
2035          */
2036         fdrop(fp, td);
2037
2038 out:
2039         return (error);
2040 }
2041
2042 static int
2043 do_sendfile(struct thread *td, struct sendfile_args *uap, int compat)
2044 {
2045         struct sf_hdtr hdtr;
2046         struct uio *hdr_uio, *trl_uio;
2047         int error;
2048         off_t sbytes;
2049
2050         /*
2051          * File offset must be positive.  If it goes beyond EOF
2052          * we send only the header/trailer and no payload data.
2053          */
2054         if (uap->offset < 0)
2055                 return (EINVAL);
2056
2057         hdr_uio = trl_uio = NULL;
2058
2059         if (uap->hdtr != NULL) {
2060                 error = copyin(uap->hdtr, &hdtr, sizeof(hdtr));
2061                 if (error != 0)
2062                         goto out;
2063                 if (hdtr.headers != NULL) {
2064                         error = copyinuio(hdtr.headers, hdtr.hdr_cnt, &hdr_uio);
2065                         if (error != 0)
2066                                 goto out;
2067                 }
2068                 if (hdtr.trailers != NULL) {
2069                         error = copyinuio(hdtr.trailers, hdtr.trl_cnt, &trl_uio);
2070                         if (error != 0)
2071                                 goto out;
2072                 }
2073         }
2074
2075         error = _do_sendfile(td, uap->fd, uap->s, uap->flags, compat,
2076             uap->offset, uap->nbytes, &sbytes, hdr_uio, trl_uio);
2077
2078         if (uap->sbytes != NULL) {
2079                 copyout(&sbytes, uap->sbytes, sizeof(off_t));
2080         }
2081 out:
2082         free(hdr_uio, M_IOV);
2083         free(trl_uio, M_IOV);
2084         return (error);
2085 }
2086
2087 #ifdef COMPAT_FREEBSD4
2088 int
2089 freebsd4_sendfile(struct thread *td, struct freebsd4_sendfile_args *uap)
2090 {
2091         struct sendfile_args args;
2092
2093         args.fd = uap->fd;
2094         args.s = uap->s;
2095         args.offset = uap->offset;
2096         args.nbytes = uap->nbytes;
2097         args.hdtr = uap->hdtr;
2098         args.sbytes = uap->sbytes;
2099         args.flags = uap->flags;
2100
2101         return (do_sendfile(td, &args, 1));
2102 }
2103 #endif /* COMPAT_FREEBSD4 */
2104
2105 static int
2106 sendfile_readpage(vm_object_t obj, struct vnode *vp, int nd,
2107     off_t off, int xfsize, int bsize, struct thread *td, vm_page_t *res)
2108 {
2109         vm_page_t m;
2110         vm_pindex_t pindex;
2111         ssize_t resid;
2112         int error, readahead, rv;
2113
2114         pindex = OFF_TO_IDX(off);
2115         VM_OBJECT_WLOCK(obj);
2116         m = vm_page_grab(obj, pindex, (vp != NULL ? VM_ALLOC_NOBUSY |
2117             VM_ALLOC_IGN_SBUSY : 0) | VM_ALLOC_WIRED | VM_ALLOC_NORMAL);
2118
2119         /*
2120          * Check if page is valid for what we need, otherwise initiate I/O.
2121          *
2122          * The non-zero nd argument prevents disk I/O, instead we
2123          * return the caller what he specified in nd.  In particular,
2124          * if we already turned some pages into mbufs, nd == EAGAIN
2125          * and the main function send them the pages before we come
2126          * here again and block.
2127          */
2128         if (m->valid != 0 && vm_page_is_valid(m, off & PAGE_MASK, xfsize)) {
2129                 if (vp == NULL)
2130                         vm_page_xunbusy(m);
2131                 VM_OBJECT_WUNLOCK(obj);
2132                 *res = m;
2133                 return (0);
2134         } else if (nd != 0) {
2135                 if (vp == NULL)
2136                         vm_page_xunbusy(m);
2137                 error = nd;
2138                 goto free_page;
2139         }
2140
2141         /*
2142          * Get the page from backing store.
2143          */
2144         error = 0;
2145         if (vp != NULL) {
2146                 VM_OBJECT_WUNLOCK(obj);
2147                 readahead = sfreadahead * MAXBSIZE;
2148
2149                 /*
2150                  * Use vn_rdwr() instead of the pager interface for
2151                  * the vnode, to allow the read-ahead.
2152                  *
2153                  * XXXMAC: Because we don't have fp->f_cred here, we
2154                  * pass in NOCRED.  This is probably wrong, but is
2155                  * consistent with our original implementation.
2156                  */
2157                 error = vn_rdwr(UIO_READ, vp, NULL, readahead, trunc_page(off),
2158                     UIO_NOCOPY, IO_NODELOCKED | IO_VMIO | ((readahead /
2159                     bsize) << IO_SEQSHIFT), td->td_ucred, NOCRED, &resid, td);
2160                 SFSTAT_INC(sf_iocnt);
2161                 VM_OBJECT_WLOCK(obj);
2162         } else {
2163                 if (vm_pager_has_page(obj, pindex, NULL, NULL)) {
2164                         rv = vm_pager_get_pages(obj, &m, 1, 0);
2165                         SFSTAT_INC(sf_iocnt);
2166                         m = vm_page_lookup(obj, pindex);
2167                         if (m == NULL)
2168                                 error = EIO;
2169                         else if (rv != VM_PAGER_OK) {
2170                                 vm_page_lock(m);
2171                                 vm_page_free(m);
2172                                 vm_page_unlock(m);
2173                                 m = NULL;
2174                                 error = EIO;
2175                         }
2176                 } else {
2177                         pmap_zero_page(m);
2178                         m->valid = VM_PAGE_BITS_ALL;
2179                         m->dirty = 0;
2180                 }
2181                 if (m != NULL)
2182                         vm_page_xunbusy(m);
2183         }
2184         if (error == 0) {
2185                 *res = m;
2186         } else if (m != NULL) {
2187 free_page:
2188                 vm_page_lock(m);
2189                 vm_page_unwire(m, 0);
2190
2191                 /*
2192                  * See if anyone else might know about this page.  If
2193                  * not and it is not valid, then free it.
2194                  */
2195                 if (m->wire_count == 0 && m->valid == 0 && !vm_page_busied(m))
2196                         vm_page_free(m);
2197                 vm_page_unlock(m);
2198         }
2199         KASSERT(error != 0 || (m->wire_count > 0 &&
2200             vm_page_is_valid(m, off & PAGE_MASK, xfsize)),
2201             ("wrong page state m %p off %#jx xfsize %d", m, (uintmax_t)off,
2202             xfsize));
2203         VM_OBJECT_WUNLOCK(obj);
2204         return (error);
2205 }
2206
2207 static int
2208 sendfile_getobj(struct thread *td, struct file *fp, vm_object_t *obj_res,
2209     struct vnode **vp_res, struct shmfd **shmfd_res, off_t *obj_size,
2210     int *bsize)
2211 {
2212         struct vattr va;
2213         vm_object_t obj;
2214         struct vnode *vp;
2215         struct shmfd *shmfd;
2216         int error;
2217
2218         vp = *vp_res = NULL;
2219         obj = NULL;
2220         shmfd = *shmfd_res = NULL;
2221         *bsize = 0;
2222
2223         /*
2224          * The file descriptor must be a regular file and have a
2225          * backing VM object.
2226          */
2227         if (fp->f_type == DTYPE_VNODE) {
2228                 vp = fp->f_vnode;
2229                 vn_lock(vp, LK_SHARED | LK_RETRY);
2230                 if (vp->v_type != VREG) {
2231                         error = EINVAL;
2232                         goto out;
2233                 }
2234                 *bsize = vp->v_mount->mnt_stat.f_iosize;
2235                 error = VOP_GETATTR(vp, &va, td->td_ucred);
2236                 if (error != 0)
2237                         goto out;
2238                 *obj_size = va.va_size;
2239                 obj = vp->v_object;
2240                 if (obj == NULL) {
2241                         error = EINVAL;
2242                         goto out;
2243                 }
2244         } else if (fp->f_type == DTYPE_SHM) {
2245                 shmfd = fp->f_data;
2246                 obj = shmfd->shm_object;
2247                 *obj_size = shmfd->shm_size;
2248         } else {
2249                 error = EINVAL;
2250                 goto out;
2251         }
2252
2253         VM_OBJECT_WLOCK(obj);
2254         if ((obj->flags & OBJ_DEAD) != 0) {
2255                 VM_OBJECT_WUNLOCK(obj);
2256                 error = EBADF;
2257                 goto out;
2258         }
2259
2260         /*
2261          * Temporarily increase the backing VM object's reference
2262          * count so that a forced reclamation of its vnode does not
2263          * immediately destroy it.
2264          */
2265         vm_object_reference_locked(obj);
2266         VM_OBJECT_WUNLOCK(obj);
2267         *obj_res = obj;
2268         *vp_res = vp;
2269         *shmfd_res = shmfd;
2270
2271 out:
2272         if (vp != NULL)
2273                 VOP_UNLOCK(vp, 0);
2274         return (error);
2275 }
2276
2277 static int
2278 kern_sendfile_getsock(struct thread *td, int s, struct file **sock_fp,
2279     struct socket **so)
2280 {
2281         cap_rights_t rights;
2282         int error;
2283
2284         *sock_fp = NULL;
2285         *so = NULL;
2286
2287         /*
2288          * The socket must be a stream socket and connected.
2289          */
2290         error = getsock_cap(td->td_proc->p_fd, s, cap_rights_init(&rights,
2291             CAP_SEND), sock_fp, NULL);
2292         if (error != 0)
2293                 return (error);
2294         *so = (*sock_fp)->f_data;
2295         if ((*so)->so_type != SOCK_STREAM)
2296                 return (EINVAL);
2297         if (((*so)->so_state & SS_ISCONNECTED) == 0)
2298                 return (ENOTCONN);
2299         return (0);
2300 }
2301
2302 int
2303 vn_sendfile(struct file *fp, int sockfd, struct uio *hdr_uio,
2304     struct uio *trl_uio, off_t offset, size_t nbytes, off_t *sent, int flags,
2305     int kflags, struct sendfile_sync *sfs, struct thread *td)
2306 {
2307         struct file *sock_fp;
2308         struct vnode *vp;
2309         struct vm_object *obj;
2310         struct socket *so;
2311         struct mbuf *m;
2312         struct sf_buf *sf;
2313         struct vm_page *pg;
2314         struct shmfd *shmfd;
2315         struct vattr va;
2316         off_t off, xfsize, fsbytes, sbytes, rem, obj_size;
2317         int error, bsize, nd, hdrlen, mnw;
2318
2319         pg = NULL;
2320         obj = NULL;
2321         so = NULL;
2322         m = NULL;
2323         fsbytes = sbytes = 0;
2324         hdrlen = mnw = 0;
2325         rem = nbytes;
2326         obj_size = 0;
2327
2328         error = sendfile_getobj(td, fp, &obj, &vp, &shmfd, &obj_size, &bsize);
2329         if (error != 0)
2330                 return (error);
2331         if (rem == 0)
2332                 rem = obj_size;
2333
2334         error = kern_sendfile_getsock(td, sockfd, &sock_fp, &so);
2335         if (error != 0)
2336                 goto out;
2337
2338         /*
2339          * Do not wait on memory allocations but return ENOMEM for
2340          * caller to retry later.
2341          * XXX: Experimental.
2342          */
2343         if (flags & SF_MNOWAIT)
2344                 mnw = 1;
2345
2346 #ifdef MAC
2347         error = mac_socket_check_send(td->td_ucred, so);
2348         if (error != 0)
2349                 goto out;
2350 #endif
2351
2352         /* If headers are specified copy them into mbufs. */
2353         if (hdr_uio != NULL) {
2354                 hdr_uio->uio_td = td;
2355                 hdr_uio->uio_rw = UIO_WRITE;
2356                 if (hdr_uio->uio_resid > 0) {
2357                         /*
2358                          * In FBSD < 5.0 the nbytes to send also included
2359                          * the header.  If compat is specified subtract the
2360                          * header size from nbytes.
2361                          */
2362                         if (kflags & SFK_COMPAT) {
2363                                 if (nbytes > hdr_uio->uio_resid)
2364                                         nbytes -= hdr_uio->uio_resid;
2365                                 else
2366                                         nbytes = 0;
2367                         }
2368                         m = m_uiotombuf(hdr_uio, (mnw ? M_NOWAIT : M_WAITOK),
2369                             0, 0, 0);
2370                         if (m == NULL) {
2371                                 error = mnw ? EAGAIN : ENOBUFS;
2372                                 goto out;
2373                         }
2374                         hdrlen = m_length(m, NULL);
2375                 }
2376         }
2377
2378         /*
2379          * Protect against multiple writers to the socket.
2380          *
2381          * XXXRW: Historically this has assumed non-interruptibility, so now
2382          * we implement that, but possibly shouldn't.
2383          */
2384         (void)sblock(&so->so_snd, SBL_WAIT | SBL_NOINTR);
2385
2386         /*
2387          * Loop through the pages of the file, starting with the requested
2388          * offset. Get a file page (do I/O if necessary), map the file page
2389          * into an sf_buf, attach an mbuf header to the sf_buf, and queue
2390          * it on the socket.
2391          * This is done in two loops.  The inner loop turns as many pages
2392          * as it can, up to available socket buffer space, without blocking
2393          * into mbufs to have it bulk delivered into the socket send buffer.
2394          * The outer loop checks the state and available space of the socket
2395          * and takes care of the overall progress.
2396          */
2397         for (off = offset; ; ) {
2398                 struct mbuf *mtail;
2399                 int loopbytes;
2400                 int space;
2401                 int done;
2402
2403                 if ((nbytes != 0 && nbytes == fsbytes) ||
2404                     (nbytes == 0 && obj_size == fsbytes))
2405                         break;
2406
2407                 mtail = NULL;
2408                 loopbytes = 0;
2409                 space = 0;
2410                 done = 0;
2411
2412                 /*
2413                  * Check the socket state for ongoing connection,
2414                  * no errors and space in socket buffer.
2415                  * If space is low allow for the remainder of the
2416                  * file to be processed if it fits the socket buffer.
2417                  * Otherwise block in waiting for sufficient space
2418                  * to proceed, or if the socket is nonblocking, return
2419                  * to userland with EAGAIN while reporting how far
2420                  * we've come.
2421                  * We wait until the socket buffer has significant free
2422                  * space to do bulk sends.  This makes good use of file
2423                  * system read ahead and allows packet segmentation
2424                  * offloading hardware to take over lots of work.  If
2425                  * we were not careful here we would send off only one
2426                  * sfbuf at a time.
2427                  */
2428                 SOCKBUF_LOCK(&so->so_snd);
2429                 if (so->so_snd.sb_lowat < so->so_snd.sb_hiwat / 2)
2430                         so->so_snd.sb_lowat = so->so_snd.sb_hiwat / 2;
2431 retry_space:
2432                 if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2433                         error = EPIPE;
2434                         SOCKBUF_UNLOCK(&so->so_snd);
2435                         goto done;
2436                 } else if (so->so_error) {
2437                         error = so->so_error;
2438                         so->so_error = 0;
2439                         SOCKBUF_UNLOCK(&so->so_snd);
2440                         goto done;
2441                 }
2442                 space = sbspace(&so->so_snd);
2443                 if (space < rem &&
2444                     (space <= 0 ||
2445                      space < so->so_snd.sb_lowat)) {
2446                         if (so->so_state & SS_NBIO) {
2447                                 SOCKBUF_UNLOCK(&so->so_snd);
2448                                 error = EAGAIN;
2449                                 goto done;
2450                         }
2451                         /*
2452                          * sbwait drops the lock while sleeping.
2453                          * When we loop back to retry_space the
2454                          * state may have changed and we retest
2455                          * for it.
2456                          */
2457                         error = sbwait(&so->so_snd);
2458                         /*
2459                          * An error from sbwait usually indicates that we've
2460                          * been interrupted by a signal. If we've sent anything
2461                          * then return bytes sent, otherwise return the error.
2462                          */
2463                         if (error != 0) {
2464                                 SOCKBUF_UNLOCK(&so->so_snd);
2465                                 goto done;
2466                         }
2467                         goto retry_space;
2468                 }
2469                 SOCKBUF_UNLOCK(&so->so_snd);
2470
2471                 /*
2472                  * Reduce space in the socket buffer by the size of
2473                  * the header mbuf chain.
2474                  * hdrlen is set to 0 after the first loop.
2475                  */
2476                 space -= hdrlen;
2477
2478                 if (vp != NULL) {
2479                         error = vn_lock(vp, LK_SHARED);
2480                         if (error != 0)
2481                                 goto done;
2482                         error = VOP_GETATTR(vp, &va, td->td_ucred);
2483                         if (error != 0 || off >= va.va_size) {
2484                                 VOP_UNLOCK(vp, 0);
2485                                 goto done;
2486                         }
2487                         obj_size = va.va_size;
2488                 }
2489
2490                 /*
2491                  * Loop and construct maximum sized mbuf chain to be bulk
2492                  * dumped into socket buffer.
2493                  */
2494                 while (space > loopbytes) {
2495                         vm_offset_t pgoff;
2496                         struct mbuf *m0;
2497
2498                         /*
2499                          * Calculate the amount to transfer.
2500                          * Not to exceed a page, the EOF,
2501                          * or the passed in nbytes.
2502                          */
2503                         pgoff = (vm_offset_t)(off & PAGE_MASK);
2504                         rem = obj_size - offset;
2505                         if (nbytes != 0)
2506                                 rem = omin(rem, nbytes);
2507                         rem -= fsbytes + loopbytes;
2508                         xfsize = omin(PAGE_SIZE - pgoff, rem);
2509                         xfsize = omin(space - loopbytes, xfsize);
2510                         if (xfsize <= 0) {
2511                                 done = 1;               /* all data sent */
2512                                 break;
2513                         }
2514
2515                         /*
2516                          * Attempt to look up the page.  Allocate
2517                          * if not found or wait and loop if busy.
2518                          */
2519                         if (m != NULL)
2520                                 nd = EAGAIN; /* send what we already got */
2521                         else if ((flags & SF_NODISKIO) != 0)
2522                                 nd = EBUSY;
2523                         else
2524                                 nd = 0;
2525                         error = sendfile_readpage(obj, vp, nd, off,
2526                             xfsize, bsize, td, &pg);
2527                         if (error != 0) {
2528                                 if (error == EAGAIN)
2529                                         error = 0;      /* not a real error */
2530                                 break;
2531                         }
2532
2533                         /*
2534                          * Get a sendfile buf.  When allocating the
2535                          * first buffer for mbuf chain, we usually
2536                          * wait as long as necessary, but this wait
2537                          * can be interrupted.  For consequent
2538                          * buffers, do not sleep, since several
2539                          * threads might exhaust the buffers and then
2540                          * deadlock.
2541                          */
2542                         sf = sf_buf_alloc(pg, (mnw || m != NULL) ? SFB_NOWAIT :
2543                             SFB_CATCH);
2544                         if (sf == NULL) {
2545                                 SFSTAT_INC(sf_allocfail);
2546                                 vm_page_lock(pg);
2547                                 vm_page_unwire(pg, 0);
2548                                 KASSERT(pg->object != NULL,
2549                                     ("%s: object disappeared", __func__));
2550                                 vm_page_unlock(pg);
2551                                 if (m == NULL)
2552                                         error = (mnw ? EAGAIN : EINTR);
2553                                 break;
2554                         }
2555
2556                         /*
2557                          * Get an mbuf and set it up as having
2558                          * external storage.
2559                          */
2560                         m0 = m_get((mnw ? M_NOWAIT : M_WAITOK), MT_DATA);
2561                         if (m0 == NULL) {
2562                                 error = (mnw ? EAGAIN : ENOBUFS);
2563                                 (void)sf_buf_mext(NULL, NULL, sf);
2564                                 break;
2565                         }
2566                         if (m_extadd(m0, (caddr_t )sf_buf_kva(sf), PAGE_SIZE,
2567                             sf_buf_mext, sfs, sf, M_RDONLY, EXT_SFBUF,
2568                             (mnw ? M_NOWAIT : M_WAITOK)) != 0) {
2569                                 error = (mnw ? EAGAIN : ENOBUFS);
2570                                 (void)sf_buf_mext(NULL, NULL, sf);
2571                                 m_freem(m0);
2572                                 break;
2573                         }
2574                         m0->m_data = (char *)sf_buf_kva(sf) + pgoff;
2575                         m0->m_len = xfsize;
2576
2577                         /* Append to mbuf chain. */
2578                         if (mtail != NULL)
2579                                 mtail->m_next = m0;
2580                         else if (m != NULL)
2581                                 m_last(m)->m_next = m0;
2582                         else
2583                                 m = m0;
2584                         mtail = m0;
2585
2586                         /* Keep track of bits processed. */
2587                         loopbytes += xfsize;
2588                         off += xfsize;
2589
2590                         /*
2591                          * XXX eventually this should be a sfsync
2592                          * method call!
2593                          */
2594                         if (sfs != NULL)
2595                                 sf_sync_ref(sfs);
2596                 }
2597
2598                 if (vp != NULL)
2599                         VOP_UNLOCK(vp, 0);
2600
2601                 /* Add the buffer chain to the socket buffer. */
2602                 if (m != NULL) {
2603                         int mlen, err;
2604
2605                         mlen = m_length(m, NULL);
2606                         SOCKBUF_LOCK(&so->so_snd);
2607                         if (so->so_snd.sb_state & SBS_CANTSENDMORE) {
2608                                 error = EPIPE;
2609                                 SOCKBUF_UNLOCK(&so->so_snd);
2610                                 goto done;
2611                         }
2612                         SOCKBUF_UNLOCK(&so->so_snd);
2613                         CURVNET_SET(so->so_vnet);
2614                         /* Avoid error aliasing. */
2615                         err = (*so->so_proto->pr_usrreqs->pru_send)
2616                                     (so, 0, m, NULL, NULL, td);
2617                         CURVNET_RESTORE();
2618                         if (err == 0) {
2619                                 /*
2620                                  * We need two counters to get the
2621                                  * file offset and nbytes to send
2622                                  * right:
2623                                  * - sbytes contains the total amount
2624                                  *   of bytes sent, including headers.
2625                                  * - fsbytes contains the total amount
2626                                  *   of bytes sent from the file.
2627                                  */
2628                                 sbytes += mlen;
2629                                 fsbytes += mlen;
2630                                 if (hdrlen) {
2631                                         fsbytes -= hdrlen;
2632                                         hdrlen = 0;
2633                                 }
2634                         } else if (error == 0)
2635                                 error = err;
2636                         m = NULL;       /* pru_send always consumes */
2637                 }
2638
2639                 /* Quit outer loop on error or when we're done. */
2640                 if (done)
2641                         break;
2642                 if (error != 0)
2643                         goto done;
2644         }
2645
2646         /*
2647          * Send trailers. Wimp out and use writev(2).
2648          */
2649         if (trl_uio != NULL) {
2650                 sbunlock(&so->so_snd);
2651                 error = kern_writev(td, sockfd, trl_uio);
2652                 if (error == 0)
2653                         sbytes += td->td_retval[0];
2654                 goto out;
2655         }
2656
2657 done:
2658         sbunlock(&so->so_snd);
2659 out:
2660         /*
2661          * If there was no error we have to clear td->td_retval[0]
2662          * because it may have been set by writev.
2663          */
2664         if (error == 0) {
2665                 td->td_retval[0] = 0;
2666         }
2667         if (sent != NULL) {
2668                 (*sent) = sbytes;
2669         }
2670         if (obj != NULL)
2671                 vm_object_deallocate(obj);
2672         if (so)
2673                 fdrop(sock_fp, td);
2674         if (m)
2675                 m_freem(m);
2676
2677         if (error == ERESTART)
2678                 error = EINTR;
2679
2680         return (error);
2681 }
2682
2683 /*
2684  * SCTP syscalls.
2685  * Functionality only compiled in if SCTP is defined in the kernel Makefile,
2686  * otherwise all return EOPNOTSUPP.
2687  * XXX: We should make this loadable one day.
2688  */
2689 int
2690 sys_sctp_peeloff(td, uap)
2691         struct thread *td;
2692         struct sctp_peeloff_args /* {
2693                 int     sd;
2694                 caddr_t name;
2695         } */ *uap;
2696 {
2697 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2698         struct file *nfp = NULL;
2699         struct socket *head, *so;
2700         cap_rights_t rights;
2701         u_int fflag;
2702         int error, fd;
2703
2704         AUDIT_ARG_FD(uap->sd);
2705         error = fgetsock(td, uap->sd, cap_rights_init(&rights, CAP_PEELOFF),
2706             &head, &fflag);
2707         if (error != 0)
2708                 goto done2;
2709         if (head->so_proto->pr_protocol != IPPROTO_SCTP) {
2710                 error = EOPNOTSUPP;
2711                 goto done;
2712         }
2713         error = sctp_can_peel_off(head, (sctp_assoc_t)uap->name);
2714         if (error != 0)
2715                 goto done;
2716         /*
2717          * At this point we know we do have a assoc to pull
2718          * we proceed to get the fd setup. This may block
2719          * but that is ok.
2720          */
2721
2722         error = falloc(td, &nfp, &fd, 0);
2723         if (error != 0)
2724                 goto done;
2725         td->td_retval[0] = fd;
2726
2727         CURVNET_SET(head->so_vnet);
2728         so = sonewconn(head, SS_ISCONNECTED);
2729         if (so == NULL) {
2730                 error = ENOMEM;
2731                 goto noconnection;
2732         }
2733         /*
2734          * Before changing the flags on the socket, we have to bump the
2735          * reference count.  Otherwise, if the protocol calls sofree(),
2736          * the socket will be released due to a zero refcount.
2737          */
2738         SOCK_LOCK(so);
2739         soref(so);                      /* file descriptor reference */
2740         SOCK_UNLOCK(so);
2741
2742         ACCEPT_LOCK();
2743
2744         TAILQ_REMOVE(&head->so_comp, so, so_list);
2745         head->so_qlen--;
2746         so->so_state |= (head->so_state & SS_NBIO);
2747         so->so_state &= ~SS_NOFDREF;
2748         so->so_qstate &= ~SQ_COMP;
2749         so->so_head = NULL;
2750         ACCEPT_UNLOCK();
2751         finit(nfp, fflag, DTYPE_SOCKET, so, &socketops);
2752         error = sctp_do_peeloff(head, so, (sctp_assoc_t)uap->name);
2753         if (error != 0)
2754                 goto noconnection;
2755         if (head->so_sigio != NULL)
2756                 fsetown(fgetown(&head->so_sigio), &so->so_sigio);
2757
2758 noconnection:
2759         /*
2760          * close the new descriptor, assuming someone hasn't ripped it
2761          * out from under us.
2762          */
2763         if (error != 0)
2764                 fdclose(td->td_proc->p_fd, nfp, fd, td);
2765
2766         /*
2767          * Release explicitly held references before returning.
2768          */
2769         CURVNET_RESTORE();
2770 done:
2771         if (nfp != NULL)
2772                 fdrop(nfp, td);
2773         fputsock(head);
2774 done2:
2775         return (error);
2776 #else  /* SCTP */
2777         return (EOPNOTSUPP);
2778 #endif /* SCTP */
2779 }
2780
2781 int
2782 sys_sctp_generic_sendmsg (td, uap)
2783         struct thread *td;
2784         struct sctp_generic_sendmsg_args /* {
2785                 int sd,
2786                 caddr_t msg,
2787                 int mlen,
2788                 caddr_t to,
2789                 __socklen_t tolen,
2790                 struct sctp_sndrcvinfo *sinfo,
2791                 int flags
2792         } */ *uap;
2793 {
2794 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2795         struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
2796         struct socket *so;
2797         struct file *fp = NULL;
2798         struct sockaddr *to = NULL;
2799 #ifdef KTRACE
2800         struct uio *ktruio = NULL;
2801 #endif
2802         struct uio auio;
2803         struct iovec iov[1];
2804         cap_rights_t rights;
2805         int error = 0, len;
2806
2807         if (uap->sinfo != NULL) {
2808                 error = copyin(uap->sinfo, &sinfo, sizeof (sinfo));
2809                 if (error != 0)
2810                         return (error);
2811                 u_sinfo = &sinfo;
2812         }
2813
2814         cap_rights_init(&rights, CAP_SEND);
2815         if (uap->tolen != 0) {
2816                 error = getsockaddr(&to, uap->to, uap->tolen);
2817                 if (error != 0) {
2818                         to = NULL;
2819                         goto sctp_bad2;
2820                 }
2821                 cap_rights_set(&rights, CAP_CONNECT);
2822         }
2823
2824         AUDIT_ARG_FD(uap->sd);
2825         error = getsock_cap(td->td_proc->p_fd, uap->sd, &rights, &fp, NULL);
2826         if (error != 0)
2827                 goto sctp_bad;
2828 #ifdef KTRACE
2829         if (to && (KTRPOINT(td, KTR_STRUCT)))
2830                 ktrsockaddr(to);
2831 #endif
2832
2833         iov[0].iov_base = uap->msg;
2834         iov[0].iov_len = uap->mlen;
2835
2836         so = (struct socket *)fp->f_data;
2837         if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
2838                 error = EOPNOTSUPP;
2839                 goto sctp_bad;
2840         }
2841 #ifdef MAC
2842         error = mac_socket_check_send(td->td_ucred, so);
2843         if (error != 0)
2844                 goto sctp_bad;
2845 #endif /* MAC */
2846
2847         auio.uio_iov =  iov;
2848         auio.uio_iovcnt = 1;
2849         auio.uio_segflg = UIO_USERSPACE;
2850         auio.uio_rw = UIO_WRITE;
2851         auio.uio_td = td;
2852         auio.uio_offset = 0;                    /* XXX */
2853         auio.uio_resid = 0;
2854         len = auio.uio_resid = uap->mlen;
2855         CURVNET_SET(so->so_vnet);
2856         error = sctp_lower_sosend(so, to, &auio, (struct mbuf *)NULL,
2857             (struct mbuf *)NULL, uap->flags, u_sinfo, td);
2858         CURVNET_RESTORE();
2859         if (error != 0) {
2860                 if (auio.uio_resid != len && (error == ERESTART ||
2861                     error == EINTR || error == EWOULDBLOCK))
2862                         error = 0;
2863                 /* Generation of SIGPIPE can be controlled per socket. */
2864                 if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
2865                     !(uap->flags & MSG_NOSIGNAL)) {
2866                         PROC_LOCK(td->td_proc);
2867                         tdsignal(td, SIGPIPE);
2868                         PROC_UNLOCK(td->td_proc);
2869                 }
2870         }
2871         if (error == 0)
2872                 td->td_retval[0] = len - auio.uio_resid;
2873 #ifdef KTRACE
2874         if (ktruio != NULL) {
2875                 ktruio->uio_resid = td->td_retval[0];
2876                 ktrgenio(uap->sd, UIO_WRITE, ktruio, error);
2877         }
2878 #endif /* KTRACE */
2879 sctp_bad:
2880         if (fp != NULL)
2881                 fdrop(fp, td);
2882 sctp_bad2:
2883         free(to, M_SONAME);
2884         return (error);
2885 #else  /* SCTP */
2886         return (EOPNOTSUPP);
2887 #endif /* SCTP */
2888 }
2889
2890 int
2891 sys_sctp_generic_sendmsg_iov(td, uap)
2892         struct thread *td;
2893         struct sctp_generic_sendmsg_iov_args /* {
2894                 int sd,
2895                 struct iovec *iov,
2896                 int iovlen,
2897                 caddr_t to,
2898                 __socklen_t tolen,
2899                 struct sctp_sndrcvinfo *sinfo,
2900                 int flags
2901         } */ *uap;
2902 {
2903 #if (defined(INET) || defined(INET6)) && defined(SCTP)
2904         struct sctp_sndrcvinfo sinfo, *u_sinfo = NULL;
2905         struct socket *so;
2906         struct file *fp = NULL;
2907         struct sockaddr *to = NULL;
2908 #ifdef KTRACE
2909         struct uio *ktruio = NULL;
2910 #endif
2911         struct uio auio;
2912         struct iovec *iov, *tiov;
2913         cap_rights_t rights;
2914         ssize_t len;
2915         int error, i;
2916
2917         if (uap->sinfo != NULL) {
2918                 error = copyin(uap->sinfo, &sinfo, sizeof (sinfo));
2919                 if (error != 0)
2920                         return (error);
2921                 u_sinfo = &sinfo;
2922         }
2923         cap_rights_init(&rights, CAP_SEND);
2924         if (uap->tolen != 0) {
2925                 error = getsockaddr(&to, uap->to, uap->tolen);
2926                 if (error != 0) {
2927                         to = NULL;
2928                         goto sctp_bad2;
2929                 }
2930                 cap_rights_set(&rights, CAP_CONNECT);
2931         }
2932
2933         AUDIT_ARG_FD(uap->sd);
2934         error = getsock_cap(td->td_proc->p_fd, uap->sd, &rights, &fp, NULL);
2935         if (error != 0)
2936                 goto sctp_bad1;
2937
2938 #ifdef COMPAT_FREEBSD32
2939         if (SV_CURPROC_FLAG(SV_ILP32))
2940                 error = freebsd32_copyiniov((struct iovec32 *)uap->iov,
2941                     uap->iovlen, &iov, EMSGSIZE);
2942         else
2943 #endif
2944                 error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
2945         if (error != 0)
2946                 goto sctp_bad1;
2947 #ifdef KTRACE
2948         if (to && (KTRPOINT(td, KTR_STRUCT)))
2949                 ktrsockaddr(to);
2950 #endif
2951
2952         so = (struct socket *)fp->f_data;
2953         if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
2954                 error = EOPNOTSUPP;
2955                 goto sctp_bad;
2956         }
2957 #ifdef MAC
2958         error = mac_socket_check_send(td->td_ucred, so);
2959         if (error != 0)
2960                 goto sctp_bad;
2961 #endif /* MAC */
2962
2963         auio.uio_iov = iov;
2964         auio.uio_iovcnt = uap->iovlen;
2965         auio.uio_segflg = UIO_USERSPACE;
2966         auio.uio_rw = UIO_WRITE;
2967         auio.uio_td = td;
2968         auio.uio_offset = 0;                    /* XXX */
2969         auio.uio_resid = 0;
2970         tiov = iov;
2971         for (i = 0; i <uap->iovlen; i++, tiov++) {
2972                 if ((auio.uio_resid += tiov->iov_len) < 0) {
2973                         error = EINVAL;
2974                         goto sctp_bad;
2975                 }
2976         }
2977         len = auio.uio_resid;
2978         CURVNET_SET(so->so_vnet);
2979         error = sctp_lower_sosend(so, to, &auio,
2980                     (struct mbuf *)NULL, (struct mbuf *)NULL,
2981                     uap->flags, u_sinfo, td);
2982         CURVNET_RESTORE();
2983         if (error != 0) {
2984                 if (auio.uio_resid != len && (error == ERESTART ||
2985                     error == EINTR || error == EWOULDBLOCK))
2986                         error = 0;
2987                 /* Generation of SIGPIPE can be controlled per socket */
2988                 if (error == EPIPE && !(so->so_options & SO_NOSIGPIPE) &&
2989                     !(uap->flags & MSG_NOSIGNAL)) {
2990                         PROC_LOCK(td->td_proc);
2991                         tdsignal(td, SIGPIPE);
2992                         PROC_UNLOCK(td->td_proc);
2993                 }
2994         }
2995         if (error == 0)
2996                 td->td_retval[0] = len - auio.uio_resid;
2997 #ifdef KTRACE
2998         if (ktruio != NULL) {
2999                 ktruio->uio_resid = td->td_retval[0];
3000                 ktrgenio(uap->sd, UIO_WRITE, ktruio, error);
3001         }
3002 #endif /* KTRACE */
3003 sctp_bad:
3004         free(iov, M_IOV);
3005 sctp_bad1:
3006         if (fp != NULL)
3007                 fdrop(fp, td);
3008 sctp_bad2:
3009         free(to, M_SONAME);
3010         return (error);
3011 #else  /* SCTP */
3012         return (EOPNOTSUPP);
3013 #endif /* SCTP */
3014 }
3015
3016 int
3017 sys_sctp_generic_recvmsg(td, uap)
3018         struct thread *td;
3019         struct sctp_generic_recvmsg_args /* {
3020                 int sd,
3021                 struct iovec *iov,
3022                 int iovlen,
3023                 struct sockaddr *from,
3024                 __socklen_t *fromlenaddr,
3025                 struct sctp_sndrcvinfo *sinfo,
3026                 int *msg_flags
3027         } */ *uap;
3028 {
3029 #if (defined(INET) || defined(INET6)) && defined(SCTP)
3030         uint8_t sockbufstore[256];
3031         struct uio auio;
3032         struct iovec *iov, *tiov;
3033         struct sctp_sndrcvinfo sinfo;
3034         struct socket *so;
3035         struct file *fp = NULL;
3036         struct sockaddr *fromsa;
3037         cap_rights_t rights;
3038 #ifdef KTRACE
3039         struct uio *ktruio = NULL;
3040 #endif
3041         ssize_t len;
3042         int error, fromlen, i, msg_flags;
3043
3044         AUDIT_ARG_FD(uap->sd);
3045         error = getsock_cap(td->td_proc->p_fd, uap->sd,
3046             cap_rights_init(&rights, CAP_RECV), &fp, NULL);
3047         if (error != 0)
3048                 return (error);
3049 #ifdef COMPAT_FREEBSD32
3050         if (SV_CURPROC_FLAG(SV_ILP32))
3051                 error = freebsd32_copyiniov((struct iovec32 *)uap->iov,
3052                     uap->iovlen, &iov, EMSGSIZE);
3053         else
3054 #endif
3055                 error = copyiniov(uap->iov, uap->iovlen, &iov, EMSGSIZE);
3056         if (error != 0)
3057                 goto out1;
3058
3059         so = fp->f_data;
3060         if (so->so_proto->pr_protocol != IPPROTO_SCTP) {
3061                 error = EOPNOTSUPP;
3062                 goto out;
3063         }
3064 #ifdef MAC
3065         error = mac_socket_check_receive(td->td_ucred, so);
3066         if (error != 0)
3067                 goto out;
3068 #endif /* MAC */
3069
3070         if (uap->fromlenaddr != NULL) {
3071                 error = copyin(uap->fromlenaddr, &fromlen, sizeof (fromlen));
3072                 if (error != 0)
3073                         goto out;
3074         } else {
3075                 fromlen = 0;
3076         }
3077         if (uap->msg_flags) {
3078                 error = copyin(uap->msg_flags, &msg_flags, sizeof (int));
3079                 if (error != 0)
3080                         goto out;
3081         } else {
3082                 msg_flags = 0;
3083         }
3084         auio.uio_iov = iov;
3085         auio.uio_iovcnt = uap->iovlen;
3086         auio.uio_segflg = UIO_USERSPACE;
3087         auio.uio_rw = UIO_READ;
3088         auio.uio_td = td;
3089         auio.uio_offset = 0;                    /* XXX */
3090         auio.uio_resid = 0;
3091         tiov = iov;
3092         for (i = 0; i <uap->iovlen; i++, tiov++) {
3093                 if ((auio.uio_resid += tiov->iov_len) < 0) {
3094                         error = EINVAL;
3095                         goto out;
3096                 }
3097         }
3098         len = auio.uio_resid;
3099         fromsa = (struct sockaddr *)sockbufstore;
3100
3101 #ifdef KTRACE
3102         if (KTRPOINT(td, KTR_GENIO))
3103                 ktruio = cloneuio(&auio);
3104 #endif /* KTRACE */
3105         memset(&sinfo, 0, sizeof(struct sctp_sndrcvinfo));
3106         CURVNET_SET(so->so_vnet);
3107         error = sctp_sorecvmsg(so, &auio, (struct mbuf **)NULL,
3108                     fromsa, fromlen, &msg_flags,
3109                     (struct sctp_sndrcvinfo *)&sinfo, 1);
3110         CURVNET_RESTORE();
3111         if (error != 0) {
3112                 if (auio.uio_resid != len && (error == ERESTART ||
3113                     error == EINTR || error == EWOULDBLOCK))
3114                         error = 0;
3115         } else {
3116                 if (uap->sinfo)
3117                         error = copyout(&sinfo, uap->sinfo, sizeof (sinfo));
3118         }
3119 #ifdef KTRACE
3120         if (ktruio != NULL) {
3121                 ktruio->uio_resid = len - auio.uio_resid;
3122                 ktrgenio(uap->sd, UIO_READ, ktruio, error);
3123         }
3124 #endif /* KTRACE */
3125         if (error != 0)
3126                 goto out;
3127         td->td_retval[0] = len - auio.uio_resid;
3128
3129         if (fromlen && uap->from) {
3130                 len = fromlen;
3131                 if (len <= 0 || fromsa == 0)
3132                         len = 0;
3133                 else {
3134                         len = MIN(len, fromsa->sa_len);
3135                         error = copyout(fromsa, uap->from, (size_t)len);
3136                         if (error != 0)
3137                                 goto out;
3138                 }
3139                 error = copyout(&len, uap->fromlenaddr, sizeof (socklen_t));
3140                 if (error != 0)
3141                         goto out;
3142         }
3143 #ifdef KTRACE
3144         if (KTRPOINT(td, KTR_STRUCT))
3145                 ktrsockaddr(fromsa);
3146 #endif
3147         if (uap->msg_flags) {
3148                 error = copyout(&msg_flags, uap->msg_flags, sizeof (int));
3149                 if (error != 0)
3150                         goto out;
3151         }
3152 out:
3153         free(iov, M_IOV);
3154 out1:
3155         if (fp != NULL)
3156                 fdrop(fp, td);
3157
3158         return (error);
3159 #else  /* SCTP */
3160         return (EOPNOTSUPP);
3161 #endif /* SCTP */
3162 }