Deleted Added
full compact
uipc_usrreq.c (247602) uipc_usrreq.c (247667)
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1991, 1993
3 * The Regents of the University of California.
4 * Copyright (c) 2004-2009 Robert N. M. Watson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 43 unchanged lines hidden (view full) ---

52 * TODO:
53 * RDM
54 * distinguish datagram size limits from flow control limits in SEQPACKET
55 * rethink name space problems
56 * need a proper out-of-band
57 */
58
59#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1991, 1993
3 * The Regents of the University of California.
4 * Copyright (c) 2004-2009 Robert N. M. Watson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions

--- 43 unchanged lines hidden (view full) ---

52 * TODO:
53 * RDM
54 * distinguish datagram size limits from flow control limits in SEQPACKET
55 * rethink name space problems
56 * need a proper out-of-band
57 */
58
59#include <sys/cdefs.h>
60__FBSDID("$FreeBSD: head/sys/kern/uipc_usrreq.c 247602 2013-03-02 00:53:12Z pjd $");
60__FBSDID("$FreeBSD: head/sys/kern/uipc_usrreq.c 247667 2013-03-02 21:11:30Z pjd $");
61
62#include "opt_ddb.h"
63
64#include <sys/param.h>
61
62#include "opt_ddb.h"
63
64#include <sys/param.h>
65#include <sys/capability.h>
65#include <sys/domain.h>
66#include <sys/fcntl.h>
67#include <sys/malloc.h> /* XXX must be before <sys/file.h> */
68#include <sys/eventhandler.h>
69#include <sys/file.h>
70#include <sys/filedesc.h>
71#include <sys/kernel.h>
72#include <sys/lock.h>

--- 193 unchanged lines hidden (view full) ---

266#define UNP_PCB_LOCK(unp) mtx_lock(&(unp)->unp_mtx)
267#define UNP_PCB_UNLOCK(unp) mtx_unlock(&(unp)->unp_mtx)
268#define UNP_PCB_LOCK_ASSERT(unp) mtx_assert(&(unp)->unp_mtx, MA_OWNED)
269
270static int uipc_connect2(struct socket *, struct socket *);
271static int uipc_ctloutput(struct socket *, struct sockopt *);
272static int unp_connect(struct socket *, struct sockaddr *,
273 struct thread *);
66#include <sys/domain.h>
67#include <sys/fcntl.h>
68#include <sys/malloc.h> /* XXX must be before <sys/file.h> */
69#include <sys/eventhandler.h>
70#include <sys/file.h>
71#include <sys/filedesc.h>
72#include <sys/kernel.h>
73#include <sys/lock.h>

--- 193 unchanged lines hidden (view full) ---

267#define UNP_PCB_LOCK(unp) mtx_lock(&(unp)->unp_mtx)
268#define UNP_PCB_UNLOCK(unp) mtx_unlock(&(unp)->unp_mtx)
269#define UNP_PCB_LOCK_ASSERT(unp) mtx_assert(&(unp)->unp_mtx, MA_OWNED)
270
271static int uipc_connect2(struct socket *, struct socket *);
272static int uipc_ctloutput(struct socket *, struct sockopt *);
273static int unp_connect(struct socket *, struct sockaddr *,
274 struct thread *);
275static int unp_connectat(int, struct socket *, struct sockaddr *,
276 struct thread *);
274static int unp_connect2(struct socket *so, struct socket *so2, int);
275static void unp_disconnect(struct unpcb *unp, struct unpcb *unp2);
276static void unp_dispose(struct mbuf *);
277static void unp_shutdown(struct unpcb *);
278static void unp_drop(struct unpcb *, int);
279static void unp_gc(__unused void *, int);
280static void unp_scan(struct mbuf *, void (*)(struct file *));
281static void unp_discard(struct file *);

--- 163 unchanged lines hidden (view full) ---

445 panic("uipc_attach");
446 }
447 UNP_LIST_UNLOCK();
448
449 return (0);
450}
451
452static int
277static int unp_connect2(struct socket *so, struct socket *so2, int);
278static void unp_disconnect(struct unpcb *unp, struct unpcb *unp2);
279static void unp_dispose(struct mbuf *);
280static void unp_shutdown(struct unpcb *);
281static void unp_drop(struct unpcb *, int);
282static void unp_gc(__unused void *, int);
283static void unp_scan(struct mbuf *, void (*)(struct file *));
284static void unp_discard(struct file *);

--- 163 unchanged lines hidden (view full) ---

448 panic("uipc_attach");
449 }
450 UNP_LIST_UNLOCK();
451
452 return (0);
453}
454
455static int
453uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
456uipc_bindat(int fd, struct socket *so, struct sockaddr *nam, struct thread *td)
454{
455 struct sockaddr_un *soun = (struct sockaddr_un *)nam;
456 struct vattr vattr;
457 int error, namelen;
458 struct nameidata nd;
459 struct unpcb *unp;
460 struct vnode *vp;
461 struct mount *mp;

--- 29 unchanged lines hidden (view full) ---

491 unp->unp_flags |= UNP_BINDING;
492 UNP_PCB_UNLOCK(unp);
493
494 buf = malloc(namelen + 1, M_TEMP, M_WAITOK);
495 bcopy(soun->sun_path, buf, namelen);
496 buf[namelen] = 0;
497
498restart:
457{
458 struct sockaddr_un *soun = (struct sockaddr_un *)nam;
459 struct vattr vattr;
460 int error, namelen;
461 struct nameidata nd;
462 struct unpcb *unp;
463 struct vnode *vp;
464 struct mount *mp;

--- 29 unchanged lines hidden (view full) ---

494 unp->unp_flags |= UNP_BINDING;
495 UNP_PCB_UNLOCK(unp);
496
497 buf = malloc(namelen + 1, M_TEMP, M_WAITOK);
498 bcopy(soun->sun_path, buf, namelen);
499 buf[namelen] = 0;
500
501restart:
499 NDINIT(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME,
500 UIO_SYSSPACE, buf, td);
502 NDINIT_ATRIGHTS(&nd, CREATE, NOFOLLOW | LOCKPARENT | SAVENAME,
503 UIO_SYSSPACE, buf, fd, CAP_BINDAT, td);
501/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
502 error = namei(&nd);
503 if (error)
504 goto error;
505 vp = nd.ni_vp;
506 if (vp != NULL || vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) {
507 NDFREE(&nd, NDF_ONLY_PNBUF);
508 if (nd.ni_dvp == vp)

--- 46 unchanged lines hidden (view full) ---

555 UNP_PCB_LOCK(unp);
556 unp->unp_flags &= ~UNP_BINDING;
557 UNP_PCB_UNLOCK(unp);
558 free(buf, M_TEMP);
559 return (error);
560}
561
562static int
504/* SHOULD BE ABLE TO ADOPT EXISTING AND wakeup() ALA FIFO's */
505 error = namei(&nd);
506 if (error)
507 goto error;
508 vp = nd.ni_vp;
509 if (vp != NULL || vn_start_write(nd.ni_dvp, &mp, V_NOWAIT) != 0) {
510 NDFREE(&nd, NDF_ONLY_PNBUF);
511 if (nd.ni_dvp == vp)

--- 46 unchanged lines hidden (view full) ---

558 UNP_PCB_LOCK(unp);
559 unp->unp_flags &= ~UNP_BINDING;
560 UNP_PCB_UNLOCK(unp);
561 free(buf, M_TEMP);
562 return (error);
563}
564
565static int
566uipc_bind(struct socket *so, struct sockaddr *nam, struct thread *td)
567{
568
569 return (uipc_bindat(AT_FDCWD, so, nam, td));
570}
571
572static int
563uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
564{
565 int error;
566
567 KASSERT(td == curthread, ("uipc_connect: td != curthread"));
568 UNP_LINK_WLOCK();
569 error = unp_connect(so, nam, td);
570 UNP_LINK_WUNLOCK();
571 return (error);
572}
573
573uipc_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
574{
575 int error;
576
577 KASSERT(td == curthread, ("uipc_connect: td != curthread"));
578 UNP_LINK_WLOCK();
579 error = unp_connect(so, nam, td);
580 UNP_LINK_WUNLOCK();
581 return (error);
582}
583
584static int
585uipc_connectat(int fd, struct socket *so, struct sockaddr *nam,
586 struct thread *td)
587{
588 int error;
589
590 KASSERT(td == curthread, ("uipc_connectat: td != curthread"));
591 UNP_LINK_WLOCK();
592 error = unp_connectat(fd, so, nam, td);
593 UNP_LINK_WUNLOCK();
594 return (error);
595}
596
574static void
575uipc_close(struct socket *so)
576{
577 struct unpcb *unp, *unp2;
578
579 unp = sotounpcb(so);
580 KASSERT(unp != NULL, ("uipc_close: unp == NULL"));
581

--- 494 unchanged lines hidden (view full) ---

1076 return (0);
1077}
1078
1079static struct pr_usrreqs uipc_usrreqs_dgram = {
1080 .pru_abort = uipc_abort,
1081 .pru_accept = uipc_accept,
1082 .pru_attach = uipc_attach,
1083 .pru_bind = uipc_bind,
597static void
598uipc_close(struct socket *so)
599{
600 struct unpcb *unp, *unp2;
601
602 unp = sotounpcb(so);
603 KASSERT(unp != NULL, ("uipc_close: unp == NULL"));
604

--- 494 unchanged lines hidden (view full) ---

1099 return (0);
1100}
1101
1102static struct pr_usrreqs uipc_usrreqs_dgram = {
1103 .pru_abort = uipc_abort,
1104 .pru_accept = uipc_accept,
1105 .pru_attach = uipc_attach,
1106 .pru_bind = uipc_bind,
1107 .pru_bindat = uipc_bindat,
1084 .pru_connect = uipc_connect,
1108 .pru_connect = uipc_connect,
1109 .pru_connectat = uipc_connectat,
1085 .pru_connect2 = uipc_connect2,
1086 .pru_detach = uipc_detach,
1087 .pru_disconnect = uipc_disconnect,
1088 .pru_listen = uipc_listen,
1089 .pru_peeraddr = uipc_peeraddr,
1090 .pru_rcvd = uipc_rcvd,
1091 .pru_send = uipc_send,
1092 .pru_sense = uipc_sense,
1093 .pru_shutdown = uipc_shutdown,
1094 .pru_sockaddr = uipc_sockaddr,
1095 .pru_soreceive = soreceive_dgram,
1096 .pru_close = uipc_close,
1097};
1098
1099static struct pr_usrreqs uipc_usrreqs_seqpacket = {
1100 .pru_abort = uipc_abort,
1101 .pru_accept = uipc_accept,
1102 .pru_attach = uipc_attach,
1103 .pru_bind = uipc_bind,
1110 .pru_connect2 = uipc_connect2,
1111 .pru_detach = uipc_detach,
1112 .pru_disconnect = uipc_disconnect,
1113 .pru_listen = uipc_listen,
1114 .pru_peeraddr = uipc_peeraddr,
1115 .pru_rcvd = uipc_rcvd,
1116 .pru_send = uipc_send,
1117 .pru_sense = uipc_sense,
1118 .pru_shutdown = uipc_shutdown,
1119 .pru_sockaddr = uipc_sockaddr,
1120 .pru_soreceive = soreceive_dgram,
1121 .pru_close = uipc_close,
1122};
1123
1124static struct pr_usrreqs uipc_usrreqs_seqpacket = {
1125 .pru_abort = uipc_abort,
1126 .pru_accept = uipc_accept,
1127 .pru_attach = uipc_attach,
1128 .pru_bind = uipc_bind,
1129 .pru_bindat = uipc_bindat,
1104 .pru_connect = uipc_connect,
1130 .pru_connect = uipc_connect,
1131 .pru_connectat = uipc_connectat,
1105 .pru_connect2 = uipc_connect2,
1106 .pru_detach = uipc_detach,
1107 .pru_disconnect = uipc_disconnect,
1108 .pru_listen = uipc_listen,
1109 .pru_peeraddr = uipc_peeraddr,
1110 .pru_rcvd = uipc_rcvd,
1111 .pru_send = uipc_send,
1112 .pru_sense = uipc_sense,
1113 .pru_shutdown = uipc_shutdown,
1114 .pru_sockaddr = uipc_sockaddr,
1115 .pru_soreceive = soreceive_generic, /* XXX: or...? */
1116 .pru_close = uipc_close,
1117};
1118
1119static struct pr_usrreqs uipc_usrreqs_stream = {
1120 .pru_abort = uipc_abort,
1121 .pru_accept = uipc_accept,
1122 .pru_attach = uipc_attach,
1123 .pru_bind = uipc_bind,
1132 .pru_connect2 = uipc_connect2,
1133 .pru_detach = uipc_detach,
1134 .pru_disconnect = uipc_disconnect,
1135 .pru_listen = uipc_listen,
1136 .pru_peeraddr = uipc_peeraddr,
1137 .pru_rcvd = uipc_rcvd,
1138 .pru_send = uipc_send,
1139 .pru_sense = uipc_sense,
1140 .pru_shutdown = uipc_shutdown,
1141 .pru_sockaddr = uipc_sockaddr,
1142 .pru_soreceive = soreceive_generic, /* XXX: or...? */
1143 .pru_close = uipc_close,
1144};
1145
1146static struct pr_usrreqs uipc_usrreqs_stream = {
1147 .pru_abort = uipc_abort,
1148 .pru_accept = uipc_accept,
1149 .pru_attach = uipc_attach,
1150 .pru_bind = uipc_bind,
1151 .pru_bindat = uipc_bindat,
1124 .pru_connect = uipc_connect,
1152 .pru_connect = uipc_connect,
1153 .pru_connectat = uipc_connectat,
1125 .pru_connect2 = uipc_connect2,
1126 .pru_detach = uipc_detach,
1127 .pru_disconnect = uipc_disconnect,
1128 .pru_listen = uipc_listen,
1129 .pru_peeraddr = uipc_peeraddr,
1130 .pru_rcvd = uipc_rcvd,
1131 .pru_send = uipc_send,
1132 .pru_sense = uipc_sense,

--- 95 unchanged lines hidden (view full) ---

1228 break;
1229 }
1230 return (error);
1231}
1232
1233static int
1234unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
1235{
1154 .pru_connect2 = uipc_connect2,
1155 .pru_detach = uipc_detach,
1156 .pru_disconnect = uipc_disconnect,
1157 .pru_listen = uipc_listen,
1158 .pru_peeraddr = uipc_peeraddr,
1159 .pru_rcvd = uipc_rcvd,
1160 .pru_send = uipc_send,
1161 .pru_sense = uipc_sense,

--- 95 unchanged lines hidden (view full) ---

1257 break;
1258 }
1259 return (error);
1260}
1261
1262static int
1263unp_connect(struct socket *so, struct sockaddr *nam, struct thread *td)
1264{
1265
1266 return (unp_connectat(AT_FDCWD, so, nam, td));
1267}
1268
1269static int
1270unp_connectat(int fd, struct socket *so, struct sockaddr *nam,
1271 struct thread *td)
1272{
1236 struct sockaddr_un *soun = (struct sockaddr_un *)nam;
1237 struct vnode *vp;
1238 struct socket *so2, *so3;
1239 struct unpcb *unp, *unp2, *unp3;
1240 int error, len;
1241 struct nameidata nd;
1242 char buf[SOCK_MAXADDRLEN];
1243 struct sockaddr *sa;

--- 16 unchanged lines hidden (view full) ---

1260 UNP_PCB_UNLOCK(unp);
1261 return (EALREADY);
1262 }
1263 UNP_LINK_WUNLOCK();
1264 unp->unp_flags |= UNP_CONNECTING;
1265 UNP_PCB_UNLOCK(unp);
1266
1267 sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
1273 struct sockaddr_un *soun = (struct sockaddr_un *)nam;
1274 struct vnode *vp;
1275 struct socket *so2, *so3;
1276 struct unpcb *unp, *unp2, *unp3;
1277 int error, len;
1278 struct nameidata nd;
1279 char buf[SOCK_MAXADDRLEN];
1280 struct sockaddr *sa;

--- 16 unchanged lines hidden (view full) ---

1297 UNP_PCB_UNLOCK(unp);
1298 return (EALREADY);
1299 }
1300 UNP_LINK_WUNLOCK();
1301 unp->unp_flags |= UNP_CONNECTING;
1302 UNP_PCB_UNLOCK(unp);
1303
1304 sa = malloc(sizeof(struct sockaddr_un), M_SONAME, M_WAITOK);
1268 NDINIT(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF,
1269 UIO_SYSSPACE, buf, td);
1305 NDINIT_ATRIGHTS(&nd, LOOKUP, FOLLOW | LOCKSHARED | LOCKLEAF,
1306 UIO_SYSSPACE, buf, fd, CAP_CONNECTAT, td);
1270 error = namei(&nd);
1271 if (error)
1272 vp = NULL;
1273 else
1274 vp = nd.ni_vp;
1275 ASSERT_VOP_LOCKED(vp, "unp_connect");
1276 NDFREE(&nd, NDF_ONLY_PNBUF);
1277 if (error)

--- 1175 unchanged lines hidden ---
1307 error = namei(&nd);
1308 if (error)
1309 vp = NULL;
1310 else
1311 vp = nd.ni_vp;
1312 ASSERT_VOP_LOCKED(vp, "unp_connect");
1313 NDFREE(&nd, NDF_ONLY_PNBUF);
1314 if (error)

--- 1175 unchanged lines hidden ---