source: rtems/cpukit/librpc/src/rpc/bindresvport.c @ f26145b

4.104.114.84.95
Last change on this file since f26145b was 0c20a46, checked in by Ralf Corsepius <ralf.corsepius@…>, on 02/03/05 at 15:58:18

2005-02-03 Ralf Corsepius <ralf.corsepius@…>

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