/* * Remove the mapping between program,version and port. * Calls the pmap service remotely to do the un-mapping. */ bool_t pmap_unset( rpcprog_t program, rpcvers_t version) { struct sockaddr_in myaddress; int socket = -1; register CLIENT *client; struct pmap parms; bool_t rslt; get_myaddress(&myaddress); client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); if (client == (CLIENT *)NULL) return (FALSE); parms.pm_prog = program; parms.pm_vers = version; parms.pm_port = parms.pm_prot = 0; CLNT_CALL(client, PMAPPROC_UNSET, xdr_pmap, &parms, xdr_bool, &rslt, tottimeout); CLNT_DESTROY(client); (void)close(socket); return (rslt); }
int main(int argn, char *argc[]) { //Program parameters : argc[1] : HostName or Host IP // argc[2] : Server Program Number // other arguments depend on test case //run_mode can switch into stand alone program or program launch by shell script //1 : stand alone, debug mode, more screen information //0 : launch by shell script as test case, only one printf -> result status int run_mode = 0; int test_status = 1; //Default test result set to FAILED int progNum = atoi(argc[2]); struct sockaddr_in sin; //Initialization sin.sin_addr.s_addr = 0; //Call tested routine get_myaddress(&sin); test_status = (sin.sin_addr.s_addr == 0); //This last printf gives the result status to the tests suite //normally should be 0: test has passed or 1: test has failed printf("%d\n", test_status); return test_status; }
/* * Set a mapping between program,version and port. * Calls the pmap service remotely to do the mapping. */ bool_t pmap_set( rpcprog_t program, rpcvers_t version, rpcprot_t protocol, u_int port) { struct sockaddr_in myaddress; int socket = -1; register CLIENT *client; struct pmap parms; bool_t rslt; get_myaddress(&myaddress); client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, timeout, &socket, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); if (client == (CLIENT *)NULL) return (FALSE); parms.pm_prog = program; parms.pm_vers = version; parms.pm_prot = protocol; parms.pm_port = port; if (CLNT_CALL(client, PMAPPROC_SET, xdr_pmap, &parms, xdr_bool, &rslt, tottimeout) != RPC_SUCCESS) { clnt_perror(client, "Cannot register service"); return (FALSE); } CLNT_DESTROY(client); (void)close(socket); return (rslt); }
/* * Remove the mapping between program,version and port. * Calls the pmap service remotely to do the un-mapping. */ bool_t pmap_unset( unsigned long program, unsigned long version) { struct sockaddr_in myaddress; int sockfd = -1; register CLIENT *client; struct pmap parms; bool_t rslt; get_myaddress(&myaddress); client = clnttcp_create(&myaddress, PMAPPROG, PMAPVERS, &sockfd, 0, 0); if (client == (CLIENT *)NULL) return (FALSE); parms.pm_prog = program; parms.pm_vers = version; parms.pm_port = parms.pm_prot = 0; if (CLNT_CALL(client, PMAPPROC_UNSET, xdr_pmap, &parms, xdr_bool, &rslt, tottimeout) != RPC_SUCCESS) { clnt_perror(client, "pmap_unset: Cannot unregister service"); rslt = FALSE; } CLNT_DESTROY(client); return (rslt); }
/* * Remove the mapping between program,version and port. * Calls the pmap service remotely to do the un-mapping. */ bool_t pmap_unset(u_long program, u_long version) { struct sockaddr_in myaddress; int sock = -1; CLIENT *client; struct pmap parms; bool_t rslt; if (get_myaddress(&myaddress) != 0) return (FALSE); myaddress.sin_addr.s_addr = htonl(INADDR_LOOPBACK); client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, timeout, &sock, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); if (client == NULL) return (FALSE); parms.pm_prog = program; parms.pm_vers = version; parms.pm_port = parms.pm_prot = 0; CLNT_CALL(client, PMAPPROC_UNSET, xdr_pmap, &parms, xdr_bool, &rslt, tottimeout); CLNT_DESTROY(client); if (sock != -1) (void)close(sock); return (rslt); }
/* * Set a mapping between program,version and port. * Calls the pmap service remotely to do the mapping. */ bool_t pmap_set(u_long program, u_long version, u_int protocol, int iport) { struct sockaddr_in myaddress; int sock = -1; CLIENT *client; struct pmap parms; bool_t rslt; u_short port = iport; if (get_myaddress(&myaddress) != 0) return (FALSE); myaddress.sin_addr.s_addr = htonl(INADDR_LOOPBACK); client = clntudp_bufcreate(&myaddress, PMAPPROG, PMAPVERS, timeout, &sock, RPCSMALLMSGSIZE, RPCSMALLMSGSIZE); if (client == NULL) return (FALSE); parms.pm_prog = program; parms.pm_vers = version; parms.pm_prot = protocol; parms.pm_port = port; if (CLNT_CALL(client, PMAPPROC_SET, xdr_pmap, &parms, xdr_bool, &rslt, tottimeout) != RPC_SUCCESS) { int save_errno = errno; clnt_perror(client, "Cannot register service"); errno = save_errno; return (FALSE); } CLNT_DESTROY(client); if (sock != -1) (void)close(sock); return (rslt); }
/* * find the IP address that can be used to connect to the local host */ void amu_get_myaddress(struct in_addr *iap, const char *preferred_localhost) { struct hostent *hp; char dq[20]; #ifdef DEBUG_off #error this code is old and probably not useful any longer. #error Erez, Jan 21, 2004. struct sockaddr_in sin; /* * Most modern systems should use 127.0.0.1 as the localhost address over * which you can do NFS mounts. In the past we found that some NFS * clients may not allow mounts from localhost. So we used * get_myaddress() and that seemed to work. Alas, on some other systems, * get_myaddress() may return one of the interface addresses at random, * and thus use a less efficient IP address than 127.0.0.1. The solution * is to hard-code 127.0.0.1, but still check if get_myaddress() returns a * different value and warn about it. */ memset((char *) &sin, 0, sizeof(sin)); get_myaddress(&sin); if (sin.sin_addr.s_addr != htonl(INADDR_LOOPBACK)) dlog("amu_get_myaddress: myaddress conflict (0x%x vs. 0x%lx)", sin.sin_addr.s_addr, (u_long) htonl(INADDR_LOOPBACK)); #endif /* DEBUG_off */ if (preferred_localhost == NULL) goto out; /* if specified preferred locahost, then try to use it */ hp = gethostbyname(preferred_localhost); if (hp == NULL) { /* XXX: if hstrerror()/h_errno aren't portable, then need to port the next statement */ plog(XLOG_ERROR, "Unable to resolve localhost_address \"%s\" (%s): using default", preferred_localhost, hstrerror(h_errno)); goto out; } if (hp->h_addr_list == NULL) { plog(XLOG_ERROR, "localhost_address \"%s\" has no IP addresses: using default", preferred_localhost); goto out; } if (hp->h_addr_list[1] != NULL) { plog(XLOG_ERROR, "localhost_address \"%s\" has more than one IP addresses: using first", preferred_localhost); goto out; } memmove((voidp) &iap->s_addr, (voidp) hp->h_addr_list[0], sizeof(iap->s_addr)); plog(XLOG_INFO, "localhost_address \"%s\" requested, using %s", preferred_localhost, inet_dquad(dq, sizeof(dq), iap->s_addr)); return; out: iap->s_addr = htonl(INADDR_LOOPBACK); }
/* * find the IP address that can be used to connect to the local host */ void amu_get_myaddress(struct in_addr *iap) { struct sockaddr_in sin; memset((char *) &sin, 0, sizeof(sin)); get_myaddress(&sin); iap->s_addr = sin.sin_addr.s_addr; }
void hostInfo(void *itemIter, pup_er pp, CpdListItemsRequest *req) { PUP::er &p = *(PUP::er *)pp; struct sockaddr_in addr; CpdListBeginItem(pp, 0); #if CMK_HAS_GET_MYADDRESS get_myaddress(&addr); #else CmiAbort("hostInfo: get_myaddress does not work on this machine"); #endif char *address = (char*)&addr.sin_addr.s_addr; PUPv(address, 4); int pid = getpid(); PUPn(pid); }
int main(){ printf("Client\n"); struct sockaddr_in addr; get_myaddress(&addr); char* c = inet_ntoa(addr.sin_addr); strcpy(st.ip, c); printf("IP= %s\n", st.ip); st.port = addr.sin_port; printf("port = %d\n", st.port); printf("String to pass: \n"); scanf("%s",st.str); callrpc("localhost", PROGRAM_EXEC, VERSIUNE_EXEC, EXEC_MAX, (xdrproc_t)xdr_msgsnd, (char*)&st, (xdrproc_t)xdr_msgsnd, (char*)&rcv); printf("Max: %s\n", rcv.str); printf("IP : %s\n", rcv.ip); printf("Port : %d\n", rcv.port); return 0; }
int main(int argc, char **argv) { SVCXPRT *transp; struct hostent *he; struct stat buf; int c; while ((c = getopt(argc, argv,"dsr:f:")) != -1) switch (c) { case 'd': debug = 1; break; case 'r': if (isdigit((unsigned char)*optarg)) { route_addr = inet_addr(optarg); break; } else { he = gethostbyname(optarg); if (he) { bcopy(he->h_addr, (char *)&route_addr, sizeof(route_addr)); break; } else { errx(1, "no such host %s", optarg); } } case 'f': bootpfile = optarg; break; case 's': dolog = 1; #ifndef LOG_DAEMON openlog("bootparamd", 0 , 0); #else openlog("bootparamd", 0 , LOG_DAEMON); setlogmask(LOG_UPTO(LOG_NOTICE)); #endif break; default: usage(); } if ( stat(bootpfile, &buf ) ) err(1, "%s", bootpfile); if (route_addr == -1) { get_myaddress(&my_addr); bcopy(&my_addr.sin_addr.s_addr, &route_addr, sizeof (route_addr)); } if (!debug) { if (daemon(0,0)) err(1, "fork"); } pmap_unset(BOOTPARAMPROG, BOOTPARAMVERS); transp = svcudp_create(RPC_ANYSOCK); if (transp == NULL) errx(1, "cannot create udp service"); if (!svc_register(transp, BOOTPARAMPROG, BOOTPARAMVERS, bootparamprog_1, IPPROTO_UDP)) errx(1, "unable to register (BOOTPARAMPROG, BOOTPARAMVERS, udp)"); svc_run(); errx(1, "svc_run returned"); }
void setup_resolv(bool *fwding, int *child, CLIENT **client, char *tp_type, long prognum) { enum clnt_stat stat; struct timeval tv; char prog_str[15], fd_str[5]; SVCXPRT *xprt = NULL; char *tp; #ifdef TDRPC struct sockaddr_in addr; int sock; #else char name[257]; struct netconfig *nc; void *h; #endif verbose = silent == FALSE ? 1 : 0; if (! *fwding) return; #ifdef TDRPC tp = (tp_type && strcmp(tp_type, "udp") != 0) ? "udp" : "tcp"; #else /* try the specified netid (default ticots), then any loopback */ tp = (tp_type && *tp_type) ? tp_type : "ticots"; if (!getconf(tp, &h, &nc)) { /* dont forget endnetconfig() */ syslog(LOG_ERR, "can't get resolv_clnt netconf %s.\n", tp); *fwding = FALSE; return; } tp = nc->nc_netid; #endif /* * Startup the resolv server: use transient prognum if prognum * isn't set. Using transient means we create mapping then * pass child the fd to use for service. */ if (!getprognum(&prognum, &xprt, fd_str, prog_str, YPDNSVERS, tp)) { syslog(LOG_ERR, "can't create resolv xprt for transient.\n"); *fwding = FALSE; #ifndef TDRPC endnetconfig(h); #endif return; } switch (*child = vfork()) { case -1: /* error */ syslog(LOG_ERR, "can't startup resolv daemon\n"); #ifndef TDRPC endnetconfig(h); #endif *fwding = FALSE; return; case 0: /* child */ /* * if using transient we must maintain fd across * exec cause unset/set on prognum isn't automic. * * if using transient we'll just do svc_tli_create * in child on our bound fd. */ execlp(RESOLV_EXEC_PATH, "rpc.nisd_resolv", "-F", /* forground */ "-C", fd_str, /* dont close */ "-p", prog_str, /* prognum */ "-t", tp, /* tp type */ NULL); syslog(LOG_ERR, RESOLV_EXEC_ERR, strerror(errno)); exit(1); default: /* parent */ /* close fd, free xprt, but leave mapping */ if (xprt) svc_destroy(xprt); /* let it crank up before we create client */ sleep(4); } #ifdef TDRPC get_myaddress(&addr); addr.sin_port = 0; sock = RPC_ANYSOCK; tv.tv_sec = 3; tv.tv_usec = 0; if (strcmp(tp, "udp") != 0) { *client = clntudp_bufcreate(&addr, prognum, YPDNSVERS, tv, &sock, YPMSGSZ, YPMSGSZ); } else { *client = clnttcp_create(&addr, prognum, YPDNSVERS, &sock, YPMSGSZ, YPMSGSZ); } if (*client == NULL) { syslog(LOG_ERR, "can't create resolv client handle.\n"); (void) kill (*child, SIGINT); *fwding = FALSE; return; } #else if (sysinfo(SI_HOSTNAME, name, sizeof (name)-1) == -1) { syslog(LOG_ERR, "can't get local hostname.\n"); (void) kill (*child, SIGINT); endnetconfig(h); *fwding = FALSE; return; } if ((*client = clnt_tp_create(HOST_SELF_CONNECT, prognum, YPDNSVERS, nc)) == NULL) { syslog(LOG_ERR, "can't create resolv_clnt\n"); (void) kill (*child, SIGINT); endnetconfig(h); *fwding = FALSE; return; } endnetconfig(h); #endif /* ping for comfort */ tv.tv_sec = 10; tv.tv_usec = 0; if ((stat = clnt_call(*client, 0, xdr_void, 0, xdr_void, 0, tv)) != RPC_SUCCESS) { syslog(LOG_ERR, "can't talk with resolv server\n"); clnt_destroy (*client); (void) kill (*child, SIGINT); *fwding = FALSE; return; } if (verbose) syslog(LOG_INFO, "finished setup for dns fwding.\n"); }