eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen/*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * CDDL HEADER START
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen *
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * The contents of this file are subject to the terms of the
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * Common Development and Distribution License (the "License").
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * You may not use this file except in compliance with the License.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen *
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * or http://www.opensolaris.org/os/licensing.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * See the License for the specific language governing permissions
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * and limitations under the License.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen *
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * When distributing Covered Code, include this CDDL HEADER in each
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * If applicable, add the following below this CDDL HEADER, with the
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * fields enclosed by brackets "[]" replaced with your own identifying
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * information: Portions Copyright [yyyy] [name of copyright owner]
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen *
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * CDDL HEADER END
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen/*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * Use is subject to license terms.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen/*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * This file delivers /usr/lib/servinfo which provides description for
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * IANA and running RPC services. Given a IANA name or RPC program name
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * or number, the program uses getservbyname(3SOCKET) and rpcbind(3NSL)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * to obtain port and proto information for the specified service.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <stdio.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <stdlib.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <strings.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <netconfig.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <netdb.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <rpc/rpc.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <rpc/rpcent.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <sys/types.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <netinet/in.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <netdir.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <inttypes.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <limits.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <libintl.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#include <locale.h>
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#ifndef TEXT_DOMAIN
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define TEXT_DOMAIN "SUNW_OST_OSCMD"
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#endif /* TEXT_DOMAIN */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define TCP "tcp"
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define TCP6 "tcp6"
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define UDP "udp"
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define UDP6 "udp6"
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define DEFAULT 0x1
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define PORT 0x2
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define PROTO 0x4
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen#define NETID_LEN 12 /* length for a netid or 2^16 port value */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenstatic void
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenusage(char *arg0)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen{
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr, gettext("Usage: %s [-R] [-Pp] [-tu[6]] "
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen "-s service_name\n"), arg0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen}
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenstatic rpcport_t
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenuaddr2port(char *addr)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen{
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpcport_t port = 0;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen char *dot, *p;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if ((dot = strrchr(addr, '.')) == 0) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen } else {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (dot == addr)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen p = dot - 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen while (*p != '.') {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen /*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * If the first dot hasn't been seen, it's a
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * malformed universal address.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (p == addr)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen p--;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen port = strtol(p + 1, &dot, 10) << 8;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen port = port | strtol(dot + 1, (char **)NULL, 10);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (port);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen}
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenstatic int
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyensvc_getrpcinfo(char *sname, char *sproto, int options)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen{
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen struct netconfig *nconf;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen struct rpcblist *blist;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen int prognum = -1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpcport_t rpc_port;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen struct rpcent rentry;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen struct rpcent *rpc;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen char line[LINE_MAX] = "";
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen int line_len = LINE_MAX - 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen char buf[NETID_LEN];
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen prognum = atoi(sname);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (prognum > 0)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc = (struct rpcent *)getrpcbynumber(prognum);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen else
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc = (struct rpcent *)getrpcbyname(sname);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen /*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * If an entry doesn't exist, it could be a running program
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * without a registered RPC entry.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (rpc == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (prognum <= 0) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr,
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen gettext("Can't get rpc entry\n"));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc = &rentry;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc->r_number = prognum;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc->r_name = sname;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (setnetconfig() == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr, gettext("setnetconfig failed\n"));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if ((nconf = getnetconfigent(TCP)) == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr, gettext("getnetconfig failed\n"));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if ((blist = (struct rpcblist *)rpcb_getmaps(nconf, "localhost"))
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr,
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen gettext("Failed: rpcb_getmaps failed\n"));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen for (; blist != NULL; blist = blist->rpcb_next) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (blist->rpcb_map.r_prog != rpc->r_number)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (sproto) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strcmp(blist->rpcb_map.r_netid, sproto) != 0)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen } else {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strcmp(blist->rpcb_map.r_netid, UDP) &&
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen strcmp(blist->rpcb_map.r_netid, UDP6) &&
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen strcmp(blist->rpcb_map.r_netid, TCP) &&
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen strcmp(blist->rpcb_map.r_netid, TCP6))
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen rpc_port = uaddr2port(blist->rpcb_map.r_addr);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (options & DEFAULT) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Program %ld\n", blist->rpcb_map.r_prog);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Protocol %s\n", blist->rpcb_map.r_netid);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Port %ld\n", rpc_port);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Version %ld\n", blist->rpcb_map.r_vers);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Name %s\n", rpc->r_name);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen } else if (options & PROTO) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strstr(line, blist->rpcb_map.r_netid))
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) snprintf(buf, sizeof (buf), "%5s ",
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen blist->rpcb_map.r_netid);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strlen(buf) > line_len)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen line_len = line_len - strlen(buf);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) strlcat(line, buf, sizeof (line));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen } else {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) snprintf(buf, sizeof (buf), "%-7ld ", rpc_port);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strstr(line, buf) || strlen(buf) > line_len)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen continue;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen line_len = line_len - strlen(buf);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) strlcat(line, buf, sizeof (line));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen /*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * Print the concatenated output if options is PROTO or PORT.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (options & (PROTO | PORT))
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) puts(line);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen}
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenint
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyenmain(int argc, char *argv[])
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen{
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen struct servent *service;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen char *sname = NULL;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen char *sproto = NULL;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen int options = DEFAULT;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen int c, isrpc = 0, v6_flag = 0;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) setlocale(LC_ALL, "");
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) textdomain(TEXT_DOMAIN);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen optind = 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen opterr = 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen while ((c = getopt(argc, argv, "s:PplRtu6?")) != -1) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen switch (c) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 's':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen sname = optarg;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 't':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen sproto = TCP;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 'u':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen sproto = UDP;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case '6':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen v6_flag = 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 'P':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen options = PROTO;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 'p':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen options = PORT;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen case 'R':
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen isrpc = 1;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen break;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen default:
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen usage(argv[0]);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (sname == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen usage(argv[0]);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen /*
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen * Specified service is an RPC service.
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen */
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (isrpc) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (sproto && v6_flag) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strcmp(sproto, TCP) == 0)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen sproto = TCP6;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (strcmp(sproto, UDP) == 0)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen sproto = UDP6;
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (svc_getrpcinfo(sname, sproto, options));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if ((service = getservbyname(sname, sproto)) == NULL) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) fprintf(stderr, gettext(
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen "Failed to get information for %s\n"), sname);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (1);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen }
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen if (options & DEFAULT) {
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Name %s\n", service->s_name);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Protocol %s\n", service->s_proto);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("Port %d\n", htons(service->s_port));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen } else if (options & PROTO)
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("%s\n", service->s_proto);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen else
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen (void) printf("%d\n", htons(service->s_port));
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen return (0);
eb1a34638eba7c5add1421327f3eb225a8ea7518Truong Nguyen}