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