SVCXPRT *Svctcp_create(register int sock, u_int sendsize, u_int recvsize) { bool_t madesock = FALSE; register SVCXPRT *xprt; register struct tcp_rendezvous *r; struct sockaddr_in addr; unsigned long len = sizeof(struct sockaddr_in); if(sock == RPC_ANYSOCK) { if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) { perror("svctcp_.c - udp socket creation problem"); return ((SVCXPRT *) NULL); } madesock = TRUE; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if(bindresvport(sock, &addr)) { addr.sin_port = 0; (void)bind(sock, (struct sockaddr *)&addr, len); } if((getsockname(sock, (struct sockaddr *)&addr, (socklen_t *) & len) != 0) || (listen(sock, SOMAXCONN) != 0)) { perror("svctcp_.c - cannot getsockname or listen"); if(madesock) (void)close(sock); return ((SVCXPRT *) NULL); } r = (struct tcp_rendezvous *)Mem_Alloc(sizeof(*r)); if(r == NULL) { return (NULL); } r->sendsize = sendsize; r->recvsize = recvsize; xprt = (SVCXPRT *) Mem_Alloc(sizeof(SVCXPRT)); if(xprt == NULL) { return (NULL); } xprt->xp_p2 = NULL; xprt->xp_p1 = (caddr_t) r; xprt->xp_verf = _null_auth; xprt->xp_ops = &Svctcp_rendezvous_op; xprt->xp_port = ntohs(addr.sin_port); xprt->XP_SOCK = sock; Xprt_register(xprt); return (xprt); }
SVCXPRT *Svcudp_bufcreate(register int sock, u_int sendsz, u_int recvsz) { bool_t madesock = FALSE; register SVCXPRT *xprt; register struct Svcudp_data *su; struct sockaddr_in addr; unsigned long len = sizeof(struct sockaddr_in); if(sock == RPC_ANYSOCK) { if((sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) { perror("Svcudp_create: socket creation problem"); return ((SVCXPRT *) NULL); } madesock = TRUE; } memset(&addr, 0, sizeof(addr)); addr.sin_family = AF_INET; if(bindresvport(sock, &addr)) { addr.sin_port = 0; (void)bind(sock, (struct sockaddr *)&addr, len); } if(getsockname(sock, (struct sockaddr *)&addr, (socklen_t *) & len) != 0) { perror("Svcudp_create - cannot getsockname"); if(madesock) (void)close(sock); return ((SVCXPRT *) NULL); } xprt = (SVCXPRT *) Mem_Alloc(sizeof(SVCXPRT)); if(xprt == NULL) { return (NULL); } su = (struct Svcudp_data *)Mem_Alloc(sizeof(*su)); if(su == NULL) { return (NULL); } su->su_iosz = ((MAX(sendsz, recvsz) + 3) / 4) * 4; if((rpc_buffer(xprt) = Mem_Alloc(su->su_iosz)) == NULL) { return (NULL); } xdrmem_create(&(su->su_xdrs), rpc_buffer(xprt), su->su_iosz, XDR_DECODE); xprt->xp_p2 = (caddr_t) su; xprt->xp_verf.oa_base = su->su_verfbody; xprt->xp_ops = &Svcudp_op; xprt->xp_port = ntohs(addr.sin_port); #ifdef _FREEBSD xprt->xp_fd = sock; #else xprt->xp_sock = sock; #endif Xprt_register(xprt); return (xprt); }