Home | History | Annotate | Line # | Download | only in yp
xdryp.c revision 1.12
      1  1.12   thorpej /*	$NetBSD: xdryp.c,v 1.12 1996/05/29 20:05:50 thorpej Exp $	*/
      2   1.8       cgd 
      3   1.3   deraadt /*
      4  1.12   thorpej  * Copyright (c) 1996 Jason R. Thorpe <thorpej (at) NetBSD.ORG>.
      5  1.12   thorpej  * All rights reserved.
      6  1.12   thorpej  *
      7   1.6   deraadt  * Copyright (c) 1992, 1993 Theo de Raadt <deraadt (at) fsa.ca>
      8   1.3   deraadt  * All rights reserved.
      9   1.3   deraadt  *
     10   1.3   deraadt  * Redistribution and use in source and binary forms, with or without
     11   1.3   deraadt  * modification, are permitted provided that the following conditions
     12   1.3   deraadt  * are met:
     13   1.3   deraadt  * 1. Redistributions of source code must retain the above copyright
     14   1.3   deraadt  *    notice, this list of conditions and the following disclaimer.
     15   1.3   deraadt  * 2. Redistributions in binary form must reproduce the above copyright
     16   1.3   deraadt  *    notice, this list of conditions and the following disclaimer in the
     17   1.3   deraadt  *    documentation and/or other materials provided with the distribution.
     18   1.6   deraadt  * 3. All advertising materials mentioning features or use of this software
     19   1.6   deraadt  *    must display the following acknowledgement:
     20   1.6   deraadt  *	This product includes software developed by Theo de Raadt.
     21  1.12   thorpej  *	This product includes software developed for the NetBSD Project
     22  1.12   thorpej  *	by Jason R. Thorpe.
     23   1.6   deraadt  * 4. The name of the author may not be used to endorse or promote products
     24   1.6   deraadt  *    derived from this software without specific prior written permission.
     25   1.3   deraadt  *
     26   1.3   deraadt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
     27   1.3   deraadt  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     28   1.3   deraadt  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29   1.3   deraadt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     30   1.3   deraadt  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     31   1.3   deraadt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     32   1.3   deraadt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     33   1.3   deraadt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     34   1.3   deraadt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     35   1.3   deraadt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     36   1.3   deraadt  * SUCH DAMAGE.
     37   1.3   deraadt  */
     38   1.3   deraadt 
     39  1.10       jtc #if defined(LIBC_SCCS) && !defined(lint)
     40  1.12   thorpej static char *rcsid = "$NetBSD: xdryp.c,v 1.12 1996/05/29 20:05:50 thorpej Exp $";
     41   1.3   deraadt #endif
     42   1.3   deraadt 
     43  1.12   thorpej /*
     44  1.12   thorpej  * XDR routines used by the YP protocol.  Note that these routines do
     45  1.12   thorpej  * not strictly conform to the RPC definition in yp.x.  This file
     46  1.12   thorpej  * replicates the functions exported by the Sun YP API; reality is
     47  1.12   thorpej  * often inaccurate.
     48  1.12   thorpej  */
     49  1.12   thorpej 
     50   1.1   deraadt #include <sys/param.h>
     51   1.1   deraadt #include <sys/types.h>
     52   1.1   deraadt #include <sys/socket.h>
     53   1.1   deraadt #include <stdio.h>
     54   1.7       jtc #include <stdlib.h>
     55   1.7       jtc #include <string.h>
     56   1.1   deraadt #include <ctype.h>
     57   1.1   deraadt #include <rpc/rpc.h>
     58   1.1   deraadt #include <rpc/xdr.h>
     59   1.1   deraadt #include <rpcsvc/yp_prot.h>
     60   1.1   deraadt #include <rpcsvc/ypclnt.h>
     61   1.1   deraadt 
     62  1.12   thorpej /*
     63  1.12   thorpej  * Functions used only within this file.
     64  1.12   thorpej  */
     65  1.12   thorpej static	bool_t xdr_ypbind_binding __P((XDR *, struct ypbind_binding *));
     66  1.12   thorpej static	bool_t xdr_ypbind_resptype __P((XDR *, enum ypbind_resptype *));
     67  1.12   thorpej static	bool_t xdr_ypstat __P((XDR *, enum ypbind_resptype *));
     68  1.12   thorpej static	bool_t xdr_ypmaplist_str __P((XDR *, char *));
     69  1.12   thorpej 
     70  1.12   thorpej __warn_references(xdr_domainname,
     71  1.12   thorpej     "warning: this program uses xdr_domainname(), which is deprecated and buggy.");
     72   1.1   deraadt 
     73   1.1   deraadt bool_t
     74   1.1   deraadt xdr_domainname(xdrs, objp)
     75  1.12   thorpej 	XDR *xdrs;
     76  1.12   thorpej 	char *objp;
     77   1.1   deraadt {
     78   1.7       jtc 	return xdr_string(xdrs, &objp, YPMAXDOMAIN);
     79   1.1   deraadt }
     80   1.1   deraadt 
     81  1.12   thorpej __warn_references(xdr_peername,
     82  1.12   thorpej     "warning: this program uses xdr_peername(), which is deprecated and buggy.");
     83  1.12   thorpej 
     84   1.1   deraadt bool_t
     85   1.1   deraadt xdr_peername(xdrs, objp)
     86  1.12   thorpej 	XDR *xdrs;
     87  1.12   thorpej 	char *objp;
     88   1.1   deraadt {
     89   1.7       jtc 	return xdr_string(xdrs, &objp, YPMAXPEER);
     90   1.1   deraadt }
     91   1.1   deraadt 
     92  1.12   thorpej __warn_references(xdr_mapname,
     93  1.12   thorpej     "warning: this program uses xdr_mapname(), which is deprecated and buggy.");
     94  1.12   thorpej 
     95  1.12   thorpej bool_t
     96  1.12   thorpej xdr_mapname(xdrs, objp)
     97  1.12   thorpej 	XDR *xdrs;
     98  1.12   thorpej 	char *objp;
     99  1.12   thorpej {
    100  1.12   thorpej 	return xdr_string(xdrs, &objp, YPMAXMAP);
    101  1.12   thorpej }
    102  1.12   thorpej 
    103  1.12   thorpej bool_t
    104  1.12   thorpej xdr_ypdomain_wrap_string(xdrs, objp)
    105  1.12   thorpej 	XDR *xdrs;
    106  1.12   thorpej 	char **objp;
    107  1.12   thorpej {
    108  1.12   thorpej 	return xdr_string(xdrs, objp, YPMAXDOMAIN);
    109  1.12   thorpej }
    110  1.12   thorpej 
    111  1.12   thorpej bool_t
    112  1.12   thorpej xdr_ypmap_wrap_string(xdrs, objp)
    113  1.12   thorpej 	XDR *xdrs;
    114  1.12   thorpej 	char **objp;
    115  1.12   thorpej {
    116  1.12   thorpej 	return xdr_string(xdrs, objp, YPMAXMAP);
    117  1.12   thorpej }
    118  1.12   thorpej 
    119   1.1   deraadt bool_t
    120  1.12   thorpej xdr_ypowner_wrap_string(xdrs, objp)
    121  1.12   thorpej 	XDR *xdrs;
    122  1.12   thorpej 	char **objp;
    123   1.1   deraadt {
    124  1.12   thorpej 	return xdr_string(xdrs, objp, YPMAXPEER);
    125   1.1   deraadt }
    126   1.1   deraadt 
    127   1.1   deraadt bool_t
    128  1.12   thorpej xdr_datum(xdrs, objp)
    129  1.12   thorpej 	XDR *xdrs;
    130  1.12   thorpej 	datum *objp;
    131   1.1   deraadt {
    132  1.12   thorpej 	return xdr_bytes(xdrs, (char **)&objp->dptr,
    133  1.12   thorpej 	    (u_int *)&objp->dsize, YPMAXRECORD);
    134   1.1   deraadt }
    135   1.1   deraadt 
    136   1.1   deraadt bool_t
    137   1.1   deraadt xdr_ypreq_key(xdrs, objp)
    138  1.12   thorpej 	XDR *xdrs;
    139  1.12   thorpej 	struct ypreq_key *objp;
    140   1.1   deraadt {
    141  1.12   thorpej 	if (xdr_ypdomain_wrap_string(xdrs, (char **)&objp->domain) == FALSE)
    142   1.9  christos 		return FALSE;
    143  1.12   thorpej 
    144  1.12   thorpej 	if (xdr_ypmap_wrap_string(xdrs, (char **)&objp->map) == FALSE)
    145   1.9  christos 		return FALSE;
    146  1.12   thorpej 
    147   1.7       jtc 	return xdr_datum(xdrs, &objp->keydat);
    148   1.1   deraadt }
    149   1.1   deraadt 
    150   1.1   deraadt bool_t
    151   1.1   deraadt xdr_ypreq_nokey(xdrs, objp)
    152  1.12   thorpej 	XDR *xdrs;
    153  1.12   thorpej 	struct ypreq_nokey *objp;
    154   1.1   deraadt {
    155  1.12   thorpej 	if (xdr_ypdomain_wrap_string(xdrs, (char **)&objp->domain) == FALSE)
    156   1.9  christos 		return FALSE;
    157  1.12   thorpej 
    158  1.12   thorpej 	return xdr_ypmap_wrap_string(xdrs, (char **)&objp->map);
    159   1.1   deraadt }
    160   1.1   deraadt 
    161   1.1   deraadt bool_t
    162   1.1   deraadt xdr_yp_inaddr(xdrs, objp)
    163  1.12   thorpej 	XDR *xdrs;
    164  1.12   thorpej 	struct in_addr *objp;
    165   1.1   deraadt {
    166   1.7       jtc 	return xdr_opaque(xdrs, (caddr_t)&objp->s_addr, sizeof objp->s_addr);
    167   1.1   deraadt }
    168   1.1   deraadt 
    169  1.12   thorpej static bool_t
    170   1.1   deraadt xdr_ypbind_binding(xdrs, objp)
    171  1.12   thorpej 	XDR *xdrs;
    172  1.12   thorpej 	struct ypbind_binding *objp;
    173   1.1   deraadt {
    174  1.12   thorpej 	if (!xdr_yp_inaddr(xdrs, &objp->ypbind_binding_addr))
    175   1.9  christos 		return FALSE;
    176  1.12   thorpej 
    177   1.7       jtc 	return xdr_opaque(xdrs, (void *)&objp->ypbind_binding_port,
    178   1.7       jtc 	    sizeof objp->ypbind_binding_port);
    179   1.1   deraadt }
    180   1.1   deraadt 
    181  1.12   thorpej static bool_t
    182   1.1   deraadt xdr_ypbind_resptype(xdrs, objp)
    183  1.12   thorpej 	XDR *xdrs;
    184  1.12   thorpej 	enum ypbind_resptype *objp;
    185   1.1   deraadt {
    186   1.7       jtc 	return xdr_enum(xdrs, (enum_t *)objp);
    187   1.1   deraadt }
    188   1.1   deraadt 
    189  1.12   thorpej static bool_t
    190   1.1   deraadt xdr_ypstat(xdrs, objp)
    191  1.12   thorpej 	XDR *xdrs;
    192  1.12   thorpej 	enum ypbind_resptype *objp;
    193   1.1   deraadt {
    194   1.7       jtc 	return xdr_enum(xdrs, (enum_t *)objp);
    195   1.1   deraadt }
    196   1.1   deraadt 
    197   1.1   deraadt bool_t
    198   1.1   deraadt xdr_ypbind_resp(xdrs, objp)
    199  1.12   thorpej 	XDR *xdrs;
    200  1.12   thorpej 	struct ypbind_resp *objp;
    201   1.1   deraadt {
    202  1.12   thorpej 	if (!xdr_ypbind_resptype(xdrs, &objp->ypbind_status))
    203   1.9  christos 		return FALSE;
    204   1.9  christos 
    205   1.1   deraadt 	switch (objp->ypbind_status) {
    206   1.1   deraadt 	case YPBIND_FAIL_VAL:
    207   1.9  christos 		return xdr_u_int(xdrs,
    208  1.12   thorpej 		    (u_int *)&objp->ypbind_respbody.ypbind_error);
    209  1.12   thorpej 
    210   1.1   deraadt 	case YPBIND_SUCC_VAL:
    211  1.12   thorpej 		return xdr_ypbind_binding(xdrs,
    212  1.12   thorpej 		    &objp->ypbind_respbody.ypbind_bindinfo);
    213  1.12   thorpej 
    214   1.1   deraadt 	default:
    215   1.9  christos 		return FALSE;
    216   1.1   deraadt 	}
    217   1.7       jtc 	/* NOTREACHED */
    218   1.1   deraadt }
    219   1.1   deraadt 
    220   1.1   deraadt bool_t
    221   1.1   deraadt xdr_ypresp_val(xdrs, objp)
    222  1.12   thorpej 	XDR *xdrs;
    223  1.12   thorpej 	struct ypresp_val *objp;
    224   1.1   deraadt {
    225  1.12   thorpej 	if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)&objp->status))
    226   1.9  christos 		return FALSE;
    227  1.12   thorpej 
    228   1.7       jtc 	return xdr_datum(xdrs, &objp->valdat);
    229   1.1   deraadt }
    230   1.1   deraadt 
    231   1.1   deraadt bool_t
    232   1.1   deraadt xdr_ypbind_setdom(xdrs, objp)
    233  1.12   thorpej 	XDR *xdrs;
    234  1.12   thorpej 	struct ypbind_setdom *objp;
    235   1.1   deraadt {
    236  1.12   thorpej 	char *cp = objp->ypsetdom_domain;
    237  1.12   thorpej 
    238  1.12   thorpej 	if (xdr_ypdomain_wrap_string(xdrs, &cp))
    239   1.9  christos 		return FALSE;
    240  1.12   thorpej 
    241  1.12   thorpej 	if (!xdr_ypbind_binding(xdrs, &objp->ypsetdom_binding))
    242   1.9  christos 		return FALSE;
    243  1.12   thorpej 
    244   1.7       jtc 	return xdr_u_short(xdrs, &objp->ypsetdom_vers);
    245   1.1   deraadt }
    246   1.1   deraadt 
    247   1.1   deraadt bool_t
    248   1.1   deraadt xdr_ypresp_key_val(xdrs, objp)
    249  1.12   thorpej 	XDR *xdrs;
    250  1.12   thorpej 	struct ypresp_key_val *objp;
    251   1.1   deraadt {
    252  1.12   thorpej 	if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)&objp->status))
    253   1.9  christos 		return FALSE;
    254  1.12   thorpej 
    255  1.12   thorpej 	if (!xdr_datum(xdrs, &objp->valdat))
    256   1.9  christos 		return FALSE;
    257  1.12   thorpej 
    258   1.7       jtc 	return xdr_datum(xdrs, &objp->keydat);
    259   1.1   deraadt }
    260   1.1   deraadt 
    261   1.1   deraadt bool_t
    262  1.12   thorpej xdr_ypall(xdrs, incallback)
    263  1.12   thorpej 	XDR *xdrs;
    264  1.12   thorpej 	struct ypall_callback *incallback;
    265  1.12   thorpej {
    266  1.12   thorpej 	struct ypresp_key_val out;
    267  1.12   thorpej 	char key[YPMAXRECORD], val[YPMAXRECORD];
    268  1.12   thorpej 	bool_t more, status;
    269   1.9  christos 	int size;
    270   1.1   deraadt 	int r;
    271   1.1   deraadt 
    272  1.12   thorpej 	/*
    273  1.12   thorpej 	 * Set up key/val struct to be used during the transaction.
    274  1.12   thorpej 	 */
    275   1.7       jtc 	memset(&out, 0, sizeof out);
    276  1.12   thorpej 	out.keydat.dptr = key;
    277  1.12   thorpej 	out.keydat.dsize = sizeof(key);
    278  1.12   thorpej 	out.valdat.dptr = val;
    279  1.12   thorpej 	out.valdat.dsize = sizeof(val);
    280  1.12   thorpej 
    281  1.12   thorpej 	for (;;) {
    282  1.12   thorpej 		/* Values pending? */
    283  1.12   thorpej 		if (!xdr_bool(xdrs, &more))
    284  1.12   thorpej 			return FALSE;		/* can't tell! */
    285  1.12   thorpej 		if (more == FALSE)
    286  1.12   thorpej 			return TRUE;		/* no more */
    287  1.12   thorpej 
    288  1.12   thorpej 		/* Transfer key/value pair. */
    289  1.12   thorpej 		status = xdr_ypresp_key_val(xdrs, &out);
    290  1.12   thorpej 
    291  1.12   thorpej 		/*
    292  1.12   thorpej 		 * If we succeeded, call the callback function.
    293  1.12   thorpej 		 * The callback will return TRUE when it wants
    294  1.12   thorpej 		 * no more values.  If we fail, indicate the
    295  1.12   thorpej 		 * error.
    296  1.12   thorpej 		 */
    297  1.12   thorpej 		if (status == TRUE) {
    298  1.12   thorpej 			if ((*incallback->foreach)(out.status,
    299  1.12   thorpej 			    (char *)out.keydat.dptr, out.keydat.dsize,
    300  1.12   thorpej 			    (char *)out.valdat.dptr, out.valdat.dsize,
    301  1.12   thorpej 			    incallback->data))
    302  1.12   thorpej 				return TRUE;
    303  1.12   thorpej 		} else
    304   1.1   deraadt 			return FALSE;
    305   1.1   deraadt 	}
    306   1.1   deraadt }
    307   1.1   deraadt 
    308   1.1   deraadt bool_t
    309   1.1   deraadt xdr_ypresp_master(xdrs, objp)
    310  1.12   thorpej 	XDR *xdrs;
    311  1.12   thorpej 	struct ypresp_master *objp;
    312   1.1   deraadt {
    313  1.12   thorpej 	if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)&objp->status))
    314   1.9  christos 		return FALSE;
    315  1.12   thorpej 
    316   1.7       jtc 	return xdr_string(xdrs, &objp->master, YPMAXPEER);
    317   1.1   deraadt }
    318   1.1   deraadt 
    319  1.12   thorpej static bool_t
    320   1.1   deraadt xdr_ypmaplist_str(xdrs, objp)
    321  1.12   thorpej 	XDR *xdrs;
    322  1.12   thorpej 	char *objp;
    323   1.1   deraadt {
    324   1.7       jtc 	return xdr_string(xdrs, &objp, YPMAXMAP+1);
    325   1.1   deraadt }
    326   1.1   deraadt 
    327   1.1   deraadt bool_t
    328   1.1   deraadt xdr_ypmaplist(xdrs, objp)
    329  1.12   thorpej 	XDR *xdrs;
    330  1.12   thorpej 	struct ypmaplist *objp;
    331   1.1   deraadt {
    332  1.12   thorpej 	if (!xdr_ypmaplist_str(xdrs, objp->ypml_name))
    333   1.9  christos 		return FALSE;
    334  1.12   thorpej 
    335   1.7       jtc 	return xdr_pointer(xdrs, (caddr_t *)&objp->ypml_next,
    336   1.7       jtc 	    sizeof(struct ypmaplist), xdr_ypmaplist);
    337   1.1   deraadt }
    338   1.1   deraadt 
    339   1.1   deraadt bool_t
    340   1.1   deraadt xdr_ypresp_maplist(xdrs, objp)
    341  1.12   thorpej 	XDR *xdrs;
    342  1.12   thorpej 	struct ypresp_maplist *objp;
    343   1.1   deraadt {
    344  1.12   thorpej 	if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)&objp->status))
    345   1.9  christos 		return FALSE;
    346  1.12   thorpej 
    347   1.7       jtc 	return xdr_pointer(xdrs, (caddr_t *)&objp->list,
    348   1.7       jtc 	    sizeof(struct ypmaplist), xdr_ypmaplist);
    349   1.1   deraadt }
    350   1.1   deraadt 
    351   1.1   deraadt bool_t
    352   1.1   deraadt xdr_ypresp_order(xdrs, objp)
    353  1.12   thorpej 	XDR *xdrs;
    354  1.12   thorpej 	struct ypresp_order *objp;
    355   1.1   deraadt {
    356  1.12   thorpej 	if (!xdr_ypstat(xdrs, (enum ypbind_resptype *)&objp->status))
    357   1.9  christos 		return FALSE;
    358  1.12   thorpej 
    359   1.7       jtc 	return xdr_u_long(xdrs, &objp->ordernum);
    360  1.12   thorpej }
    361  1.12   thorpej 
    362  1.12   thorpej bool_t
    363  1.12   thorpej xdr_ypreq_xfr(xdrs, objp)
    364  1.12   thorpej 	XDR *xdrs;
    365  1.12   thorpej 	struct ypreq_xfr *objp;
    366  1.12   thorpej {
    367  1.12   thorpej 	if (xdr_ypmap_parms(xdrs, &objp->map_parms) == FALSE)
    368  1.12   thorpej 		return FALSE;
    369  1.12   thorpej 
    370  1.12   thorpej 	if (xdr_u_long(xdrs, &objp->transid) == FALSE)
    371  1.12   thorpej 		return FALSE;
    372  1.12   thorpej 
    373  1.12   thorpej 	if (xdr_u_long(xdrs, &objp->proto) == FALSE)
    374  1.12   thorpej 		return FALSE;
    375  1.12   thorpej 
    376  1.12   thorpej 	if (xdr_u_short(xdrs, &objp->port) == FALSE)
    377  1.12   thorpej 		return FALSE;
    378  1.12   thorpej 
    379  1.12   thorpej 	return TRUE;
    380  1.12   thorpej }
    381  1.12   thorpej 
    382  1.12   thorpej bool_t
    383  1.12   thorpej xdr_ypmap_parms(xdrs, objp)
    384  1.12   thorpej 	XDR *xdrs;
    385  1.12   thorpej 	struct ypmap_parms *objp;
    386  1.12   thorpej {
    387  1.12   thorpej 	if (xdr_ypdomain_wrap_string(xdrs, (char **)objp->domain) == FALSE)
    388  1.12   thorpej 		return FALSE;
    389  1.12   thorpej 
    390  1.12   thorpej 	if (xdr_ypmap_wrap_string(xdrs, (char **)objp->map) == FALSE)
    391  1.12   thorpej 		return FALSE;
    392  1.12   thorpej 
    393  1.12   thorpej 	if (xdr_u_long(xdrs, &objp->ordernum) == FALSE)
    394  1.12   thorpej 		return FALSE;
    395  1.12   thorpej 
    396  1.12   thorpej 	if (xdr_ypowner_wrap_string(xdrs, &objp->owner) == FALSE)
    397  1.12   thorpej 		return FALSE;
    398  1.12   thorpej 
    399  1.12   thorpej 	return TRUE;
    400  1.12   thorpej }
    401  1.12   thorpej 
    402  1.12   thorpej bool_t
    403  1.12   thorpej xdr_yppushresp_xfr(xdrs, objp)
    404  1.12   thorpej 	XDR *xdrs;
    405  1.12   thorpej 	struct yppushresp_xfr *objp;
    406  1.12   thorpej {
    407  1.12   thorpej 	if (xdr_u_long(xdrs, &objp->transid) == FALSE)
    408  1.12   thorpej 		return FALSE;
    409  1.12   thorpej 
    410  1.12   thorpej 	if (xdr_u_long(xdrs, &objp->status) == FALSE)
    411  1.12   thorpej 		return FALSE;
    412  1.12   thorpej 
    413  1.12   thorpej 	return TRUE;
    414   1.1   deraadt }
    415