mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-21 16:32:25 +01:00
c183a93033
This is a ported/modified version of the ypxfr program from the yps-0.21 package from the NYS project. This program is normally invoked by ypserv when it receives a yppush command from an NIS master. It can also be run from the command line to grab copies of maps when initializing a slave server. This program has been hacked in the following ways: - rpcgen'ed new yp_xdr.c, yp_svc.c and yp_clnt.c files. The old ones were rather grody. - Changed certain function names (prefended a _ to them) to avoid conflicts with certain functions lurking within libc. One major problem here is that ypxfr needs to bind to a YP master in order to work correctly, but it can't use the _yp_bind function inside libc because that function only lets you bind to a domain, not a specific host. Lots of head scratching here. - Converted from GDBM to DB at gunpoint. - Removed lots of really nasty looking DEBUG code to try to reduce clutter. - Incorporated some of the library code supplied with yps-0.21 on which ypxfr was dependent. This program still needs to be cleaned up just as a matter of principle: I get all icky just looking at it sometimes.
271 lines
6.5 KiB
C
271 lines
6.5 KiB
C
#include <stdio.h>
|
|
#include <rpc/rpc.h>
|
|
#include "yp.h"
|
|
#ifndef lint
|
|
/*static char sccsid[] = "from: @(#)yp.x 2.1 88/08/01 4.0 RPCSRC";*/
|
|
static char rcsid[] = "yp.x,v 1.1 1994/08/04 19:01:55 wollman Exp";
|
|
#endif /* not lint */
|
|
|
|
static void ypprog_2();
|
|
static void yppush_xfrrespprog_1();
|
|
static void ypbindprog_2();
|
|
|
|
main()
|
|
{
|
|
SVCXPRT *transp;
|
|
|
|
(void)pmap_unset(YPPROG, YPVERS);
|
|
(void)pmap_unset(YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS);
|
|
(void)pmap_unset(YPBINDPROG, YPBINDVERS);
|
|
|
|
transp = svcudp_create(RPC_ANYSOCK);
|
|
if (transp == NULL) {
|
|
(void)fprintf(stderr, "cannot create udp service.\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, IPPROTO_UDP)) {
|
|
(void)fprintf(stderr, "unable to register (YPPROG, YPVERS, udp).\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, yppush_xfrrespprog_1, IPPROTO_UDP)) {
|
|
(void)fprintf(stderr, "unable to register (YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, udp).\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPBINDPROG, YPBINDVERS, ypbindprog_2, IPPROTO_UDP)) {
|
|
(void)fprintf(stderr, "unable to register (YPBINDPROG, YPBINDVERS, udp).\n");
|
|
exit(1);
|
|
}
|
|
|
|
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
|
|
if (transp == NULL) {
|
|
(void)fprintf(stderr, "cannot create tcp service.\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, IPPROTO_TCP)) {
|
|
(void)fprintf(stderr, "unable to register (YPPROG, YPVERS, tcp).\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, yppush_xfrrespprog_1, IPPROTO_TCP)) {
|
|
(void)fprintf(stderr, "unable to register (YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, tcp).\n");
|
|
exit(1);
|
|
}
|
|
if (!svc_register(transp, YPBINDPROG, YPBINDVERS, ypbindprog_2, IPPROTO_TCP)) {
|
|
(void)fprintf(stderr, "unable to register (YPBINDPROG, YPBINDVERS, tcp).\n");
|
|
exit(1);
|
|
}
|
|
svc_run();
|
|
(void)fprintf(stderr, "svc_run returned\n");
|
|
exit(1);
|
|
}
|
|
|
|
static void
|
|
ypprog_2(rqstp, transp)
|
|
struct svc_req *rqstp;
|
|
SVCXPRT *transp;
|
|
{
|
|
union {
|
|
domainname ypproc_domain_2_arg;
|
|
domainname ypproc_domain_nonack_2_arg;
|
|
ypreq_key ypproc_match_2_arg;
|
|
ypreq_key ypproc_first_2_arg;
|
|
ypreq_key ypproc_next_2_arg;
|
|
ypreq_xfr ypproc_xfr_2_arg;
|
|
ypreq_nokey ypproc_all_2_arg;
|
|
ypreq_nokey ypproc_master_2_arg;
|
|
ypreq_nokey ypproc_order_2_arg;
|
|
domainname ypproc_maplist_2_arg;
|
|
} argument;
|
|
char *result;
|
|
bool_t (*xdr_argument)(), (*xdr_result)();
|
|
char *(*local)();
|
|
|
|
switch (rqstp->rq_proc) {
|
|
case YPPROC_NULL:
|
|
xdr_argument = xdr_void;
|
|
xdr_result = xdr_void;
|
|
local = (char *(*)()) ypproc_null_2;
|
|
break;
|
|
|
|
case YPPROC_DOMAIN:
|
|
xdr_argument = xdr_domainname;
|
|
xdr_result = xdr_bool;
|
|
local = (char *(*)()) ypproc_domain_2;
|
|
break;
|
|
|
|
case YPPROC_DOMAIN_NONACK:
|
|
xdr_argument = xdr_domainname;
|
|
xdr_result = xdr_bool;
|
|
local = (char *(*)()) ypproc_domain_nonack_2;
|
|
break;
|
|
|
|
case YPPROC_MATCH:
|
|
xdr_argument = xdr_ypreq_key;
|
|
xdr_result = xdr_ypresp_val;
|
|
local = (char *(*)()) ypproc_match_2;
|
|
break;
|
|
|
|
case YPPROC_FIRST:
|
|
xdr_argument = xdr_ypreq_key;
|
|
xdr_result = xdr_ypresp_key_val;
|
|
local = (char *(*)()) ypproc_first_2;
|
|
break;
|
|
|
|
case YPPROC_NEXT:
|
|
xdr_argument = xdr_ypreq_key;
|
|
xdr_result = xdr_ypresp_key_val;
|
|
local = (char *(*)()) ypproc_next_2;
|
|
break;
|
|
|
|
case YPPROC_XFR:
|
|
xdr_argument = xdr_ypreq_xfr;
|
|
xdr_result = xdr_ypresp_xfr;
|
|
local = (char *(*)()) ypproc_xfr_2;
|
|
break;
|
|
|
|
case YPPROC_CLEAR:
|
|
xdr_argument = xdr_void;
|
|
xdr_result = xdr_void;
|
|
local = (char *(*)()) ypproc_clear_2;
|
|
break;
|
|
|
|
case YPPROC_ALL:
|
|
xdr_argument = xdr_ypreq_nokey;
|
|
xdr_result = __xdr_ypresp_all;
|
|
local = (char *(*)()) ypproc_all_2;
|
|
break;
|
|
|
|
case YPPROC_MASTER:
|
|
xdr_argument = xdr_ypreq_nokey;
|
|
xdr_result = xdr_ypresp_master;
|
|
local = (char *(*)()) ypproc_master_2;
|
|
break;
|
|
|
|
case YPPROC_ORDER:
|
|
xdr_argument = xdr_ypreq_nokey;
|
|
xdr_result = xdr_ypresp_order;
|
|
local = (char *(*)()) ypproc_order_2;
|
|
break;
|
|
|
|
case YPPROC_MAPLIST:
|
|
xdr_argument = xdr_domainname;
|
|
xdr_result = xdr_ypresp_maplist;
|
|
local = (char *(*)()) ypproc_maplist_2;
|
|
break;
|
|
|
|
default:
|
|
svcerr_noproc(transp);
|
|
return;
|
|
}
|
|
bzero((char *)&argument, sizeof(argument));
|
|
if (!svc_getargs(transp, xdr_argument, &argument)) {
|
|
svcerr_decode(transp);
|
|
return;
|
|
}
|
|
result = (*local)(&argument, rqstp);
|
|
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
|
|
svcerr_systemerr(transp);
|
|
}
|
|
if (!svc_freeargs(transp, xdr_argument, &argument)) {
|
|
(void)fprintf(stderr, "unable to free arguments\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
yppush_xfrrespprog_1(rqstp, transp)
|
|
struct svc_req *rqstp;
|
|
SVCXPRT *transp;
|
|
{
|
|
union {
|
|
int fill;
|
|
} argument;
|
|
char *result;
|
|
bool_t (*xdr_argument)(), (*xdr_result)();
|
|
char *(*local)();
|
|
|
|
switch (rqstp->rq_proc) {
|
|
case YPPUSHPROC_NULL:
|
|
xdr_argument = xdr_void;
|
|
xdr_result = xdr_void;
|
|
local = (char *(*)()) yppushproc_null_1;
|
|
break;
|
|
|
|
case YPPUSHPROC_XFRRESP:
|
|
xdr_argument = xdr_void;
|
|
xdr_result = xdr_yppushresp_xfr;
|
|
local = (char *(*)()) yppushproc_xfrresp_1;
|
|
break;
|
|
|
|
default:
|
|
svcerr_noproc(transp);
|
|
return;
|
|
}
|
|
bzero((char *)&argument, sizeof(argument));
|
|
if (!svc_getargs(transp, xdr_argument, &argument)) {
|
|
svcerr_decode(transp);
|
|
return;
|
|
}
|
|
result = (*local)(&argument, rqstp);
|
|
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
|
|
svcerr_systemerr(transp);
|
|
}
|
|
if (!svc_freeargs(transp, xdr_argument, &argument)) {
|
|
(void)fprintf(stderr, "unable to free arguments\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
|
|
static void
|
|
ypbindprog_2(rqstp, transp)
|
|
struct svc_req *rqstp;
|
|
SVCXPRT *transp;
|
|
{
|
|
union {
|
|
domainname ypbindproc_domain_2_arg;
|
|
ypbind_setdom ypbindproc_setdom_2_arg;
|
|
} argument;
|
|
char *result;
|
|
bool_t (*xdr_argument)(), (*xdr_result)();
|
|
char *(*local)();
|
|
|
|
switch (rqstp->rq_proc) {
|
|
case YPBINDPROC_NULL:
|
|
xdr_argument = xdr_void;
|
|
xdr_result = xdr_void;
|
|
local = (char *(*)()) ypbindproc_null_2;
|
|
break;
|
|
|
|
case YPBINDPROC_DOMAIN:
|
|
xdr_argument = xdr_domainname;
|
|
xdr_result = xdr_ypbind_resp;
|
|
local = (char *(*)()) ypbindproc_domain_2;
|
|
break;
|
|
|
|
case YPBINDPROC_SETDOM:
|
|
xdr_argument = xdr_ypbind_setdom;
|
|
xdr_result = xdr_void;
|
|
local = (char *(*)()) ypbindproc_setdom_2;
|
|
break;
|
|
|
|
default:
|
|
svcerr_noproc(transp);
|
|
return;
|
|
}
|
|
bzero((char *)&argument, sizeof(argument));
|
|
if (!svc_getargs(transp, xdr_argument, &argument)) {
|
|
svcerr_decode(transp);
|
|
return;
|
|
}
|
|
result = (*local)(&argument, rqstp);
|
|
if (result != NULL && !svc_sendreply(transp, xdr_result, result)) {
|
|
svcerr_systemerr(transp);
|
|
}
|
|
if (!svc_freeargs(transp, xdr_argument, &argument)) {
|
|
(void)fprintf(stderr, "unable to free arguments\n");
|
|
exit(1);
|
|
}
|
|
}
|
|
|