xref: /freebsd/usr.sbin/rpcbind/warmstart.c (revision 8a7b6120)
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  */
398360efbdSAlfred Perlstein #include <sys/types.h>
408360efbdSAlfred Perlstein #include <sys/stat.h>
418360efbdSAlfred Perlstein #include <stdio.h>
428360efbdSAlfred Perlstein #include <rpc/rpc.h>
438360efbdSAlfred Perlstein #include <rpc/rpcb_prot.h>
448360efbdSAlfred Perlstein #include <rpc/xdr.h>
458360efbdSAlfred Perlstein #ifdef PORTMAP
468360efbdSAlfred Perlstein #include <netinet/in.h>
478360efbdSAlfred Perlstein #include <rpc/pmap_prot.h>
488360efbdSAlfred Perlstein #endif
498360efbdSAlfred Perlstein #include <syslog.h>
508360efbdSAlfred Perlstein #include <unistd.h>
518360efbdSAlfred Perlstein 
528360efbdSAlfred Perlstein #include "rpcbind.h"
538360efbdSAlfred Perlstein 
548360efbdSAlfred Perlstein /*
558360efbdSAlfred Perlstein  * XXX this code is unsafe and is not used. It should be made safe.
568360efbdSAlfred Perlstein  */
578360efbdSAlfred Perlstein 
588360efbdSAlfred Perlstein 
598360efbdSAlfred Perlstein /* These files keep the pmap_list and rpcb_list in XDR format */
608360efbdSAlfred Perlstein #define	RPCBFILE	"/tmp/rpcbind.file"
618360efbdSAlfred Perlstein #ifdef PORTMAP
628360efbdSAlfred Perlstein #define	PMAPFILE	"/tmp/portmap.file"
638360efbdSAlfred Perlstein #endif
648360efbdSAlfred Perlstein 
65784bddbcSKevin Lo static bool_t write_struct(char *, xdrproc_t, void *);
66784bddbcSKevin Lo static bool_t read_struct(char *, xdrproc_t, void *);
678360efbdSAlfred Perlstein 
688360efbdSAlfred Perlstein static bool_t
write_struct(char * filename,xdrproc_t structproc,void * list)698360efbdSAlfred Perlstein write_struct(char *filename, xdrproc_t structproc, void *list)
708360efbdSAlfred Perlstein {
718360efbdSAlfred Perlstein 	FILE *fp;
728360efbdSAlfred Perlstein 	XDR xdrs;
738360efbdSAlfred Perlstein 	mode_t omask;
748360efbdSAlfred Perlstein 
758360efbdSAlfred Perlstein 	omask = umask(077);
768360efbdSAlfred Perlstein 	fp = fopen(filename, "w");
778360efbdSAlfred Perlstein 	if (fp == NULL) {
788360efbdSAlfred Perlstein 		int i;
798360efbdSAlfred Perlstein 
808360efbdSAlfred Perlstein 		for (i = 0; i < 10; i++)
818360efbdSAlfred Perlstein 			close(i);
828360efbdSAlfred Perlstein 		fp = fopen(filename, "w");
838360efbdSAlfred Perlstein 		if (fp == NULL) {
848360efbdSAlfred Perlstein 			syslog(LOG_ERR,
858360efbdSAlfred Perlstein 				"cannot open file = %s for writing", filename);
868360efbdSAlfred Perlstein 			syslog(LOG_ERR, "cannot save any registration");
878360efbdSAlfred Perlstein 			return (FALSE);
888360efbdSAlfred Perlstein 		}
898360efbdSAlfred Perlstein 	}
908360efbdSAlfred Perlstein 	(void) umask(omask);
918360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_ENCODE);
928360efbdSAlfred Perlstein 
938360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
948360efbdSAlfred Perlstein 		syslog(LOG_ERR, "rpcbind: xdr_%s: failed", filename);
958360efbdSAlfred Perlstein 		fclose(fp);
968360efbdSAlfred Perlstein 		return (FALSE);
978360efbdSAlfred Perlstein 	}
988360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
998360efbdSAlfred Perlstein 	fclose(fp);
1008360efbdSAlfred Perlstein 	return (TRUE);
1018360efbdSAlfred Perlstein }
1028360efbdSAlfred Perlstein 
1038360efbdSAlfred Perlstein static bool_t
read_struct(char * filename,xdrproc_t structproc,void * list)1048360efbdSAlfred Perlstein read_struct(char *filename, xdrproc_t structproc, void *list)
1058360efbdSAlfred Perlstein {
1068360efbdSAlfred Perlstein 	FILE *fp;
1078360efbdSAlfred Perlstein 	XDR xdrs;
1088360efbdSAlfred Perlstein 	struct stat sbuf;
1098360efbdSAlfred Perlstein 
1108360efbdSAlfred Perlstein 	if (stat(filename, &sbuf) != 0) {
1118360efbdSAlfred Perlstein 		fprintf(stderr,
1128360efbdSAlfred Perlstein 		"rpcbind: cannot stat file = %s for reading\n", filename);
1138360efbdSAlfred Perlstein 		goto error;
1148360efbdSAlfred Perlstein 	}
1158360efbdSAlfred Perlstein 	if ((sbuf.st_uid != 0) || (sbuf.st_mode & S_IRWXG) ||
1168360efbdSAlfred Perlstein 	    (sbuf.st_mode & S_IRWXO)) {
1178360efbdSAlfred Perlstein 		fprintf(stderr,
1188360efbdSAlfred Perlstein 		"rpcbind: invalid permissions on file = %s for reading\n",
1198360efbdSAlfred Perlstein 			filename);
1208360efbdSAlfred Perlstein 		goto error;
1218360efbdSAlfred Perlstein 	}
1228360efbdSAlfred Perlstein 	fp = fopen(filename, "r");
1238360efbdSAlfred Perlstein 	if (fp == NULL) {
1248360efbdSAlfred Perlstein 		fprintf(stderr,
1258360efbdSAlfred Perlstein 		"rpcbind: cannot open file = %s for reading\n", filename);
1268360efbdSAlfred Perlstein 		goto error;
1278360efbdSAlfred Perlstein 	}
1288360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_DECODE);
1298360efbdSAlfred Perlstein 
1308360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
1318360efbdSAlfred Perlstein 		fprintf(stderr, "rpcbind: xdr_%s: failed\n", filename);
1328360efbdSAlfred Perlstein 		fclose(fp);
1338360efbdSAlfred Perlstein 		goto error;
1348360efbdSAlfred Perlstein 	}
1358360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
1368360efbdSAlfred Perlstein 	fclose(fp);
1378360efbdSAlfred Perlstein 	return (TRUE);
1388360efbdSAlfred Perlstein 
1398360efbdSAlfred Perlstein error:	fprintf(stderr, "rpcbind: will start from scratch\n");
1408360efbdSAlfred Perlstein 	return (FALSE);
1418360efbdSAlfred Perlstein }
1428360efbdSAlfred Perlstein 
1438360efbdSAlfred Perlstein void
write_warmstart(void)14407de1c52SXin LI write_warmstart(void)
1458360efbdSAlfred Perlstein {
146fa0ce29aSAlfred Perlstein 	(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
1478360efbdSAlfred Perlstein #ifdef PORTMAP
148fa0ce29aSAlfred Perlstein 	(void) write_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &list_pml);
1498360efbdSAlfred Perlstein #endif
1508360efbdSAlfred Perlstein 
1518360efbdSAlfred Perlstein }
1528360efbdSAlfred Perlstein 
1538360efbdSAlfred Perlstein void
read_warmstart(void)15407de1c52SXin LI read_warmstart(void)
1558360efbdSAlfred Perlstein {
1568360efbdSAlfred Perlstein 	rpcblist_ptr tmp_rpcbl = NULL;
1578360efbdSAlfred Perlstein #ifdef PORTMAP
1588360efbdSAlfred Perlstein 	struct pmaplist *tmp_pmapl = NULL;
1598360efbdSAlfred Perlstein #endif
1608360efbdSAlfred Perlstein 	int ok1, ok2 = TRUE;
1618360efbdSAlfred Perlstein 
162fa0ce29aSAlfred Perlstein 	ok1 = read_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &tmp_rpcbl);
1638360efbdSAlfred Perlstein 	if (ok1 == FALSE)
1648360efbdSAlfred Perlstein 		return;
1658360efbdSAlfred Perlstein #ifdef PORTMAP
166fa0ce29aSAlfred Perlstein 	ok2 = read_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &tmp_pmapl);
1678360efbdSAlfred Perlstein #endif
1688360efbdSAlfred Perlstein 	if (ok2 == FALSE) {
1698360efbdSAlfred Perlstein 		xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&tmp_rpcbl);
1708360efbdSAlfred Perlstein 		return;
1718360efbdSAlfred Perlstein 	}
1728360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&list_rbl);
1738360efbdSAlfred Perlstein 	list_rbl = tmp_rpcbl;
1748360efbdSAlfred Perlstein #ifdef PORTMAP
1758360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_pmaplist_ptr, (char *)&list_pml);
1768360efbdSAlfred Perlstein 	list_pml = tmp_pmapl;
1778360efbdSAlfred Perlstein #endif
1788360efbdSAlfred Perlstein }
179