diff options
author | wpaul <wpaul@FreeBSD.org> | 1996-06-05 04:36:55 +0000 |
---|---|---|
committer | wpaul <wpaul@FreeBSD.org> | 1996-06-05 04:36:55 +0000 |
commit | a32aea0154c407e8ffd8ad1867e028b42ceced4a (patch) | |
tree | 478102e02b168020eb0b2231ee28c8d5964c1d08 /usr.sbin/rpc.ypxfrd/ypxfrd_server.c | |
parent | 1ef72ddf2b713ea7b576e8cadc4fef53c7aff1aa (diff) | |
parent | d6af1e17162d34157b22057bc35ddbbd7d2a347b (diff) | |
download | FreeBSD-src-a32aea0154c407e8ffd8ad1867e028b42ceced4a.zip FreeBSD-src-a32aea0154c407e8ffd8ad1867e028b42ceced4a.tar.gz |
This commit was generated by cvs2svn to compensate for changes in r16125,
which included commits to RCS files with non-trunk default branches.
Diffstat (limited to 'usr.sbin/rpc.ypxfrd/ypxfrd_server.c')
-rw-r--r-- | usr.sbin/rpc.ypxfrd/ypxfrd_server.c | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/usr.sbin/rpc.ypxfrd/ypxfrd_server.c b/usr.sbin/rpc.ypxfrd/ypxfrd_server.c new file mode 100644 index 0000000..dd4fcf3 --- /dev/null +++ b/usr.sbin/rpc.ypxfrd/ypxfrd_server.c @@ -0,0 +1,130 @@ +/* + * Copyright (c) 1995, 1996 + * Bill Paul <wpaul@ctr.columbia.edu>. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Bill Paul. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: ypxfrd_server.c,v 1.5 1996/06/02 17:34:49 wpaul Exp $ + */ + +#include "ypxfrd.h" +#ifndef lint +static const char rcsid[] = "$Id: ypxfrd_server.c,v 1.5 1996/06/02 17:34:49 wpaul Exp $"; +#endif /* not lint */ + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <errno.h> +#include <sys/types.h> +#include <sys/param.h> +#include <sys/uio.h> +#include <sys/fcntl.h> +#include "ypxfrd_extern.h" + +int forked = 0; +int children = 0; +int fp = 0; + +static bool_t +xdr_my_xfr(register XDR *xdrs, xfr *objp) +{ + unsigned char buf[XFRBLOCKSIZE]; + + while(1) { + if ((objp->xfr_u.xfrblock_buf.xfrblock_buf_len = + read(fp, &buf, XFRBLOCKSIZE)) != -1) { + objp->ok = TRUE; + objp->xfr_u.xfrblock_buf.xfrblock_buf_val = (char *)&buf; + } else { + objp->ok = FALSE; + objp->xfr_u.xfrstat = XFR_READ_ERR; + yp_error("read error: %s", strerror(errno)); + } + + /* Serialize */ + if (!xdr_xfr(xdrs, objp)) + return(FALSE); + if (objp->ok == FALSE) + return(TRUE); + if (objp->xfr_u.xfrblock_buf.xfrblock_buf_len < XFRBLOCKSIZE) { + objp->ok = FALSE; + objp->xfr_u.xfrstat = XFR_DONE; + if (!xdr_xfr(xdrs, objp)) + return(FALSE); + return(TRUE); + } + } +} + +struct xfr * +ypxfrd_getmap_1_svc(ypxfr_mapname *argp, struct svc_req *rqstp) +{ + static struct xfr result; + char buf[MAXPATHLEN]; + + result.ok = FALSE; + result.xfr_u.xfrstat = XFR_DENIED; + + if (yp_validdomain(argp->xfrdomain)) { + return(&result); + } + + if (yp_access(argp->xfrmap, (struct svc_req *)rqstp)) { + return(&result); + } + + snprintf (buf, sizeof(buf), "%s/%s/%s", yp_dir, argp->xfrdomain, + argp->xfrmap); + if (access((char *)&buf, R_OK) == -1) { + result.xfr_u.xfrstat = XFR_ACCESS; + return(&result); + } +#ifndef DEBUG + if (children < MAX_CHILDREN && fork()) { + children++; + forked = 0; + return (NULL); + } else { + forked++; + } +#endif + if ((fp = open((char *)&buf, O_RDONLY)) == -1) { + result.xfr_u.xfrstat = XFR_READ_ERR; + return(&result); + } + + /* Start sending the file. */ + + svc_sendreply(rqstp->rq_xprt, xdr_my_xfr, (char *)&result); + + close(fp); + + return (NULL); +} |