1a7c51fa1SHiroki Sato /*-
2*8a16b7a1SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause
3*8a16b7a1SPedro 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