ypset.c revision 1.1
11.1Sderaadt#include <sys/param.h> 21.1Sderaadt#include <sys/types.h> 31.1Sderaadt#include <sys/socket.h> 41.1Sderaadt#include <stdio.h> 51.1Sderaadt#include <netdb.h> 61.1Sderaadt#include <rpc/rpc.h> 71.1Sderaadt#include <rpc/xdr.h> 81.1Sderaadt#include <rpcsvc/yp_prot.h> 91.1Sderaadt#include <rpcsvc/ypclnt.h> 101.1Sderaadt 111.1Sderaadtextern bool_t xdr_domainname(); 121.1Sderaadt 131.1Sderaadtusage() 141.1Sderaadt{ 151.1Sderaadt fprintf(stderr, "Usage:\n"); 161.1Sderaadt fprintf(stderr, "\typset [-h host ] [-d domain] server\n"); 171.1Sderaadt exit(1); 181.1Sderaadt} 191.1Sderaadt 201.1Sderaadtbind_tohost(sin, dom, server) 211.1Sderaadtstruct sockaddr_in *sin; 221.1Sderaadtchar *dom, *server; 231.1Sderaadt{ 241.1Sderaadt struct ypbind_setdom ypsd; 251.1Sderaadt struct timeval tv; 261.1Sderaadt CLIENT *client; 271.1Sderaadt int sock, port; 281.1Sderaadt int r; 291.1Sderaadt 301.1Sderaadt if( (port=htons(getrpcport(server, YPPROG, YPPROC_NULL, IPPROTO_UDP))) == 0) { 311.1Sderaadt fprintf(stderr, "%s not running ypserv.\n", server); 321.1Sderaadt exit(1); 331.1Sderaadt } 341.1Sderaadt 351.1Sderaadt bzero(&ypsd, sizeof ypsd); 361.1Sderaadt strncpy(ypsd.ypsetdom_domain, dom, sizeof ypsd.ypsetdom_domain); 371.1Sderaadt ypsd.ypsetdom_addr = sin->sin_addr; 381.1Sderaadt ypsd.ypsetdom_vers = YPVERS; 391.1Sderaadt ypsd.ypsetdom_port = port; 401.1Sderaadt 411.1Sderaadt tv.tv_sec = 15; 421.1Sderaadt tv.tv_usec = 0; 431.1Sderaadt sock = RPC_ANYSOCK; 441.1Sderaadt client = clntudp_create(sin, YPBINDPROG, YPBINDVERS, &sock, 0, 0); 451.1Sderaadt if (client==NULL) { 461.1Sderaadt fprintf(stderr, "can't yp_bind: Reason: %s\n", 471.1Sderaadt yperr_string(YPERR_YPBIND)); 481.1Sderaadt return YPERR_YPBIND; 491.1Sderaadt } 501.1Sderaadt client->cl_auth = authunix_create_default(); 511.1Sderaadt 521.1Sderaadt r = clnt_call(client, YPBINDPROC_SETDOM, 531.1Sderaadt xdr_ypbind_setdom, &ypsd, xdr_void, NULL, tv); 541.1Sderaadt if(r) { 551.1Sderaadt fprintf(stderr, "Sorry, cannot ypset for domain %s on host.\n", dom); 561.1Sderaadt clnt_destroy(client); 571.1Sderaadt return YPERR_YPBIND; 581.1Sderaadt } 591.1Sderaadt clnt_destroy(client); 601.1Sderaadt return 0; 611.1Sderaadt} 621.1Sderaadt 631.1Sderaadtint 641.1Sderaadtmain(argc, argv) 651.1Sderaadtchar **argv; 661.1Sderaadt{ 671.1Sderaadt struct sockaddr_in sin; 681.1Sderaadt struct hostent *hent; 691.1Sderaadt extern char *optarg; 701.1Sderaadt extern int optind; 711.1Sderaadt char *domainname; 721.1Sderaadt int c; 731.1Sderaadt 741.1Sderaadt yp_get_default_domain(&domainname); 751.1Sderaadt 761.1Sderaadt bzero(&sin, sizeof sin); 771.1Sderaadt sin.sin_family = AF_INET; 781.1Sderaadt sin.sin_addr.s_addr = htonl(0x7f000001); 791.1Sderaadt 801.1Sderaadt while( (c=getopt(argc, argv, "h:d:")) != -1) 811.1Sderaadt switch(c) { 821.1Sderaadt case 'd': 831.1Sderaadt domainname = optarg; 841.1Sderaadt break; 851.1Sderaadt case 'h': 861.1Sderaadt if( (sin.sin_addr.s_addr=inet_addr(optarg)) == -1) { 871.1Sderaadt hent = gethostbyname(optarg); 881.1Sderaadt if(hent==NULL) { 891.1Sderaadt fprintf(stderr, "ypset: host %s unknown\n", 901.1Sderaadt optarg); 911.1Sderaadt exit(1); 921.1Sderaadt } 931.1Sderaadt bcopy(&hent->h_addr_list[0], &sin.sin_addr, 941.1Sderaadt sizeof sin.sin_addr); 951.1Sderaadt } 961.1Sderaadt break; 971.1Sderaadt default: 981.1Sderaadt usage(); 991.1Sderaadt } 1001.1Sderaadt 1011.1Sderaadt if(optind + 1 != argc ) 1021.1Sderaadt usage(); 1031.1Sderaadt 1041.1Sderaadt if (bind_tohost(&sin, domainname, argv[optind])) 1051.1Sderaadt exit(1); 1061.1Sderaadt exit(0); 1071.1Sderaadt} 108