GCC Code Coverage Report
Directory: ./ Exec Total Coverage
File: lib/libc/net/rresvport.c Lines: 0 31 0.0 %
Date: 2017-11-07 Branches: 0 13 0.0 %

Line Branch Exec Source
1
/* $OpenBSD: rresvport.c,v 1.11 2015/09/12 14:56:50 guenther Exp $ */
2
/*
3
 * Copyright (c) 1995, 1996, 1998 Theo de Raadt.  All rights reserved.
4
 * Copyright (c) 1983, 1993, 1994
5
 *	The Regents of the University of California.  All rights reserved.
6
 *
7
 * Redistribution and use in source and binary forms, with or without
8
 * modification, are permitted provided that the following conditions
9
 * are met:
10
 * 1. Redistributions of source code must retain the above copyright
11
 *    notice, this list of conditions and the following disclaimer.
12
 * 2. Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
15
 * 3. Neither the name of the University nor the names of its contributors
16
 *    may be used to endorse or promote products derived from this software
17
 *    without specific prior written permission.
18
 *
19
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29
 * SUCH DAMAGE.
30
 */
31
32
#include <sys/socket.h>
33
#include <sys/stat.h>
34
35
#include <netinet/in.h>
36
#include <arpa/inet.h>
37
38
#include <signal.h>
39
#include <fcntl.h>
40
#include <netdb.h>
41
#include <unistd.h>
42
#include <pwd.h>
43
#include <errno.h>
44
#include <stdio.h>
45
#include <ctype.h>
46
#include <string.h>
47
#include <syslog.h>
48
#include <stdlib.h>
49
#include <netgroup.h>
50
51
int
52
rresvport(int *alport)
53
{
54
	return rresvport_af(alport, AF_INET);
55
}
56
57
58
int
59
rresvport_af(int *alport, int af)
60
{
61
	struct sockaddr_storage ss;
62
	struct sockaddr *sa;
63
	u_int16_t *portp;
64
	int s;
65
66
	bzero(&ss, sizeof ss);
67
	sa = (struct sockaddr *)&ss;
68
69
	switch (af) {
70
	case AF_INET:
71
		sa->sa_len = sizeof(struct sockaddr_in);
72
		portp = &((struct sockaddr_in *)sa)->sin_port;
73
		break;
74
	case AF_INET6:
75
		sa->sa_len = sizeof(struct sockaddr_in6);
76
		portp = &((struct sockaddr_in6 *)sa)->sin6_port;
77
		break;
78
	default:
79
		errno = EPFNOSUPPORT;
80
		return (-1);
81
	}
82
	sa->sa_family = af;
83
84
	s = socket(af, SOCK_STREAM, 0);
85
	if (s < 0)
86
		return (-1);
87
88
	*portp = htons(*alport);
89
	if (*alport < IPPORT_RESERVED - 1) {
90
		if (bind(s, sa, sa->sa_len) >= 0)
91
			return (s);
92
		if (errno != EADDRINUSE) {
93
			(void)close(s);
94
			return (-1);
95
		}
96
	}
97
98
	*portp = 0;
99
	sa->sa_family = af;
100
	if (bindresvport_sa(s, sa) == -1) {
101
		(void)close(s);
102
		return (-1);
103
	}
104
	*alport = ntohs(*portp);
105
	return (s);
106
}
107
DEF_WEAK(rresvport_af);