xref: /minix3/usr.bin/rsh/getport.c (revision 93d36fc9d8fb766b78367bb140abfb114ba8c0b5)
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