1021d409fSDag-Erling Smørgrav /* $OpenBSD: rresvport.c,v 1.9 2005/11/10 10:00:17 espie Exp $ */
283d2307dSDag-Erling Smørgrav /*
383d2307dSDag-Erling Smørgrav * Copyright (c) 1995, 1996, 1998 Theo de Raadt. All rights reserved.
483d2307dSDag-Erling Smørgrav * Copyright (c) 1983, 1993, 1994
583d2307dSDag-Erling Smørgrav * The Regents of the University of California. All rights reserved.
683d2307dSDag-Erling Smørgrav *
783d2307dSDag-Erling Smørgrav * Redistribution and use in source and binary forms, with or without
883d2307dSDag-Erling Smørgrav * modification, are permitted provided that the following conditions
983d2307dSDag-Erling Smørgrav * are met:
1083d2307dSDag-Erling Smørgrav * 1. Redistributions of source code must retain the above copyright
1183d2307dSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer.
1283d2307dSDag-Erling Smørgrav * 2. Redistributions in binary form must reproduce the above copyright
1383d2307dSDag-Erling Smørgrav * notice, this list of conditions and the following disclaimer in the
1483d2307dSDag-Erling Smørgrav * documentation and/or other materials provided with the distribution.
15d95e11bfSDag-Erling Smørgrav * 3. Neither the name of the University nor the names of its contributors
1683d2307dSDag-Erling Smørgrav * may be used to endorse or promote products derived from this software
1783d2307dSDag-Erling Smørgrav * without specific prior written permission.
1883d2307dSDag-Erling Smørgrav *
1983d2307dSDag-Erling Smørgrav * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2083d2307dSDag-Erling Smørgrav * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2183d2307dSDag-Erling Smørgrav * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2283d2307dSDag-Erling Smørgrav * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2383d2307dSDag-Erling Smørgrav * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2483d2307dSDag-Erling Smørgrav * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2583d2307dSDag-Erling Smørgrav * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2683d2307dSDag-Erling Smørgrav * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2783d2307dSDag-Erling Smørgrav * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2883d2307dSDag-Erling Smørgrav * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2983d2307dSDag-Erling Smørgrav * SUCH DAMAGE.
3083d2307dSDag-Erling Smørgrav */
3183d2307dSDag-Erling Smørgrav
32021d409fSDag-Erling Smørgrav /* OPENBSD ORIGINAL: lib/libc/net/rresvport.c */
33021d409fSDag-Erling Smørgrav
344b17dab0SDag-Erling Smørgrav #include "includes.h"
3583d2307dSDag-Erling Smørgrav
3683d2307dSDag-Erling Smørgrav #ifndef HAVE_RRESVPORT_AF
3783d2307dSDag-Erling Smørgrav
38761efaa7SDag-Erling Smørgrav #include <sys/types.h>
39761efaa7SDag-Erling Smørgrav #include <sys/socket.h>
40761efaa7SDag-Erling Smørgrav
41761efaa7SDag-Erling Smørgrav #include <netinet/in.h>
42761efaa7SDag-Erling Smørgrav #include <arpa/inet.h>
43761efaa7SDag-Erling Smørgrav
44761efaa7SDag-Erling Smørgrav #include <errno.h>
45761efaa7SDag-Erling Smørgrav #include <stdlib.h>
46761efaa7SDag-Erling Smørgrav #include <string.h>
47d4af9e69SDag-Erling Smørgrav #include <unistd.h>
48761efaa7SDag-Erling Smørgrav
4983d2307dSDag-Erling Smørgrav #if 0
5083d2307dSDag-Erling Smørgrav int
51021d409fSDag-Erling Smørgrav rresvport(int *alport)
5283d2307dSDag-Erling Smørgrav {
5383d2307dSDag-Erling Smørgrav return rresvport_af(alport, AF_INET);
5483d2307dSDag-Erling Smørgrav }
5583d2307dSDag-Erling Smørgrav #endif
5683d2307dSDag-Erling Smørgrav
5783d2307dSDag-Erling Smørgrav int
rresvport_af(int * alport,sa_family_t af)5883d2307dSDag-Erling Smørgrav rresvport_af(int *alport, sa_family_t af)
5983d2307dSDag-Erling Smørgrav {
6083d2307dSDag-Erling Smørgrav struct sockaddr_storage ss;
6183d2307dSDag-Erling Smørgrav struct sockaddr *sa;
6283d2307dSDag-Erling Smørgrav u_int16_t *portp;
6383d2307dSDag-Erling Smørgrav int s;
6483d2307dSDag-Erling Smørgrav socklen_t salen;
6583d2307dSDag-Erling Smørgrav
6683d2307dSDag-Erling Smørgrav memset(&ss, '\0', sizeof ss);
6783d2307dSDag-Erling Smørgrav sa = (struct sockaddr *)&ss;
6883d2307dSDag-Erling Smørgrav
6983d2307dSDag-Erling Smørgrav switch (af) {
7083d2307dSDag-Erling Smørgrav case AF_INET:
7183d2307dSDag-Erling Smørgrav salen = sizeof(struct sockaddr_in);
7283d2307dSDag-Erling Smørgrav portp = &((struct sockaddr_in *)sa)->sin_port;
7383d2307dSDag-Erling Smørgrav break;
7483d2307dSDag-Erling Smørgrav case AF_INET6:
7583d2307dSDag-Erling Smørgrav salen = sizeof(struct sockaddr_in6);
7683d2307dSDag-Erling Smørgrav portp = &((struct sockaddr_in6 *)sa)->sin6_port;
7783d2307dSDag-Erling Smørgrav break;
7883d2307dSDag-Erling Smørgrav default:
7983d2307dSDag-Erling Smørgrav errno = EPFNOSUPPORT;
8083d2307dSDag-Erling Smørgrav return (-1);
8183d2307dSDag-Erling Smørgrav }
8283d2307dSDag-Erling Smørgrav sa->sa_family = af;
8383d2307dSDag-Erling Smørgrav
8483d2307dSDag-Erling Smørgrav s = socket(af, SOCK_STREAM, 0);
8583d2307dSDag-Erling Smørgrav if (s < 0)
8683d2307dSDag-Erling Smørgrav return (-1);
8783d2307dSDag-Erling Smørgrav
8883d2307dSDag-Erling Smørgrav *portp = htons(*alport);
8983d2307dSDag-Erling Smørgrav if (*alport < IPPORT_RESERVED - 1) {
9083d2307dSDag-Erling Smørgrav if (bind(s, sa, salen) >= 0)
9183d2307dSDag-Erling Smørgrav return (s);
9283d2307dSDag-Erling Smørgrav if (errno != EADDRINUSE) {
9383d2307dSDag-Erling Smørgrav (void)close(s);
9483d2307dSDag-Erling Smørgrav return (-1);
9583d2307dSDag-Erling Smørgrav }
9683d2307dSDag-Erling Smørgrav }
9783d2307dSDag-Erling Smørgrav
9883d2307dSDag-Erling Smørgrav *portp = 0;
9983d2307dSDag-Erling Smørgrav sa->sa_family = af;
10083d2307dSDag-Erling Smørgrav if (bindresvport_sa(s, sa) == -1) {
10183d2307dSDag-Erling Smørgrav (void)close(s);
10283d2307dSDag-Erling Smørgrav return (-1);
10383d2307dSDag-Erling Smørgrav }
10483d2307dSDag-Erling Smørgrav *alport = ntohs(*portp);
10583d2307dSDag-Erling Smørgrav return (s);
10683d2307dSDag-Erling Smørgrav }
10783d2307dSDag-Erling Smørgrav
10883d2307dSDag-Erling Smørgrav #endif /* HAVE_RRESVPORT_AF */
109