]>
Commit | Line | Data |
---|---|---|
03fb6eb0 A |
1 | /* |
2 | * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. | |
3 | * | |
4 | * @APPLE_LICENSE_HEADER_START@ | |
5 | * | |
ad21edcc A |
6 | * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights |
7 | * Reserved. This file contains Original Code and/or Modifications of | |
8 | * Original Code as defined in and that are subject to the Apple Public | |
9 | * Source License Version 1.1 (the "License"). You may not use this file | |
10 | * except in compliance with the License. Please obtain a copy of the | |
11 | * License at http://www.apple.com/publicsource and read it before using | |
12 | * this file. | |
03fb6eb0 A |
13 | * |
14 | * The Original Code and all software distributed under the License are | |
ad21edcc | 15 | * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER |
03fb6eb0 A |
16 | * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, |
17 | * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, | |
ad21edcc A |
18 | * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the |
19 | * License for the specific language governing rights and limitations | |
20 | * under the License. | |
03fb6eb0 A |
21 | * |
22 | * @APPLE_LICENSE_HEADER_END@ | |
23 | */ | |
24 | /* | |
25 | * Sun RPC is a product of Sun Microsystems, Inc. and is provided for | |
26 | * unrestricted use provided that this legend is included on all tape | |
27 | * media and as a part of the software program in whole or part. Users | |
28 | * may copy or modify Sun RPC without charge, but are not authorized | |
29 | * to license or distribute it to anyone else except as part of a product or | |
30 | * program developed by the user. | |
31 | * | |
32 | * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE | |
33 | * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR | |
34 | * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE. | |
35 | * | |
36 | * Sun RPC is provided with no support and without any obligation on the | |
37 | * part of Sun Microsystems, Inc. to assist in its use, correction, | |
38 | * modification or enhancement. | |
39 | * | |
40 | * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE | |
41 | * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC | |
42 | * OR ANY PART THEREOF. | |
43 | * | |
44 | * In no event will Sun Microsystems, Inc. be liable for any lost revenue | |
45 | * or profits or other special, indirect and consequential damages, even if | |
46 | * Sun has been advised of the possibility of such damages. | |
47 | * | |
48 | * Sun Microsystems, Inc. | |
49 | * 2550 Garcia Avenue | |
50 | * Mountain View, California 94043 | |
51 | */ | |
52 | ||
53 | #if defined(LIBC_SCCS) && !defined(lint) | |
54 | /*static char *sccsid = "from: @(#)bindresvport.c 1.8 88/02/08 SMI";*/ | |
55 | /*static char *sccsid = "from: @(#)bindresvport.c 2.2 88/07/29 4.0 RPCSRC";*/ | |
3b7c7bd7 A |
56 | /*from: OpenBSD: bindresvport.c,v 1.7 1996/07/30 16:25:47 downsj Exp */ |
57 | static char *rcsid = "$FreeBSD: src/lib/libc/rpc/bindresvport.c,v 1.12 2000/01/26 09:02:42 shin Exp $"; | |
03fb6eb0 A |
58 | #endif |
59 | ||
60 | /* | |
61 | * Copyright (c) 1987 by Sun Microsystems, Inc. | |
3b7c7bd7 A |
62 | * |
63 | * Portions Copyright(C) 1996, Jason Downs. All rights reserved. | |
03fb6eb0 A |
64 | */ |
65 | ||
3b7c7bd7 A |
66 | #include <string.h> |
67 | #include <unistd.h> | |
03fb6eb0 A |
68 | #include <sys/types.h> |
69 | #include <sys/errno.h> | |
70 | #include <sys/socket.h> | |
71 | #include <netinet/in.h> | |
72 | ||
3b7c7bd7 A |
73 | /* |
74 | * Bind a socket to a privileged port for whatever protocol. | |
75 | */ | |
76 | int | |
77 | bindresvport_sa(sd, sa) | |
78 | int sd; | |
79 | struct sockaddr *sa; | |
80 | { | |
81 | int old, error, af; | |
82 | struct sockaddr_storage myaddr; | |
83 | struct sockaddr_in *sin; | |
84 | struct sockaddr_in6 *sin6; | |
85 | int proto, portrange, portlow; | |
86 | u_int16_t port; | |
b3dd680f | 87 | u_int32_t salen; |
3b7c7bd7 A |
88 | |
89 | if (sa == NULL) { | |
90 | salen = sizeof(myaddr); | |
91 | sa = (struct sockaddr *)&myaddr; | |
92 | ||
93 | if (getsockname(sd, sa, &salen) == -1) | |
94 | return -1; /* errno is correctly set */ | |
95 | ||
96 | af = sa->sa_family; | |
97 | memset(&myaddr, 0, salen); | |
98 | } else | |
99 | af = sa->sa_family; | |
100 | ||
101 | if (af == AF_INET) { | |
102 | proto = IPPROTO_IP; | |
103 | portrange = IP_PORTRANGE; | |
104 | portlow = IP_PORTRANGE_LOW; | |
105 | sin = (struct sockaddr_in *)sa; | |
106 | salen = sizeof(struct sockaddr_in); | |
107 | port = sin->sin_port; | |
108 | } else if (af == AF_INET6) { | |
109 | proto = IPPROTO_IPV6; | |
110 | portrange = IPV6_PORTRANGE; | |
111 | portlow = IPV6_PORTRANGE_LOW; | |
112 | sin6 = (struct sockaddr_in6 *)sa; | |
113 | salen = sizeof(struct sockaddr_in6); | |
114 | port = sin6->sin6_port; | |
115 | } else { | |
03fb6eb0 A |
116 | errno = EPFNOSUPPORT; |
117 | return (-1); | |
118 | } | |
3b7c7bd7 A |
119 | sa->sa_family = af; |
120 | sa->sa_len = salen; | |
121 | ||
03fb6eb0 | 122 | if (port == 0) { |
b3dd680f | 123 | u_int32_t oldlen = sizeof(old); |
3b7c7bd7 A |
124 | |
125 | error = getsockopt(sd, proto, portrange, &old, &oldlen); | |
126 | if (error < 0) | |
127 | return (error); | |
128 | ||
129 | error = setsockopt(sd, proto, portrange, &portlow, | |
130 | sizeof(portlow)); | |
131 | if (error < 0) | |
132 | return (error); | |
03fb6eb0 | 133 | } |
3b7c7bd7 A |
134 | |
135 | error = bind(sd, sa, salen); | |
136 | ||
137 | if (port == 0) { | |
138 | int saved_errno = errno; | |
139 | ||
140 | if (error) { | |
141 | if (setsockopt(sd, proto, portrange, &old, | |
142 | sizeof(old)) < 0) | |
143 | errno = saved_errno; | |
144 | return (error); | |
145 | } | |
146 | ||
147 | if (sa != (struct sockaddr *)&myaddr) { | |
148 | /* Hmm, what did the kernel assign... */ | |
149 | if (getsockname(sd, sa, &salen) < 0) | |
150 | errno = saved_errno; | |
151 | return (error); | |
03fb6eb0 | 152 | } |
03fb6eb0 | 153 | } |
3b7c7bd7 | 154 | return (error); |
03fb6eb0 | 155 | } |
ccd4a120 A |
156 | |
157 | /* | |
158 | * Bind a socket to a privileged IP port | |
159 | */ | |
160 | int | |
161 | bindresvport(sd, sin) | |
162 | int sd; | |
163 | struct sockaddr_in *sin; | |
164 | { | |
165 | return bindresvport_sa(sd, (struct sockaddr *)sin); | |
166 | } |