xref: /freebsd/usr.sbin/rpcbind/warmstart.c (revision 8a16b7a1)
1a7c51fa1SHiroki Sato /*-
28a16b7a1SPedro F. Giffuni  * SPDX-License-Identifier: BSD-3-Clause
38a16b7a1SPedro F. Giffuni  *
4a7c51fa1SHiroki Sato  * Copyright (c) 2009, Sun Microsystems, Inc.
5a7c51fa1SHiroki Sato  * All rights reserved.
68360efbdSAlfred Perlstein  *
7a7c51fa1SHiroki Sato  * Redistribution and use in source and binary forms, with or without
8a7c51fa1SHiroki Sato  * modification, are permitted provided that the following conditions are met:
9a7c51fa1SHiroki Sato  * - Redistributions of source code must retain the above copyright notice,
10a7c51fa1SHiroki Sato  *   this list of conditions and the following disclaimer.
11a7c51fa1SHiroki Sato  * - Redistributions in binary form must reproduce the above copyright notice,
12a7c51fa1SHiroki Sato  *   this list of conditions and the following disclaimer in the documentation
13a7c51fa1SHiroki Sato  *   and/or other materials provided with the distribution.
14a7c51fa1SHiroki Sato  * - Neither the name of Sun Microsystems, Inc. nor the names of its
15a7c51fa1SHiroki Sato  *   contributors may be used to endorse or promote products derived
16a7c51fa1SHiroki Sato  *   from this software without specific prior written permission.
178360efbdSAlfred Perlstein  *
18a7c51fa1SHiroki Sato  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19a7c51fa1SHiroki Sato  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20a7c51fa1SHiroki Sato  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21a7c51fa1SHiroki Sato  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
22a7c51fa1SHiroki Sato  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23a7c51fa1SHiroki Sato  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24a7c51fa1SHiroki Sato  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25a7c51fa1SHiroki Sato  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26a7c51fa1SHiroki Sato  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27a7c51fa1SHiroki Sato  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28a7c51fa1SHiroki Sato  * POSSIBILITY OF SUCH DAMAGE.
298360efbdSAlfred Perlstein  */
308360efbdSAlfred Perlstein /*
318360efbdSAlfred Perlstein  * warmstart.c
329d5abbddSJens Schweikhardt  * Allows for gathering of registrations from an earlier dumped file.
338360efbdSAlfred Perlstein  *
348360efbdSAlfred Perlstein  * Copyright (c) 1990 by Sun Microsystems, Inc.
358360efbdSAlfred Perlstein  */
368360efbdSAlfred Perlstein 
378360efbdSAlfred Perlstein /*
388360efbdSAlfred Perlstein  * #ident	"@(#)warmstart.c	1.7	93/07/05 SMI"
398360efbdSAlfred Perlstein  * $FreeBSD$/
408360efbdSAlfred Perlstein  */
418360efbdSAlfred Perlstein #include <sys/types.h>
428360efbdSAlfred Perlstein #include <sys/stat.h>
438360efbdSAlfred Perlstein #include <stdio.h>
448360efbdSAlfred Perlstein #include <rpc/rpc.h>
458360efbdSAlfred Perlstein #include <rpc/rpcb_prot.h>
468360efbdSAlfred Perlstein #include <rpc/xdr.h>
478360efbdSAlfred Perlstein #ifdef PORTMAP
488360efbdSAlfred Perlstein #include <netinet/in.h>
498360efbdSAlfred Perlstein #include <rpc/pmap_prot.h>
508360efbdSAlfred Perlstein #endif
518360efbdSAlfred Perlstein #include <syslog.h>
528360efbdSAlfred Perlstein #include <unistd.h>
538360efbdSAlfred Perlstein 
548360efbdSAlfred Perlstein #include "rpcbind.h"
558360efbdSAlfred Perlstein 
568360efbdSAlfred Perlstein /*
578360efbdSAlfred Perlstein  * XXX this code is unsafe and is not used. It should be made safe.
588360efbdSAlfred Perlstein  */
598360efbdSAlfred Perlstein 
608360efbdSAlfred Perlstein 
618360efbdSAlfred Perlstein /* These files keep the pmap_list and rpcb_list in XDR format */
628360efbdSAlfred Perlstein #define	RPCBFILE	"/tmp/rpcbind.file"
638360efbdSAlfred Perlstein #ifdef PORTMAP
648360efbdSAlfred Perlstein #define	PMAPFILE	"/tmp/portmap.file"
658360efbdSAlfred Perlstein #endif
668360efbdSAlfred Perlstein 
67784bddbcSKevin Lo static bool_t write_struct(char *, xdrproc_t, void *);
68784bddbcSKevin Lo static bool_t read_struct(char *, xdrproc_t, void *);
698360efbdSAlfred Perlstein 
708360efbdSAlfred Perlstein static bool_t
718360efbdSAlfred Perlstein write_struct(char *filename, xdrproc_t structproc, void *list)
728360efbdSAlfred Perlstein {
738360efbdSAlfred Perlstein 	FILE *fp;
748360efbdSAlfred Perlstein 	XDR xdrs;
758360efbdSAlfred Perlstein 	mode_t omask;
768360efbdSAlfred Perlstein 
778360efbdSAlfred Perlstein 	omask = umask(077);
788360efbdSAlfred Perlstein 	fp = fopen(filename, "w");
798360efbdSAlfred Perlstein 	if (fp == NULL) {
808360efbdSAlfred Perlstein 		int i;
818360efbdSAlfred Perlstein 
828360efbdSAlfred Perlstein 		for (i = 0; i < 10; i++)
838360efbdSAlfred Perlstein 			close(i);
848360efbdSAlfred Perlstein 		fp = fopen(filename, "w");
858360efbdSAlfred Perlstein 		if (fp == NULL) {
868360efbdSAlfred Perlstein 			syslog(LOG_ERR,
878360efbdSAlfred Perlstein 				"cannot open file = %s for writing", filename);
888360efbdSAlfred Perlstein 			syslog(LOG_ERR, "cannot save any registration");
898360efbdSAlfred Perlstein 			return (FALSE);
908360efbdSAlfred Perlstein 		}
918360efbdSAlfred Perlstein 	}
928360efbdSAlfred Perlstein 	(void) umask(omask);
938360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_ENCODE);
948360efbdSAlfred Perlstein 
958360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
968360efbdSAlfred Perlstein 		syslog(LOG_ERR, "rpcbind: xdr_%s: failed", filename);
978360efbdSAlfred Perlstein 		fclose(fp);
988360efbdSAlfred Perlstein 		return (FALSE);
998360efbdSAlfred Perlstein 	}
1008360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
1018360efbdSAlfred Perlstein 	fclose(fp);
1028360efbdSAlfred Perlstein 	return (TRUE);
1038360efbdSAlfred Perlstein }
1048360efbdSAlfred Perlstein 
1058360efbdSAlfred Perlstein static bool_t
1068360efbdSAlfred Perlstein read_struct(char *filename, xdrproc_t structproc, void *list)
1078360efbdSAlfred Perlstein {
1088360efbdSAlfred Perlstein 	FILE *fp;
1098360efbdSAlfred Perlstein 	XDR xdrs;
1108360efbdSAlfred Perlstein 	struct stat sbuf;
1118360efbdSAlfred Perlstein 
1128360efbdSAlfred Perlstein 	if (stat(filename, &sbuf) != 0) {
1138360efbdSAlfred Perlstein 		fprintf(stderr,
1148360efbdSAlfred Perlstein 		"rpcbind: cannot stat file = %s for reading\n", filename);
1158360efbdSAlfred Perlstein 		goto error;
1168360efbdSAlfred Perlstein 	}
1178360efbdSAlfred Perlstein 	if ((sbuf.st_uid != 0) || (sbuf.st_mode & S_IRWXG) ||
1188360efbdSAlfred Perlstein 	    (sbuf.st_mode & S_IRWXO)) {
1198360efbdSAlfred Perlstein 		fprintf(stderr,
1208360efbdSAlfred Perlstein 		"rpcbind: invalid permissions on file = %s for reading\n",
1218360efbdSAlfred Perlstein 			filename);
1228360efbdSAlfred Perlstein 		goto error;
1238360efbdSAlfred Perlstein 	}
1248360efbdSAlfred Perlstein 	fp = fopen(filename, "r");
1258360efbdSAlfred Perlstein 	if (fp == NULL) {
1268360efbdSAlfred Perlstein 		fprintf(stderr,
1278360efbdSAlfred Perlstein 		"rpcbind: cannot open file = %s for reading\n", filename);
1288360efbdSAlfred Perlstein 		goto error;
1298360efbdSAlfred Perlstein 	}
1308360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_DECODE);
1318360efbdSAlfred Perlstein 
1328360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
1338360efbdSAlfred Perlstein 		fprintf(stderr, "rpcbind: xdr_%s: failed\n", filename);
1348360efbdSAlfred Perlstein 		fclose(fp);
1358360efbdSAlfred Perlstein 		goto error;
1368360efbdSAlfred Perlstein 	}
1378360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
1388360efbdSAlfred Perlstein 	fclose(fp);
1398360efbdSAlfred Perlstein 	return (TRUE);
1408360efbdSAlfred Perlstein 
1418360efbdSAlfred Perlstein error:	fprintf(stderr, "rpcbind: will start from scratch\n");
1428360efbdSAlfred Perlstein 	return (FALSE);
1438360efbdSAlfred Perlstein }
1448360efbdSAlfred Perlstein 
1458360efbdSAlfred Perlstein void
14607de1c52SXin LI write_warmstart(void)
1478360efbdSAlfred Perlstein {
148fa0ce29aSAlfred Perlstein 	(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
1498360efbdSAlfred Perlstein #ifdef PORTMAP
150fa0ce29aSAlfred Perlstein 	(void) write_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &list_pml);
1518360efbdSAlfred Perlstein #endif
1528360efbdSAlfred Perlstein 
1538360efbdSAlfred Perlstein }
1548360efbdSAlfred Perlstein 
1558360efbdSAlfred Perlstein void
15607de1c52SXin LI read_warmstart(void)
1578360efbdSAlfred Perlstein {
1588360efbdSAlfred Perlstein 	rpcblist_ptr tmp_rpcbl = NULL;
1598360efbdSAlfred Perlstein #ifdef PORTMAP
1608360efbdSAlfred Perlstein 	struct pmaplist *tmp_pmapl = NULL;
1618360efbdSAlfred Perlstein #endif
1628360efbdSAlfred Perlstein 	int ok1, ok2 = TRUE;
1638360efbdSAlfred Perlstein 
164fa0ce29aSAlfred Perlstein 	ok1 = read_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &tmp_rpcbl);
1658360efbdSAlfred Perlstein 	if (ok1 == FALSE)
1668360efbdSAlfred Perlstein 		return;
1678360efbdSAlfred Perlstein #ifdef PORTMAP
168fa0ce29aSAlfred Perlstein 	ok2 = read_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &tmp_pmapl);
1698360efbdSAlfred Perlstein #endif
1708360efbdSAlfred Perlstein 	if (ok2 == FALSE) {
1718360efbdSAlfred Perlstein 		xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&tmp_rpcbl);
1728360efbdSAlfred Perlstein 		return;
1738360efbdSAlfred Perlstein 	}
1748360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&list_rbl);
1758360efbdSAlfred Perlstein 	list_rbl = tmp_rpcbl;
1768360efbdSAlfred Perlstein #ifdef PORTMAP
1778360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_pmaplist_ptr, (char *)&list_pml);
1788360efbdSAlfred Perlstein 	list_pml = tmp_pmapl;
1798360efbdSAlfred Perlstein #endif
1808360efbdSAlfred Perlstein }
181