freebsd-nq/gnu/libexec/ypxfr/yp_svc.c
Bill Paul 4b2f613d23 Rework error reporting/logging: although the SunOS documentation says
that ypxfr is supposed to log messages to /var/yp/ypxfr.log if it exists,
using syslog() makes more sense, especially since ypserv does the same
thing already. Try to use stderr by default, and use syslog() if stderr
is not a tty.

Also update the man page to reflect this change.
1995-03-31 05:45:23 +00:00

273 lines
6.4 KiB
C

#include <stdio.h>
#include <sys/types.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();
extern void Perror __P((const char *, ...));
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) {
Perror("cannot create udp service.\n");
exit(1);
}
if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, IPPROTO_UDP)) {
Perror("unable to register (YPPROG, YPVERS, udp).\n");
exit(1);
}
if (!svc_register(transp, YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, yppush_xfrrespprog_1, IPPROTO_UDP)) {
Perror("unable to register (YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, udp).\n");
exit(1);
}
if (!svc_register(transp, YPBINDPROG, YPBINDVERS, ypbindprog_2, IPPROTO_UDP)) {
Perror("unable to register (YPBINDPROG, YPBINDVERS, udp).\n");
exit(1);
}
transp = svctcp_create(RPC_ANYSOCK, 0, 0);
if (transp == NULL) {
Perror("cannot create tcp service.\n");
exit(1);
}
if (!svc_register(transp, YPPROG, YPVERS, ypprog_2, IPPROTO_TCP)) {
Perror("unable to register (YPPROG, YPVERS, tcp).\n");
exit(1);
}
if (!svc_register(transp, YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, yppush_xfrrespprog_1, IPPROTO_TCP)) {
Perror("unable to register (YPPUSH_XFRRESPPROG, YPPUSH_XFRRESPVERS, tcp).\n");
exit(1);
}
if (!svc_register(transp, YPBINDPROG, YPBINDVERS, ypbindprog_2, IPPROTO_TCP)) {
Perror("unable to register (YPBINDPROG, YPBINDVERS, tcp).\n");
exit(1);
}
svc_run();
Perror("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)) {
Perror("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)) {
Perror("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)) {
Perror("unable to free arguments\n");
exit(1);
}
}