174462Salfred/*
274462Salfred * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
374462Salfred * unrestricted use provided that this legend is included on all tape
474462Salfred * media and as a part of the software program in whole or part.  Users
574462Salfred * may copy or modify Sun RPC without charge, but are not authorized
674462Salfred * to license or distribute it to anyone else except as part of a product or
774462Salfred * program developed by the user.
874462Salfred *
974462Salfred * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
1074462Salfred * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
1174462Salfred * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
1274462Salfred *
1374462Salfred * Sun RPC is provided with no support and without any obligation on the
1474462Salfred * part of Sun Microsystems, Inc. to assist in its use, correction,
1574462Salfred * modification or enhancement.
1674462Salfred *
1774462Salfred * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
1874462Salfred * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
1974462Salfred * OR ANY PART THEREOF.
2074462Salfred *
2174462Salfred * In no event will Sun Microsystems, Inc. be liable for any lost revenue
2274462Salfred * or profits or other special, indirect and consequential damages, even if
2374462Salfred * Sun has been advised of the possibility of such damages.
2474462Salfred *
2574462Salfred * Sun Microsystems, Inc.
2674462Salfred * 2550 Garcia Avenue
2774462Salfred * Mountain View, California  94043
2874462Salfred */
2974462Salfred/*
3074462Salfred * warmstart.c
31108533Sschweikh * Allows for gathering of registrations from an earlier dumped file.
3274462Salfred *
3374462Salfred * Copyright (c) 1990 by Sun Microsystems, Inc.
3474462Salfred */
3574462Salfred
3674462Salfred/*
3774462Salfred * #ident	"@(#)warmstart.c	1.7	93/07/05 SMI"
3874462Salfred * $FreeBSD$/
3974462Salfred */
4074462Salfred#include <sys/types.h>
4174462Salfred#include <sys/stat.h>
4274462Salfred#include <stdio.h>
4374462Salfred#include <rpc/rpc.h>
4474462Salfred#include <rpc/rpcb_prot.h>
4574462Salfred#include <rpc/xdr.h>
4674462Salfred#ifdef PORTMAP
4774462Salfred#include <netinet/in.h>
4874462Salfred#include <rpc/pmap_prot.h>
4974462Salfred#endif
5074462Salfred#include <syslog.h>
5174462Salfred#include <unistd.h>
5274462Salfred
5374462Salfred#include "rpcbind.h"
5474462Salfred
5574462Salfred/*
5674462Salfred * XXX this code is unsafe and is not used. It should be made safe.
5774462Salfred */
5874462Salfred
5974462Salfred
6074462Salfred/* These files keep the pmap_list and rpcb_list in XDR format */
6174462Salfred#define	RPCBFILE	"/tmp/rpcbind.file"
6274462Salfred#ifdef PORTMAP
6374462Salfred#define	PMAPFILE	"/tmp/portmap.file"
6474462Salfred#endif
6574462Salfred
66173412Skevlostatic bool_t write_struct(char *, xdrproc_t, void *);
67173412Skevlostatic bool_t read_struct(char *, xdrproc_t, void *);
6874462Salfred
6974462Salfredstatic bool_t
7074462Salfredwrite_struct(char *filename, xdrproc_t structproc, void *list)
7174462Salfred{
7274462Salfred	FILE *fp;
7374462Salfred	XDR xdrs;
7474462Salfred	mode_t omask;
7574462Salfred
7674462Salfred	omask = umask(077);
7774462Salfred	fp = fopen(filename, "w");
7874462Salfred	if (fp == NULL) {
7974462Salfred		int i;
8074462Salfred
8174462Salfred		for (i = 0; i < 10; i++)
8274462Salfred			close(i);
8374462Salfred		fp = fopen(filename, "w");
8474462Salfred		if (fp == NULL) {
8574462Salfred			syslog(LOG_ERR,
8674462Salfred				"cannot open file = %s for writing", filename);
8774462Salfred			syslog(LOG_ERR, "cannot save any registration");
8874462Salfred			return (FALSE);
8974462Salfred		}
9074462Salfred	}
9174462Salfred	(void) umask(omask);
9274462Salfred	xdrstdio_create(&xdrs, fp, XDR_ENCODE);
9374462Salfred
9474462Salfred	if (structproc(&xdrs, list) == FALSE) {
9574462Salfred		syslog(LOG_ERR, "rpcbind: xdr_%s: failed", filename);
9674462Salfred		fclose(fp);
9774462Salfred		return (FALSE);
9874462Salfred	}
9974462Salfred	XDR_DESTROY(&xdrs);
10074462Salfred	fclose(fp);
10174462Salfred	return (TRUE);
10274462Salfred}
10374462Salfred
10474462Salfredstatic bool_t
10574462Salfredread_struct(char *filename, xdrproc_t structproc, void *list)
10674462Salfred{
10774462Salfred	FILE *fp;
10874462Salfred	XDR xdrs;
10974462Salfred	struct stat sbuf;
11074462Salfred
11174462Salfred	if (stat(filename, &sbuf) != 0) {
11274462Salfred		fprintf(stderr,
11374462Salfred		"rpcbind: cannot stat file = %s for reading\n", filename);
11474462Salfred		goto error;
11574462Salfred	}
11674462Salfred	if ((sbuf.st_uid != 0) || (sbuf.st_mode & S_IRWXG) ||
11774462Salfred	    (sbuf.st_mode & S_IRWXO)) {
11874462Salfred		fprintf(stderr,
11974462Salfred		"rpcbind: invalid permissions on file = %s for reading\n",
12074462Salfred			filename);
12174462Salfred		goto error;
12274462Salfred	}
12374462Salfred	fp = fopen(filename, "r");
12474462Salfred	if (fp == NULL) {
12574462Salfred		fprintf(stderr,
12674462Salfred		"rpcbind: cannot open file = %s for reading\n", filename);
12774462Salfred		goto error;
12874462Salfred	}
12974462Salfred	xdrstdio_create(&xdrs, fp, XDR_DECODE);
13074462Salfred
13174462Salfred	if (structproc(&xdrs, list) == FALSE) {
13274462Salfred		fprintf(stderr, "rpcbind: xdr_%s: failed\n", filename);
13374462Salfred		fclose(fp);
13474462Salfred		goto error;
13574462Salfred	}
13674462Salfred	XDR_DESTROY(&xdrs);
13774462Salfred	fclose(fp);
13874462Salfred	return (TRUE);
13974462Salfred
14074462Salfrederror:	fprintf(stderr, "rpcbind: will start from scratch\n");
14174462Salfred	return (FALSE);
14274462Salfred}
14374462Salfred
14474462Salfredvoid
145224001Sdelphijwrite_warmstart(void)
14674462Salfred{
147104589Salfred	(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
14874462Salfred#ifdef PORTMAP
149104589Salfred	(void) write_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &list_pml);
15074462Salfred#endif
15174462Salfred
15274462Salfred}
15374462Salfred
15474462Salfredvoid
155224001Sdelphijread_warmstart(void)
15674462Salfred{
15774462Salfred	rpcblist_ptr tmp_rpcbl = NULL;
15874462Salfred#ifdef PORTMAP
15974462Salfred	struct pmaplist *tmp_pmapl = NULL;
16074462Salfred#endif
16174462Salfred	int ok1, ok2 = TRUE;
16274462Salfred
163104589Salfred	ok1 = read_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &tmp_rpcbl);
16474462Salfred	if (ok1 == FALSE)
16574462Salfred		return;
16674462Salfred#ifdef PORTMAP
167104589Salfred	ok2 = read_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &tmp_pmapl);
16874462Salfred#endif
16974462Salfred	if (ok2 == FALSE) {
17074462Salfred		xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&tmp_rpcbl);
17174462Salfred		return;
17274462Salfred	}
17374462Salfred	xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&list_rbl);
17474462Salfred	list_rbl = tmp_rpcbl;
17574462Salfred#ifdef PORTMAP
17674462Salfred	xdr_free((xdrproc_t) xdr_pmaplist_ptr, (char *)&list_pml);
17774462Salfred	list_pml = tmp_pmapl;
17874462Salfred#endif
17974462Salfred}
180