1*a7c51fa1SHiroki Sato /*- 2*a7c51fa1SHiroki Sato * Copyright (c) 2009, Sun Microsystems, Inc. 3*a7c51fa1SHiroki Sato * All rights reserved. 48360efbdSAlfred Perlstein * 5*a7c51fa1SHiroki Sato * Redistribution and use in source and binary forms, with or without 6*a7c51fa1SHiroki Sato * modification, are permitted provided that the following conditions are met: 7*a7c51fa1SHiroki Sato * - Redistributions of source code must retain the above copyright notice, 8*a7c51fa1SHiroki Sato * this list of conditions and the following disclaimer. 9*a7c51fa1SHiroki Sato * - Redistributions in binary form must reproduce the above copyright notice, 10*a7c51fa1SHiroki Sato * this list of conditions and the following disclaimer in the documentation 11*a7c51fa1SHiroki Sato * and/or other materials provided with the distribution. 12*a7c51fa1SHiroki Sato * - Neither the name of Sun Microsystems, Inc. nor the names of its 13*a7c51fa1SHiroki Sato * contributors may be used to endorse or promote products derived 14*a7c51fa1SHiroki Sato * from this software without specific prior written permission. 158360efbdSAlfred Perlstein * 16*a7c51fa1SHiroki Sato * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 17*a7c51fa1SHiroki Sato * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*a7c51fa1SHiroki Sato * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*a7c51fa1SHiroki Sato * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 20*a7c51fa1SHiroki Sato * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 21*a7c51fa1SHiroki Sato * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 22*a7c51fa1SHiroki Sato * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 23*a7c51fa1SHiroki Sato * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 24*a7c51fa1SHiroki Sato * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 25*a7c51fa1SHiroki Sato * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 26*a7c51fa1SHiroki Sato * POSSIBILITY OF SUCH DAMAGE. 278360efbdSAlfred Perlstein */ 288360efbdSAlfred Perlstein /* 298360efbdSAlfred Perlstein * warmstart.c 309d5abbddSJens Schweikhardt * Allows for gathering of registrations from an earlier dumped file. 318360efbdSAlfred Perlstein * 328360efbdSAlfred Perlstein * Copyright (c) 1990 by Sun Microsystems, Inc. 338360efbdSAlfred Perlstein */ 348360efbdSAlfred Perlstein 358360efbdSAlfred Perlstein /* 368360efbdSAlfred Perlstein * #ident "@(#)warmstart.c 1.7 93/07/05 SMI" 378360efbdSAlfred Perlstein * $FreeBSD$/ 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 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 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 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 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