1*93d36fc9SDavid van Moolenbroek /* $NetBSD: getport.c,v 1.2 2008/04/28 20:24:14 martin Exp $ */
2*93d36fc9SDavid van Moolenbroek
3*93d36fc9SDavid van Moolenbroek /*-
4*93d36fc9SDavid van Moolenbroek * Copyright (c) 2004 The NetBSD Foundation, Inc.
5*93d36fc9SDavid van Moolenbroek * All rights reserved.
6*93d36fc9SDavid van Moolenbroek *
7*93d36fc9SDavid van Moolenbroek * This code is derived from software contributed to The NetBSD Foundation
8*93d36fc9SDavid van Moolenbroek * by Christos Zoulas.
9*93d36fc9SDavid van Moolenbroek *
10*93d36fc9SDavid van Moolenbroek * Redistribution and use in source and binary forms, with or without
11*93d36fc9SDavid van Moolenbroek * modification, are permitted provided that the following conditions
12*93d36fc9SDavid van Moolenbroek * are met:
13*93d36fc9SDavid van Moolenbroek * 1. Redistributions of source code must retain the above copyright
14*93d36fc9SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer.
15*93d36fc9SDavid van Moolenbroek * 2. Redistributions in binary form must reproduce the above copyright
16*93d36fc9SDavid van Moolenbroek * notice, this list of conditions and the following disclaimer in the
17*93d36fc9SDavid van Moolenbroek * documentation and/or other materials provided with the distribution.
18*93d36fc9SDavid van Moolenbroek *
19*93d36fc9SDavid van Moolenbroek * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*93d36fc9SDavid van Moolenbroek * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*93d36fc9SDavid van Moolenbroek * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*93d36fc9SDavid van Moolenbroek * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*93d36fc9SDavid van Moolenbroek * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*93d36fc9SDavid van Moolenbroek * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*93d36fc9SDavid van Moolenbroek * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*93d36fc9SDavid van Moolenbroek * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*93d36fc9SDavid van Moolenbroek * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*93d36fc9SDavid van Moolenbroek * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*93d36fc9SDavid van Moolenbroek * POSSIBILITY OF SUCH DAMAGE.
30*93d36fc9SDavid van Moolenbroek */
31*93d36fc9SDavid van Moolenbroek
32*93d36fc9SDavid van Moolenbroek #include <sys/cdefs.h>
33*93d36fc9SDavid van Moolenbroek __RCSID("$NetBSD: getport.c,v 1.2 2008/04/28 20:24:14 martin Exp $");
34*93d36fc9SDavid van Moolenbroek
35*93d36fc9SDavid van Moolenbroek #include <stdlib.h>
36*93d36fc9SDavid van Moolenbroek #include <err.h>
37*93d36fc9SDavid van Moolenbroek #include <netdb.h>
38*93d36fc9SDavid van Moolenbroek #include <limits.h>
39*93d36fc9SDavid van Moolenbroek #include <errno.h>
40*93d36fc9SDavid van Moolenbroek #include <netinet/in.h>
41*93d36fc9SDavid van Moolenbroek
42*93d36fc9SDavid van Moolenbroek #include "getport.h"
43*93d36fc9SDavid van Moolenbroek
44*93d36fc9SDavid van Moolenbroek struct servent *
getport(const char * service,const char * protocol)45*93d36fc9SDavid van Moolenbroek getport(const char *service, const char *protocol)
46*93d36fc9SDavid van Moolenbroek {
47*93d36fc9SDavid van Moolenbroek long port;
48*93d36fc9SDavid van Moolenbroek char *ep;
49*93d36fc9SDavid van Moolenbroek struct servent *sp = getservbyname(service, protocol);
50*93d36fc9SDavid van Moolenbroek if (sp != NULL)
51*93d36fc9SDavid van Moolenbroek return sp;
52*93d36fc9SDavid van Moolenbroek
53*93d36fc9SDavid van Moolenbroek if ((sp = calloc(1, sizeof(*sp))) == NULL)
54*93d36fc9SDavid van Moolenbroek err(1, "malloc");
55*93d36fc9SDavid van Moolenbroek sp->s_name = __UNCONST(service);
56*93d36fc9SDavid van Moolenbroek sp->s_proto = __UNCONST(protocol);
57*93d36fc9SDavid van Moolenbroek port = strtol(service, &ep, 0);
58*93d36fc9SDavid van Moolenbroek if ((service[0] != '\0' && *ep != '\0') ||
59*93d36fc9SDavid van Moolenbroek (errno == ERANGE &&
60*93d36fc9SDavid van Moolenbroek (port == LONG_MAX || port == LONG_MIN)) ||
61*93d36fc9SDavid van Moolenbroek (port <= 0 || port >= IPPORT_ANONMAX))
62*93d36fc9SDavid van Moolenbroek errx(1,"port must be between 1 and %d",
63*93d36fc9SDavid van Moolenbroek IPPORT_ANONMAX);
64*93d36fc9SDavid van Moolenbroek sp->s_port = htons((uint16_t)port);
65*93d36fc9SDavid van Moolenbroek return sp;
66*93d36fc9SDavid van Moolenbroek }
67