1*10465441SEvalZero /*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date Author Notes
8*10465441SEvalZero */
9*10465441SEvalZero /* @(#)clnt_generic.c 2.2 88/08/01 4.0 RPCSRC */
10*10465441SEvalZero /*
11*10465441SEvalZero * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
12*10465441SEvalZero * unrestricted use provided that this legend is included on all tape
13*10465441SEvalZero * media and as a part of the software program in whole or part. Users
14*10465441SEvalZero * may copy or modify Sun RPC without charge, but are not authorized
15*10465441SEvalZero * to license or distribute it to anyone else except as part of a product or
16*10465441SEvalZero * program developed by the user.
17*10465441SEvalZero *
18*10465441SEvalZero * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
19*10465441SEvalZero * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
20*10465441SEvalZero * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
21*10465441SEvalZero *
22*10465441SEvalZero * Sun RPC is provided with no support and without any obligation on the
23*10465441SEvalZero * part of Sun Microsystems, Inc. to assist in its use, correction,
24*10465441SEvalZero * modification or enhancement.
25*10465441SEvalZero *
26*10465441SEvalZero * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
27*10465441SEvalZero * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
28*10465441SEvalZero * OR ANY PART THEREOF.
29*10465441SEvalZero *
30*10465441SEvalZero * In no event will Sun Microsystems, Inc. be liable for any lost revenue
31*10465441SEvalZero * or profits or other special, indirect and consequential damages, even if
32*10465441SEvalZero * Sun has been advised of the possibility of such damages.
33*10465441SEvalZero *
34*10465441SEvalZero * Sun Microsystems, Inc.
35*10465441SEvalZero * 2550 Garcia Avenue
36*10465441SEvalZero * Mountain View, California 94043
37*10465441SEvalZero */
38*10465441SEvalZero #if !defined(lint) && defined(SCCSIDS)
39*10465441SEvalZero static char sccsid[] = "@(#)clnt_generic.c 1.4 87/08/11 (C) 1987 SMI";
40*10465441SEvalZero #endif
41*10465441SEvalZero /*
42*10465441SEvalZero * Copyright (C) 1987, Sun Microsystems, Inc.
43*10465441SEvalZero */
44*10465441SEvalZero #include <rpc/rpc.h>
45*10465441SEvalZero #include <string.h>
46*10465441SEvalZero
47*10465441SEvalZero /*
48*10465441SEvalZero * Generic client creation: takes (hostname, program-number, protocol) and
49*10465441SEvalZero * returns client handle. Default options are set, which the user can
50*10465441SEvalZero * change using the rpc equivalent of ioctl()'s.
51*10465441SEvalZero */
clnt_create(const char * hostname,const unsigned long prog,const unsigned long vers,const char * proto)52*10465441SEvalZero CLIENT *clnt_create(const char *hostname, const unsigned long prog,
53*10465441SEvalZero const unsigned long vers, const char *proto)
54*10465441SEvalZero {
55*10465441SEvalZero int sock;
56*10465441SEvalZero struct sockaddr_in server;
57*10465441SEvalZero struct addrinfo hint, *res = NULL;
58*10465441SEvalZero struct timeval tv;
59*10465441SEvalZero CLIENT *client;
60*10465441SEvalZero int ret;
61*10465441SEvalZero
62*10465441SEvalZero memset(&hint, 0, sizeof(hint));
63*10465441SEvalZero ret = getaddrinfo(hostname, NULL, &hint, &res);
64*10465441SEvalZero if (ret != 0)
65*10465441SEvalZero {
66*10465441SEvalZero rt_kprintf("getaddrinfo err: %d '%s'\n", ret, hostname);
67*10465441SEvalZero return NULL;
68*10465441SEvalZero }
69*10465441SEvalZero
70*10465441SEvalZero memcpy(&server, res->ai_addr, sizeof(struct sockaddr_in));
71*10465441SEvalZero freeaddrinfo(res);
72*10465441SEvalZero
73*10465441SEvalZero sock = -1;
74*10465441SEvalZero if (strcmp(proto, "udp") == 0)
75*10465441SEvalZero {
76*10465441SEvalZero tv.tv_sec = 5;
77*10465441SEvalZero tv.tv_usec = 0;
78*10465441SEvalZero client = clntudp_create(&server, prog, vers, tv, &sock);
79*10465441SEvalZero if (client == NULL) return NULL;
80*10465441SEvalZero tv.tv_sec = 1;
81*10465441SEvalZero clnt_control(client, CLSET_TIMEOUT, (char *)&tv);
82*10465441SEvalZero }
83*10465441SEvalZero else
84*10465441SEvalZero {
85*10465441SEvalZero rt_kprintf("unknow protocol\n");
86*10465441SEvalZero return NULL;
87*10465441SEvalZero }
88*10465441SEvalZero
89*10465441SEvalZero return (client);
90*10465441SEvalZero }
91*10465441SEvalZero
clnt_perror(CLIENT * rpch,const char * s)92*10465441SEvalZero void clnt_perror(CLIENT *rpch, const char *s)
93*10465441SEvalZero {
94*10465441SEvalZero rt_kprintf("rpc client error:%s\n", s);
95*10465441SEvalZero }
96