static int rpc(int argc, char *argv[]) { struct rpcent *re; int i, rv = RV_OK; setrpcent(1); if (argc == 2) { while ((re = getrpcent()) != NULL) RPCPRINT; } else { for (i = 2; i < argc; i++) { const char *err; long long id = strtonum(argv[i], 0, UINT_MAX, &err); if (!err) re = getrpcbynumber((int)id); else re = getrpcbyname(argv[i]); if (re != NULL) RPCPRINT; else { rv = RV_NOTFOUND; break; } } } endrpcent(); return rv; }
int getrpcbynumber_r(int number, struct rpcent *result_buf, char *buffer, size_t buflen, struct rpcent **result) { int ret; __UCLIBC_MUTEX_LOCK(mylock); ret = __copy_rpcent(getrpcbynumber(number), result_buf, buffer, buflen, result); __UCLIBC_MUTEX_UNLOCK(mylock); return ret; }
static void logit(int severity, struct sockaddr_in *addr, u_long procnum, u_long prognum, char *text) { char *procname; char procbuf[4 * sizeof(u_long)]; char *progname; char progbuf[4 * sizeof(u_long)]; struct rpcent *rpc; struct proc_map { u_long code; char *proc; }; struct proc_map *procp; static struct proc_map procmap[] = { { PMAPPROC_CALLIT, "callit" }, { PMAPPROC_DUMP, "dump"} , { PMAPPROC_GETPORT, "getport"} , { PMAPPROC_NULL, "null"} , { PMAPPROC_SET, "set"} , { PMAPPROC_UNSET, "unset"} , { 0, 0} , }; /* * Fork off a process or the portmap daemon might hang while * getrpcbynumber() or syslog() does its thing. */ if (fork() == 0) { /* Try to map program number to name. */ if (prognum == 0) { progname = ""; } else if ((rpc = getrpcbynumber((int) prognum))) { progname = rpc->r_name; } else { sprintf(progname = progbuf, "%lu", prognum); } /* Try to map procedure number to name. */ for (procp = procmap; procp->proc && procp->code != procnum; procp++) /* void */ ; if ((procname = procp->proc) == 0) sprintf(procname = procbuf, "%lu", (u_long) procnum); /* Write syslog record. */ syslog(severity, "connect from %s to %s(%s)%s", inet_ntoa(addr->sin_addr), procname, progname, text); exit(0); } }
struct rpcent *rpc_getrpcent(const char *prog) { struct rpcent *ent, *ret; if (isalpha(*prog)) { ent = getrpcbyname((char *)prog); } else { ent = getrpcbynumber(atoi(prog)); } if (ent == NULL) return NULL; ret = mp_malloc(sizeof(struct rpcent)); ret->r_name = mp_strdup(ent->r_name); ret->r_number = ent->r_number; return ret; }
static int rpcent_test_getrpcbynumber(struct rpcent *rpc_model, void *mdata) { struct rpcent *rpc; printf("testing getrpcbyport() with the following data...\n"); dump_rpcent(rpc_model); rpc = getrpcbynumber(rpc_model->r_number); if (rpcent_test_correctness(rpc, NULL) != 0 || (compare_rpcent(rpc, rpc_model, NULL) != 0 && rpcent_check_ambiguity((struct rpcent_test_data *)mdata, rpc) != 0)) { printf("not ok\n"); return (-1); } else { printf("ok\n"); return (0); } }
static void test_rpc (void) { struct rpcent *rptr; rptr = getrpcbyname ("portmap"); output_rpcent ("getrpcyname (\"portmap\")", rptr); rptr = getrpcbynumber (100000); output_rpcent ("getrpcbynumber (100000)", rptr); setrpcent (0); do { rptr = getrpcent (); output_rpcent ("getrpcent ()", rptr); } while (rptr != NULL); endrpcent (); }
Val _lib7_NetDB_getrpcbynum (Task* task, Val arg) { //======================= // // Mythryl type: Int -> Null_Or( (String, List(String), Int) ) // // This fn is NOWHERE INVOKED. Nor listed in src/c/lib/socket/cfun-list.h Presumably should be either called or deleted: XXX BUGGO FIXME. struct rpcent* rentry = getrpcbynumber( TAGGED_INT_TO_C_INT( arg )); if (rentry == NULL) return OPTION_NULL; Val name = make_ascii_string_from_c_string( task, rentry->r_name ); Val aliases = make_ascii_strings_from_vector_of_c_strings( task, rentry->r_aliases); Val result; REC_ALLOC3( task, result, name, aliases, TAGGED_INT_FROM_C_INT(rentry->r_number)); OPTION_THE( task, result, result); return result; }
static char * progstr(u_int32_t prog) { #if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) register struct rpcent *rp; #endif static char buf[32]; static u_int32_t lastprog = 0; if (lastprog != 0 && prog == lastprog) return (buf); #if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) rp = getrpcbynumber(prog); if (rp == NULL) #endif (void) snprintf(buf, sizeof(buf), "#%u", prog); #if defined(HAVE_GETRPCBYNUMBER) && defined(HAVE_RPC_RPC_H) else strlcpy(buf, rp->r_name, sizeof(buf)); #endif return (buf); }
int sam_initrpc( char *rpchost) { struct rpcent *rpce; char *hostname; /* Get rpcent for program number */ rpce = getrpcbyname(PROGNAME); if (!rpce) { /* Try getting the rpcent using the default program number */ rpce = getrpcbynumber(SamFS); if ((!rpce) || (strcmp(PROGNAME, rpce->r_name))) { errno = EADDRNOTAVAIL; return(-1); } } /* Get name of sam host */ if (rpchost) { hostname = rpchost; } else { if (!(hostname = getenv("SAMHOST"))) { hostname = SAMRPC_HOST; } } if (!strcmp(hostname, "localhost")) { samlocal = 1; } clnt = clnt_create(hostname, (u_long)rpce->r_number, SAMVERS, "tcp"); if (clnt == (CLIENT *)NULL) { clnt_pcreateerror(hostname); return(-1); } auth_destroy(clnt->cl_auth); clnt->cl_auth = authunix_create_default(); return(0); }
int getservport(u_long number, const char *proto) { char servdata[1024]; struct rpcent *rpcp; struct servent servbuf, *servp = NULL; int ret = 0; #if HAVE_GETRPCBYNUMBER_R char rpcdata[1024]; struct rpcent rpcbuf; ret = getrpcbynumber_r(number, &rpcbuf, rpcdata, sizeof rpcdata, &rpcp); #else rpcp = getrpcbynumber(number); #endif if (ret == 0 && rpcp != NULL) { /* First try name. */ ret = getservbyname_r(rpcp->r_name, proto, &servbuf, servdata, sizeof servdata, &servp); if ((ret != 0 || servp == NULL) && rpcp->r_aliases) { const char **a; /* Then we try aliases. */ for (a = (const char **) rpcp->r_aliases; *a != NULL; a++) { ret = getservbyname_r(*a, proto, &servbuf, servdata, sizeof servdata, &servp); if (ret == 0 && servp != NULL) break; } } } if (ret == 0 && servp != NULL) return ntohs(servp->s_port); return 0; }
int main(int argc, char **argv) { struct sockaddr_in addr; struct pmaplist *list; struct rpcent *rpc; memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr.sin_port = htons(PMAPPORT); for (list = pmap_getmaps(&addr); list; list = list->pml_next) { rpc = getrpcbynumber((int) list->pml_map.pm_prog); printf("%10lu %4lu %5s %6lu %s\n", list->pml_map.pm_prog, list->pml_map.pm_vers, protoname(list->pml_map.pm_prot), list->pml_map.pm_port, rpc ? rpc->r_name : ""); } return (fclose(stdout) ? (perror(argv[0]), 1) : 0); }
/* * rpc */ static int rpc(int argc, char *argv[]) { struct rpcent *re; unsigned long id; int i, rv; assert(argc > 1); assert(argv != NULL); #define RPCPRINT printfmtstrings(re->r_aliases, " ", " ", \ "%-16s %6d", \ re->r_name, re->r_number) setrpcent(1); rv = RV_OK; if (argc == 2) { while ((re = getrpcent()) != NULL) RPCPRINT; } else { for (i = 2; i < argc; i++) { if (parsenum(argv[i], &id)) re = getrpcbynumber((int)id); else re = getrpcbyname(argv[i]); if (re != NULL) RPCPRINT; else { rv = RV_NOTFOUND; break; } } } endrpcent(); return rv; }
/* logit - report events of interest via the syslog daemon */ void logit(int severity, struct sockaddr *addr, rpcproc_t procnum, rpcprog_t prognum, const char *text){ int size = 0; const char *procname; char procbuf[32]; char *progname; char progbuf[32]; char fromname[NI_MAXHOST]; struct rpcent *rpc; static const char *procmap[] = { /* RPCBPROC_NULL */ "null", /* RPCBPROC_SET */ "set", /* RPCBPROC_UNSET */ "unset", /* RPCBPROC_GETADDR */ "getport/addr", /* RPCBPROC_DUMP */ "dump", /* RPCBPROC_CALLIT */ "callit", /* RPCBPROC_GETTIME */ "gettime", /* RPCBPROC_UADDR2TADDR */ "uaddr2taddr", /* RPCBPROC_TADDR2UADDR */ "taddr2uaddr", /* RPCBPROC_GETVERSADDR */ "getversaddr", /* RPCBPROC_INDIRECT */ "indirect", /* RPCBPROC_GETADDRLIST */ "getaddrlist", /* RPCBPROC_GETSTAT */ "getstat" }; /* * Fork off a process or the portmap daemon might hang while * getrpcbynumber() or syslog() does its thing. */ if (fork() == 0) { /* Try to map program number to name. */ if (prognum == 0) { progname = ""; } else if ((rpc = getrpcbynumber((int) prognum))) { progname = rpc->r_name; } else { snprintf(progname = progbuf, sizeof(progbuf), "%u", (unsigned)prognum); } /* Try to map procedure number to name. */ if (procnum >= (sizeof procmap / sizeof (char *))) { snprintf(procbuf, sizeof procbuf, "%u", (unsigned)procnum); procname = procbuf; } else procname = procmap[procnum]; /* Write syslog record. */ if (addr->sa_family == AF_LOCAL) strcpy(fromname, "local"); else { switch(addr->sa_family){ case AF_INET: size=sizeof(struct sockaddr_in); break; #ifdef INET6 case AF_INET6: size=sizeof(struct sockaddr_in6); break; #endif } getnameinfo(addr,size , fromname, sizeof fromname, NULL, 0, NI_NUMERICHOST); } syslog(severity, "connect from %s to %s(%s)%s", fromname, procname, progname, text); _exit(0); } }
static char * getrpcportnam(in_port_t port, int proto) { struct sockaddr_in server_addr; struct hostent *hp; static struct pmaplist *head; int socket = RPC_ANYSOCK; struct timeval minutetimeout; CLIENT *client; struct rpcent *rpc; static int first; static struct rpcnams *rpcn; struct rpcnams *n; char num[20]; if (first == 0) { first = 1; memset(&server_addr, 0, sizeof server_addr); server_addr.sin_family = AF_INET; if ((hp = gethostbyname("localhost")) != NULL) memmove((caddr_t)&server_addr.sin_addr, hp->h_addr, hp->h_length); else (void) inet_aton("0.0.0.0", &server_addr.sin_addr); minutetimeout.tv_sec = 60; minutetimeout.tv_usec = 0; server_addr.sin_port = htons(PMAPPORT); if ((client = clnttcp_create(&server_addr, PMAPPROG, PMAPVERS, &socket, 50, 500)) == NULL) return (NULL); if (clnt_call(client, PMAPPROC_DUMP, xdr_void, NULL, xdr_pmaplist, &head, minutetimeout) != RPC_SUCCESS) { clnt_destroy(client); return (NULL); } for (; head != NULL; head = head->pml_next) { n = (struct rpcnams *)malloc(sizeof(struct rpcnams)); if (n == NULL) continue; n->next = rpcn; rpcn = n; n->port = head->pml_map.pm_port; n->proto = head->pml_map.pm_prot; rpc = getrpcbynumber(head->pml_map.pm_prog); if (rpc) n->rpcname = strdup(rpc->r_name); else { snprintf(num, sizeof num, "%ld", head->pml_map.pm_prog); n->rpcname = strdup(num); } } clnt_destroy(client); } for (n = rpcn; n; n = n->next) if (n->port == port && n->proto == proto) return (n->rpcname); return (NULL); }