source: rtems-libbsd/services/librpc/src/rpc/bindresvport.c @ e599318

4.115-freebsd-12freebsd-9.3
Last change on this file since e599318 was e599318, checked in by Sebastian Huber <sebastian.huber@…>, on Oct 9, 2013 at 8:52:54 PM

Update files to match FreeBSD layout

Add compatibility with Newlib header files. Some FreeBSD header files
are mapped by the translation script:

o rtems/bsd/sys/_types.h
o rtems/bsd/sys/errno.h
o rtems/bsd/sys/lock.h
o rtems/bsd/sys/param.h
o rtems/bsd/sys/resource.h
o rtems/bsd/sys/time.h
o rtems/bsd/sys/timespec.h
o rtems/bsd/sys/types.h
o rtems/bsd/sys/unistd.h

It is now possible to include <sys/socket.h> directly for example.

Generate one Makefile which builds everything including tests.

  • Property mode set to 100644
File size: 3.9 KB
Line 
1/*      $NetBSD: bindresvport.c,v 1.19 2000/07/06 03:03:59 christos Exp $       */
2
3/*
4 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
5 * unrestricted use provided that this legend is included on all tape
6 * media and as a part of the software program in whole or part.  Users
7 * may copy or modify Sun RPC without charge, but are not authorized
8 * to license or distribute it to anyone else except as part of a product or
9 * program developed by the user.
10 *
11 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
12 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
13 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14 *
15 * Sun RPC is provided with no support and without any obligation on the
16 * part of Sun Microsystems, Inc. to assist in its use, correction,
17 * modification or enhancement.
18 *
19 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
20 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
21 * OR ANY PART THEREOF.
22 *
23 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
24 * or profits or other special, indirect and consequential damages, even if
25 * Sun has been advised of the possibility of such damages.
26 *
27 * Sun Microsystems, Inc.
28 * 2550 Garcia Avenue
29 * Mountain View, California  94043
30 */
31
32#if defined(LIBC_SCCS) && !defined(lint)
33/*static char *sccsid = "from: @(#)bindresvport.c 1.8 88/02/08 SMI";*/
34/*static char *sccsid = "from: @(#)bindresvport.c       2.2 88/07/29 4.0 RPCSRC";*/
35/*from: OpenBSD: bindresvport.c,v 1.7 1996/07/30 16:25:47 downsj Exp */
36static char *rcsid = "$FreeBSD: src/lib/libc/rpc/bindresvport.c,v 1.12 2000/01/26 09:02:42 shin Exp $";
37#endif
38
39/*
40 * Copyright (c) 1987 by Sun Microsystems, Inc.
41 *
42 * Portions Copyright(C) 1996, Jason Downs.  All rights reserved.
43 */
44
45#ifdef HAVE_CONFIG_H
46#include "config.h"
47#endif
48
49#include <sys/types.h>
50#include <sys/socket.h>
51
52#include <netinet/in.h>
53
54#include <errno.h>
55#include <string.h>
56#include <unistd.h>
57
58#include <rpc/rpc.h>
59
60/*
61 * Bind a socket to a privileged IP port
62 */
63int
64bindresvport(
65        int sd,
66        struct sockaddr_in *sin)
67{
68        return bindresvport_sa(sd, (struct sockaddr *)sin);
69}
70
71/*
72 * Bind a socket to a privileged IP port
73 */
74int
75bindresvport_sa(
76        int sd,
77        struct sockaddr *sa)
78{
79        int old, error, af;
80        struct sockaddr myaddr;
81        struct sockaddr_in *sin;
82#ifdef INET6
83        struct sockaddr_in6 *sin6;
84#endif
85        int proto, portrange, portlow;
86        u_int16_t port;
87        socklen_t salen;
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        switch (af) {
102        case AF_INET:
103                proto = IPPROTO_IP;
104                portrange = IP_PORTRANGE;
105                portlow = IP_PORTRANGE_LOW;
106                sin = (struct sockaddr_in *)sa;
107                salen = sizeof(struct sockaddr_in);
108                port = sin->sin_port;
109                break;
110#ifdef INET6
111        case AF_INET6:
112                proto = IPPROTO_IPV6;
113                portrange = IPV6_PORTRANGE;
114                portlow = IPV6_PORTRANGE_LOW;
115                sin6 = (struct sockaddr_in6 *)sa;
116                salen = sizeof(struct sockaddr_in6);
117                port = sin6->sin6_port;
118                break;
119#endif
120        default:
121                errno = EPFNOSUPPORT;
122                return (-1);
123        }
124        sa->sa_family = af;
125        sa->sa_len = salen;
126
127        if (port == 0) {
128                socklen_t oldlen = sizeof(old);
129
130                error = getsockopt(sd, proto, portrange, &old, &oldlen);
131                if (error < 0)
132                        return (error);
133
134                error = setsockopt(sd, proto, portrange, &portlow,
135                    sizeof(portlow));
136                if (error < 0)
137                        return (error);
138        }
139
140        error = bind(sd, sa, salen);
141
142        if (port == 0) {
143                int saved_errno = errno;
144
145                if (error) {
146                        if (setsockopt(sd, proto, portrange, &old,
147                            sizeof(old)) < 0)
148                                errno = saved_errno;
149                        return (error);
150                }
151
152                if (sa != (struct sockaddr *)&myaddr) {
153                        /* Hmm, what did the kernel assign? */
154                        if (getsockname(sd, sa, &salen) < 0)
155                                errno = saved_errno;
156                        return (error);
157                }
158        }
159        return (error);
160}
Note: See TracBrowser for help on using the repository browser.