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