xref: /freebsd/usr.sbin/rpcbind/warmstart.c (revision fa0ce29a)
18360efbdSAlfred Perlstein /*
28360efbdSAlfred Perlstein  * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
38360efbdSAlfred Perlstein  * unrestricted use provided that this legend is included on all tape
48360efbdSAlfred Perlstein  * media and as a part of the software program in whole or part.  Users
58360efbdSAlfred Perlstein  * may copy or modify Sun RPC without charge, but are not authorized
68360efbdSAlfred Perlstein  * to license or distribute it to anyone else except as part of a product or
78360efbdSAlfred Perlstein  * program developed by the user.
88360efbdSAlfred Perlstein  *
98360efbdSAlfred Perlstein  * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
108360efbdSAlfred Perlstein  * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
118360efbdSAlfred Perlstein  * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
128360efbdSAlfred Perlstein  *
138360efbdSAlfred Perlstein  * Sun RPC is provided with no support and without any obligation on the
148360efbdSAlfred Perlstein  * part of Sun Microsystems, Inc. to assist in its use, correction,
158360efbdSAlfred Perlstein  * modification or enhancement.
168360efbdSAlfred Perlstein  *
178360efbdSAlfred Perlstein  * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
188360efbdSAlfred Perlstein  * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
198360efbdSAlfred Perlstein  * OR ANY PART THEREOF.
208360efbdSAlfred Perlstein  *
218360efbdSAlfred Perlstein  * In no event will Sun Microsystems, Inc. be liable for any lost revenue
228360efbdSAlfred Perlstein  * or profits or other special, indirect and consequential damages, even if
238360efbdSAlfred Perlstein  * Sun has been advised of the possibility of such damages.
248360efbdSAlfred Perlstein  *
258360efbdSAlfred Perlstein  * Sun Microsystems, Inc.
268360efbdSAlfred Perlstein  * 2550 Garcia Avenue
278360efbdSAlfred Perlstein  * Mountain View, California  94043
288360efbdSAlfred Perlstein  */
298360efbdSAlfred Perlstein /*
308360efbdSAlfred Perlstein  * warmstart.c
318360efbdSAlfred Perlstein  * Allows for gathering of registrations from a earlier dumped file.
328360efbdSAlfred Perlstein  *
338360efbdSAlfred Perlstein  * Copyright (c) 1990 by Sun Microsystems, Inc.
348360efbdSAlfred Perlstein  */
358360efbdSAlfred Perlstein 
368360efbdSAlfred Perlstein /*
378360efbdSAlfred Perlstein  * #ident	"@(#)warmstart.c	1.7	93/07/05 SMI"
388360efbdSAlfred Perlstein  * $FreeBSD$/
398360efbdSAlfred Perlstein  */
408360efbdSAlfred Perlstein #include <sys/types.h>
418360efbdSAlfred Perlstein #include <sys/stat.h>
428360efbdSAlfred Perlstein #include <stdio.h>
438360efbdSAlfred Perlstein #include <rpc/rpc.h>
448360efbdSAlfred Perlstein #include <rpc/rpcb_prot.h>
458360efbdSAlfred Perlstein #include <rpc/xdr.h>
468360efbdSAlfred Perlstein #ifdef PORTMAP
478360efbdSAlfred Perlstein #include <netinet/in.h>
488360efbdSAlfred Perlstein #include <rpc/pmap_prot.h>
498360efbdSAlfred Perlstein #endif
508360efbdSAlfred Perlstein #include <syslog.h>
518360efbdSAlfred Perlstein #include <unistd.h>
528360efbdSAlfred Perlstein 
538360efbdSAlfred Perlstein #include "rpcbind.h"
548360efbdSAlfred Perlstein 
558360efbdSAlfred Perlstein /*
568360efbdSAlfred Perlstein  * XXX this code is unsafe and is not used. It should be made safe.
578360efbdSAlfred Perlstein  */
588360efbdSAlfred Perlstein 
598360efbdSAlfred Perlstein 
608360efbdSAlfred Perlstein /* These files keep the pmap_list and rpcb_list in XDR format */
618360efbdSAlfred Perlstein #define	RPCBFILE	"/tmp/rpcbind.file"
628360efbdSAlfred Perlstein #ifdef PORTMAP
638360efbdSAlfred Perlstein #define	PMAPFILE	"/tmp/portmap.file"
648360efbdSAlfred Perlstein #endif
658360efbdSAlfred Perlstein 
668360efbdSAlfred Perlstein static bool_t write_struct __P((char *, xdrproc_t, void *));
678360efbdSAlfred Perlstein static bool_t read_struct __P((char *, xdrproc_t, void *));
688360efbdSAlfred Perlstein 
698360efbdSAlfred Perlstein static bool_t
708360efbdSAlfred Perlstein write_struct(char *filename, xdrproc_t structproc, void *list)
718360efbdSAlfred Perlstein {
728360efbdSAlfred Perlstein 	FILE *fp;
738360efbdSAlfred Perlstein 	XDR xdrs;
748360efbdSAlfred Perlstein 	mode_t omask;
758360efbdSAlfred Perlstein 
768360efbdSAlfred Perlstein 	omask = umask(077);
778360efbdSAlfred Perlstein 	fp = fopen(filename, "w");
788360efbdSAlfred Perlstein 	if (fp == NULL) {
798360efbdSAlfred Perlstein 		int i;
808360efbdSAlfred Perlstein 
818360efbdSAlfred Perlstein 		for (i = 0; i < 10; i++)
828360efbdSAlfred Perlstein 			close(i);
838360efbdSAlfred Perlstein 		fp = fopen(filename, "w");
848360efbdSAlfred Perlstein 		if (fp == NULL) {
858360efbdSAlfred Perlstein 			syslog(LOG_ERR,
868360efbdSAlfred Perlstein 				"cannot open file = %s for writing", filename);
878360efbdSAlfred Perlstein 			syslog(LOG_ERR, "cannot save any registration");
888360efbdSAlfred Perlstein 			return (FALSE);
898360efbdSAlfred Perlstein 		}
908360efbdSAlfred Perlstein 	}
918360efbdSAlfred Perlstein 	(void) umask(omask);
928360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_ENCODE);
938360efbdSAlfred Perlstein 
948360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
958360efbdSAlfred Perlstein 		syslog(LOG_ERR, "rpcbind: xdr_%s: failed", filename);
968360efbdSAlfred Perlstein 		fclose(fp);
978360efbdSAlfred Perlstein 		return (FALSE);
988360efbdSAlfred Perlstein 	}
998360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
1008360efbdSAlfred Perlstein 	fclose(fp);
1018360efbdSAlfred Perlstein 	return (TRUE);
1028360efbdSAlfred Perlstein }
1038360efbdSAlfred Perlstein 
1048360efbdSAlfred Perlstein static bool_t
1058360efbdSAlfred Perlstein read_struct(char *filename, xdrproc_t structproc, void *list)
1068360efbdSAlfred Perlstein {
1078360efbdSAlfred Perlstein 	FILE *fp;
1088360efbdSAlfred Perlstein 	XDR xdrs;
1098360efbdSAlfred Perlstein 	struct stat sbuf;
1108360efbdSAlfred Perlstein 
1118360efbdSAlfred Perlstein 	if (stat(filename, &sbuf) != 0) {
1128360efbdSAlfred Perlstein 		fprintf(stderr,
1138360efbdSAlfred Perlstein 		"rpcbind: cannot stat file = %s for reading\n", filename);
1148360efbdSAlfred Perlstein 		goto error;
1158360efbdSAlfred Perlstein 	}
1168360efbdSAlfred Perlstein 	if ((sbuf.st_uid != 0) || (sbuf.st_mode & S_IRWXG) ||
1178360efbdSAlfred Perlstein 	    (sbuf.st_mode & S_IRWXO)) {
1188360efbdSAlfred Perlstein 		fprintf(stderr,
1198360efbdSAlfred Perlstein 		"rpcbind: invalid permissions on file = %s for reading\n",
1208360efbdSAlfred Perlstein 			filename);
1218360efbdSAlfred Perlstein 		goto error;
1228360efbdSAlfred Perlstein 	}
1238360efbdSAlfred Perlstein 	fp = fopen(filename, "r");
1248360efbdSAlfred Perlstein 	if (fp == NULL) {
1258360efbdSAlfred Perlstein 		fprintf(stderr,
1268360efbdSAlfred Perlstein 		"rpcbind: cannot open file = %s for reading\n", filename);
1278360efbdSAlfred Perlstein 		goto error;
1288360efbdSAlfred Perlstein 	}
1298360efbdSAlfred Perlstein 	xdrstdio_create(&xdrs, fp, XDR_DECODE);
1308360efbdSAlfred Perlstein 
1318360efbdSAlfred Perlstein 	if (structproc(&xdrs, list) == FALSE) {
1328360efbdSAlfred Perlstein 		fprintf(stderr, "rpcbind: xdr_%s: failed\n", filename);
1338360efbdSAlfred Perlstein 		fclose(fp);
1348360efbdSAlfred Perlstein 		goto error;
1358360efbdSAlfred Perlstein 	}
1368360efbdSAlfred Perlstein 	XDR_DESTROY(&xdrs);
1378360efbdSAlfred Perlstein 	fclose(fp);
1388360efbdSAlfred Perlstein 	return (TRUE);
1398360efbdSAlfred Perlstein 
1408360efbdSAlfred Perlstein error:	fprintf(stderr, "rpcbind: will start from scratch\n");
1418360efbdSAlfred Perlstein 	return (FALSE);
1428360efbdSAlfred Perlstein }
1438360efbdSAlfred Perlstein 
1448360efbdSAlfred Perlstein void
1458360efbdSAlfred Perlstein write_warmstart()
1468360efbdSAlfred Perlstein {
147fa0ce29aSAlfred Perlstein 	(void) write_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &list_rbl);
1488360efbdSAlfred Perlstein #ifdef PORTMAP
149fa0ce29aSAlfred Perlstein 	(void) write_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &list_pml);
1508360efbdSAlfred Perlstein #endif
1518360efbdSAlfred Perlstein 
1528360efbdSAlfred Perlstein }
1538360efbdSAlfred Perlstein 
1548360efbdSAlfred Perlstein void
1558360efbdSAlfred Perlstein read_warmstart()
1568360efbdSAlfred Perlstein {
1578360efbdSAlfred Perlstein 	rpcblist_ptr tmp_rpcbl = NULL;
1588360efbdSAlfred Perlstein #ifdef PORTMAP
1598360efbdSAlfred Perlstein 	struct pmaplist *tmp_pmapl = NULL;
1608360efbdSAlfred Perlstein #endif
1618360efbdSAlfred Perlstein 	int ok1, ok2 = TRUE;
1628360efbdSAlfred Perlstein 
163fa0ce29aSAlfred Perlstein 	ok1 = read_struct(RPCBFILE, (xdrproc_t)xdr_rpcblist_ptr, &tmp_rpcbl);
1648360efbdSAlfred Perlstein 	if (ok1 == FALSE)
1658360efbdSAlfred Perlstein 		return;
1668360efbdSAlfred Perlstein #ifdef PORTMAP
167fa0ce29aSAlfred Perlstein 	ok2 = read_struct(PMAPFILE, (xdrproc_t)xdr_pmaplist_ptr, &tmp_pmapl);
1688360efbdSAlfred Perlstein #endif
1698360efbdSAlfred Perlstein 	if (ok2 == FALSE) {
1708360efbdSAlfred Perlstein 		xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&tmp_rpcbl);
1718360efbdSAlfred Perlstein 		return;
1728360efbdSAlfred Perlstein 	}
1738360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_rpcblist_ptr, (char *)&list_rbl);
1748360efbdSAlfred Perlstein 	list_rbl = tmp_rpcbl;
1758360efbdSAlfred Perlstein #ifdef PORTMAP
1768360efbdSAlfred Perlstein 	xdr_free((xdrproc_t) xdr_pmaplist_ptr, (char *)&list_pml);
1778360efbdSAlfred Perlstein 	list_pml = tmp_pmapl;
1788360efbdSAlfred Perlstein #endif
1798360efbdSAlfred Perlstein }
180