xref: /freebsd/crypto/openssh/openbsd-compat/rresvport.c (revision d4af9e693f15f5155095f38c7650b24fe74ae351)
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