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

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since bceabc9 was cd450d2, checked in by Joel Sherrill <joel.sherrill@…>, on 08/06/12 at 00:10:35

librpc: now compiles

  • 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 <freebsd/bsd.h>
50#include <sys/types.h>
51#include <sys/socket.h>
52
53#include <netinet/in.h>
54
55#include <errno.h>
56#include <string.h>
57#include <unistd.h>
58
59#include <rpc/rpc.h>
60
61/*
62 * Bind a socket to a privileged IP port
63 */
64int
65bindresvport(
66        int sd,
67        struct sockaddr_in *sin)
68{
69        return bindresvport_sa(sd, (struct sockaddr *)sin);
70}
71
72/*
73 * Bind a socket to a privileged IP port
74 */
75int
76bindresvport_sa(
77        int sd,
78        struct sockaddr *sa)
79{
80        int old, error, af;
81        struct sockaddr myaddr;
82        struct sockaddr_in *sin;
83#ifdef INET6
84        struct sockaddr_in6 *sin6;
85#endif
86        int proto, portrange, portlow;
87        u_int16_t port;
88        socklen_t salen;
89
90        if (sa == NULL) {
91                salen = sizeof(myaddr);
92                sa = (struct sockaddr *)&myaddr;
93
94                if (getsockname(sd, sa, &salen) == -1)
95                        return -1;      /* errno is correctly set */
96
97                af = sa->sa_family;
98                memset(&myaddr, 0, salen);
99        } else
100                af = sa->sa_family;
101
102        switch (af) {
103        case AF_INET:
104                proto = IPPROTO_IP;
105                portrange = IP_PORTRANGE;
106                portlow = IP_PORTRANGE_LOW;
107                sin = (struct sockaddr_in *)sa;
108                salen = sizeof(struct sockaddr_in);
109                port = sin->sin_port;
110                break;
111#ifdef INET6
112        case AF_INET6:
113                proto = IPPROTO_IPV6;
114                portrange = IPV6_PORTRANGE;
115                portlow = IPV6_PORTRANGE_LOW;
116                sin6 = (struct sockaddr_in6 *)sa;
117                salen = sizeof(struct sockaddr_in6);
118                port = sin6->sin6_port;
119                break;
120#endif
121        default:
122                errno = EPFNOSUPPORT;
123                return (-1);
124        }
125        sa->sa_family = af;
126        sa->sa_len = salen;
127
128        if (port == 0) {
129                socklen_t oldlen = sizeof(old);
130
131                error = getsockopt(sd, proto, portrange, &old, &oldlen);
132                if (error < 0)
133                        return (error);
134
135                error = setsockopt(sd, proto, portrange, &portlow,
136                    sizeof(portlow));
137                if (error < 0)
138                        return (error);
139        }
140
141        error = bind(sd, sa, salen);
142
143        if (port == 0) {
144                int saved_errno = errno;
145
146                if (error) {
147                        if (setsockopt(sd, proto, portrange, &old,
148                            sizeof(old)) < 0)
149                                errno = saved_errno;
150                        return (error);
151                }
152
153                if (sa != (struct sockaddr *)&myaddr) {
154                        /* Hmm, what did the kernel assign? */
155                        if (getsockname(sd, sa, &salen) < 0)
156                                errno = saved_errno;
157                        return (error);
158                }
159        }
160        return (error);
161}
Note: See TracBrowser for help on using the repository browser.