mountd.c (51968) | mountd.c (53117) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Herb Hasler and Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 31 unchanged lines hidden (view full) --- 40 The Regents of the University of California. All rights reserved.\n"; 41#endif /*not lint*/ 42 43#ifndef lint 44#if 0 45static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95"; 46#endif 47static const char rcsid[] = | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Herb Hasler and Rick Macklem at The University of Guelph. 7 * 8 * Redistribution and use in source and binary forms, with or without --- 31 unchanged lines hidden (view full) --- 40 The Regents of the University of California. All rights reserved.\n"; 41#endif /*not lint*/ 42 43#ifndef lint 44#if 0 45static char sccsid[] = "@(#)mountd.c 8.15 (Berkeley) 5/1/95"; 46#endif 47static const char rcsid[] = |
48 "$FreeBSD: head/usr.sbin/mountd/mountd.c 51968 1999-10-06 18:20:44Z alfred $"; | 48 "$FreeBSD: head/usr.sbin/mountd/mountd.c 53117 1999-11-12 21:52:10Z billf $"; |
49#endif /*not lint*/ 50 51#include <sys/param.h> 52#include <sys/mount.h> 53#include <sys/stat.h> 54#include <sys/syslog.h> 55#include <sys/sysctl.h> 56 57#include <rpc/rpc.h> 58#include <rpc/pmap_clnt.h> | 49#endif /*not lint*/ 50 51#include <sys/param.h> 52#include <sys/mount.h> 53#include <sys/stat.h> 54#include <sys/syslog.h> 55#include <sys/sysctl.h> 56 57#include <rpc/rpc.h> 58#include <rpc/pmap_clnt.h> |
59#ifdef ISO 60#include <netiso/iso.h> 61#endif | |
62#include <nfs/rpcv2.h> 63#include <nfs/nfsproto.h> 64#include <nfs/nfs.h> 65#include <ufs/ufs/ufsmount.h> 66#include <msdosfs/msdosfsmount.h> 67#include <isofs/cd9660/cd9660_mount.h> /* XXX need isofs in include */ 68 69#include <arpa/inet.h> --- 52 unchanged lines hidden (view full) --- 122 u_int32_t nt_net; 123 u_int32_t nt_mask; 124 char *nt_name; 125}; 126 127union grouptypes { 128 struct hostent *gt_hostent; 129 struct netmsk gt_net; | 59#include <nfs/rpcv2.h> 60#include <nfs/nfsproto.h> 61#include <nfs/nfs.h> 62#include <ufs/ufs/ufsmount.h> 63#include <msdosfs/msdosfsmount.h> 64#include <isofs/cd9660/cd9660_mount.h> /* XXX need isofs in include */ 65 66#include <arpa/inet.h> --- 52 unchanged lines hidden (view full) --- 119 u_int32_t nt_net; 120 u_int32_t nt_mask; 121 char *nt_name; 122}; 123 124union grouptypes { 125 struct hostent *gt_hostent; 126 struct netmsk gt_net; |
130#ifdef ISO 131 struct sockaddr_iso *gt_isoaddr; 132#endif | |
133}; 134 135struct grouplist { 136 int gr_type; 137 union grouptypes gr_ptr; 138 struct grouplist *gr_next; 139}; 140/* Group types */ 141#define GT_NULL 0x0 142#define GT_HOST 0x1 143#define GT_NET 0x2 | 127}; 128 129struct grouplist { 130 int gr_type; 131 union grouptypes gr_ptr; 132 struct grouplist *gr_next; 133}; 134/* Group types */ 135#define GT_NULL 0x0 136#define GT_HOST 0x1 137#define GT_NET 0x2 |
144#define GT_ISO 0x4 | |
145#define GT_IGNORE 0x5 146 147struct hostlist { 148 int ht_flag; /* Uses DP_xx bits */ 149 struct grouplist *ht_grp; 150 struct hostlist *ht_next; 151}; 152 --- 35 unchanged lines hidden (view full) --- 188void hang_dirp __P((struct dirlist *, struct grouplist *, 189 struct exportlist *, int)); 190void mntsrv __P((struct svc_req *, SVCXPRT *)); 191void nextfield __P((char **, char **)); 192void out_of_mem __P((void)); 193void parsecred __P((char *, struct ucred *)); 194int put_exlist __P((struct dirlist *, XDR *, struct dirlist *, int *)); 195int scan_tree __P((struct dirlist *, u_int32_t)); | 138#define GT_IGNORE 0x5 139 140struct hostlist { 141 int ht_flag; /* Uses DP_xx bits */ 142 struct grouplist *ht_grp; 143 struct hostlist *ht_next; 144}; 145 --- 35 unchanged lines hidden (view full) --- 181void hang_dirp __P((struct dirlist *, struct grouplist *, 182 struct exportlist *, int)); 183void mntsrv __P((struct svc_req *, SVCXPRT *)); 184void nextfield __P((char **, char **)); 185void out_of_mem __P((void)); 186void parsecred __P((char *, struct ucred *)); 187int put_exlist __P((struct dirlist *, XDR *, struct dirlist *, int *)); 188int scan_tree __P((struct dirlist *, u_int32_t)); |
196void send_umntall __P((void)); 197int umntall_each __P((caddr_t, struct sockaddr_in *)); | |
198static void usage __P((void)); 199int xdr_dir __P((XDR *, char *)); 200int xdr_explist __P((XDR *, caddr_t)); 201int xdr_fhs __P((XDR *, caddr_t)); 202int xdr_mlist __P((XDR *, caddr_t)); 203 204/* C library */ 205int getnetgrent(); 206void endnetgrent(); 207void setnetgrent(); 208 | 189static void usage __P((void)); 190int xdr_dir __P((XDR *, char *)); 191int xdr_explist __P((XDR *, caddr_t)); 192int xdr_fhs __P((XDR *, caddr_t)); 193int xdr_mlist __P((XDR *, caddr_t)); 194 195/* C library */ 196int getnetgrent(); 197void endnetgrent(); 198void setnetgrent(); 199 |
209#ifdef ISO 210struct iso_addr *iso_addr(); 211#endif 212 | |
213struct exportlist *exphead; 214struct mountlist *mlhead; 215struct grouplist *grphead; 216char exname[MAXPATHLEN]; 217struct ucred def_anon = { 218 1, 219 (uid_t) -2, 220 1, --- 5 unchanged lines hidden (view full) --- 226int log = 0; 227int opt_flags; 228/* Bits for above */ 229#define OP_MAPROOT 0x01 230#define OP_MAPALL 0x02 231#define OP_KERB 0x04 232#define OP_MASK 0x08 233#define OP_NET 0x10 | 200struct exportlist *exphead; 201struct mountlist *mlhead; 202struct grouplist *grphead; 203char exname[MAXPATHLEN]; 204struct ucred def_anon = { 205 1, 206 (uid_t) -2, 207 1, --- 5 unchanged lines hidden (view full) --- 213int log = 0; 214int opt_flags; 215/* Bits for above */ 216#define OP_MAPROOT 0x01 217#define OP_MAPALL 0x02 218#define OP_KERB 0x04 219#define OP_MASK 0x08 220#define OP_NET 0x10 |
234#define OP_ISO 0x20 | |
235#define OP_ALLDIRS 0x40 236 237#ifdef DEBUG 238int debug = 1; 239void SYSLOG __P((int, const char *, ...)); 240#define syslog SYSLOG 241#else 242int debug = 0; --- 65 unchanged lines hidden (view full) --- 308 if (debug) 309 warnx("here we go"); 310 if (debug == 0) { 311 daemon(0, 0); 312 signal(SIGINT, SIG_IGN); 313 signal(SIGQUIT, SIG_IGN); 314 } 315 signal(SIGHUP, (void (*) __P((int))) get_exportlist); | 221#define OP_ALLDIRS 0x40 222 223#ifdef DEBUG 224int debug = 1; 225void SYSLOG __P((int, const char *, ...)); 226#define syslog SYSLOG 227#else 228int debug = 0; --- 65 unchanged lines hidden (view full) --- 294 if (debug) 295 warnx("here we go"); 296 if (debug == 0) { 297 daemon(0, 0); 298 signal(SIGINT, SIG_IGN); 299 signal(SIGQUIT, SIG_IGN); 300 } 301 signal(SIGHUP, (void (*) __P((int))) get_exportlist); |
316 signal(SIGTERM, (void (*) __P((int))) send_umntall); | |
317 { FILE *pidfile = fopen(_PATH_MOUNTDPID, "w"); 318 if (pidfile != NULL) { 319 fprintf(pidfile, "%d\n", getpid()); 320 fclose(pidfile); 321 } 322 } 323 if (!resvport_only) { 324 mib[0] = CTL_VFS; --- 1093 unchanged lines hidden (view full) --- 1418 opt_flags |= OP_ALLDIRS; 1419 } else if (!strcmp(cpopt, "public")) { 1420 *exflagsp |= MNT_EXPUBLIC; 1421 } else if (!strcmp(cpopt, "webnfs")) { 1422 *exflagsp |= (MNT_EXPUBLIC|MNT_EXRDONLY|MNT_EXPORTANON); 1423 opt_flags |= OP_MAPALL; 1424 } else if (cpoptarg && !strcmp(cpopt, "index")) { 1425 ep->ex_indexfile = strdup(cpoptarg); | 302 { FILE *pidfile = fopen(_PATH_MOUNTDPID, "w"); 303 if (pidfile != NULL) { 304 fprintf(pidfile, "%d\n", getpid()); 305 fclose(pidfile); 306 } 307 } 308 if (!resvport_only) { 309 mib[0] = CTL_VFS; --- 1093 unchanged lines hidden (view full) --- 1403 opt_flags |= OP_ALLDIRS; 1404 } else if (!strcmp(cpopt, "public")) { 1405 *exflagsp |= MNT_EXPUBLIC; 1406 } else if (!strcmp(cpopt, "webnfs")) { 1407 *exflagsp |= (MNT_EXPUBLIC|MNT_EXRDONLY|MNT_EXPORTANON); 1408 opt_flags |= OP_MAPALL; 1409 } else if (cpoptarg && !strcmp(cpopt, "index")) { 1410 ep->ex_indexfile = strdup(cpoptarg); |
1426#ifdef ISO 1427 } else if (cpoptarg && !strcmp(cpopt, "iso")) { 1428 if (get_isoaddr(cpoptarg, grp)) { 1429 syslog(LOG_ERR, "bad iso addr: %s", cpoptarg); 1430 return (1); 1431 } 1432 *has_hostp = 1; 1433 usedarg++; 1434 opt_flags |= OP_ISO; 1435#endif /* ISO */ | |
1436 } else { 1437 syslog(LOG_ERR, "bad opt %s", cpopt); 1438 return (1); 1439 } 1440 if (usedarg >= 0) { 1441 *endcp = savedc2; 1442 **endcpp = savedc; 1443 if (usedarg > 0) { --- 144 unchanged lines hidden (view full) --- 1588 hp = (struct hostlist *)malloc(sizeof (struct hostlist)); 1589 if (hp == (struct hostlist *)NULL) 1590 out_of_mem(); 1591 hp->ht_next = (struct hostlist *)NULL; 1592 hp->ht_flag = 0; 1593 return (hp); 1594} 1595 | 1411 } else { 1412 syslog(LOG_ERR, "bad opt %s", cpopt); 1413 return (1); 1414 } 1415 if (usedarg >= 0) { 1416 *endcp = savedc2; 1417 **endcpp = savedc; 1418 if (usedarg > 0) { --- 144 unchanged lines hidden (view full) --- 1563 hp = (struct hostlist *)malloc(sizeof (struct hostlist)); 1564 if (hp == (struct hostlist *)NULL) 1565 out_of_mem(); 1566 hp->ht_next = (struct hostlist *)NULL; 1567 hp->ht_flag = 0; 1568 return (hp); 1569} 1570 |
1596#ifdef ISO | |
1597/* | 1571/* |
1598 * Translate an iso address. 1599 */ 1600get_isoaddr(cp, grp) 1601 char *cp; 1602 struct grouplist *grp; 1603{ 1604 struct iso_addr *isop; 1605 struct sockaddr_iso *isoaddr; 1606 1607 if (grp->gr_type != GT_NULL) 1608 return (1); 1609 if ((isop = iso_addr(cp)) == NULL) { 1610 syslog(LOG_ERR, "iso_addr failed, ignored"); 1611 return (1); 1612 } 1613 isoaddr = (struct sockaddr_iso *)malloc(sizeof (struct sockaddr_iso)); 1614 if (isoaddr == (struct sockaddr_iso *)NULL) 1615 out_of_mem(); 1616 memset(isoaddr, 0, sizeof(struct sockaddr_iso)); 1617 memmove(&isoaddr->siso_addr, isop, sizeof(struct iso_addr)); 1618 isoaddr->siso_len = sizeof(struct sockaddr_iso); 1619 isoaddr->siso_family = AF_ISO; 1620 grp->gr_type = GT_ISO; 1621 grp->gr_ptr.gt_isoaddr = isoaddr; 1622 return (0); 1623} 1624#endif /* ISO */ 1625 1626/* | |
1627 * Out of memory, fatal 1628 */ 1629void 1630out_of_mem() 1631{ 1632 1633 syslog(LOG_ERR, "out of memory"); 1634 exit(2); --- 70 unchanged lines hidden (view full) --- 1705 grp->gr_ptr.gt_net.nt_mask = imask.sin_addr.s_addr; 1706 } 1707 sin.sin_addr.s_addr = grp->gr_ptr.gt_net.nt_net; 1708 args.ua.export.ex_addr = (struct sockaddr *)&sin; 1709 args.ua.export.ex_addrlen = sizeof (sin); 1710 args.ua.export.ex_mask = (struct sockaddr *)&imask; 1711 args.ua.export.ex_masklen = sizeof (imask); 1712 break; | 1572 * Out of memory, fatal 1573 */ 1574void 1575out_of_mem() 1576{ 1577 1578 syslog(LOG_ERR, "out of memory"); 1579 exit(2); --- 70 unchanged lines hidden (view full) --- 1650 grp->gr_ptr.gt_net.nt_mask = imask.sin_addr.s_addr; 1651 } 1652 sin.sin_addr.s_addr = grp->gr_ptr.gt_net.nt_net; 1653 args.ua.export.ex_addr = (struct sockaddr *)&sin; 1654 args.ua.export.ex_addrlen = sizeof (sin); 1655 args.ua.export.ex_mask = (struct sockaddr *)&imask; 1656 args.ua.export.ex_masklen = sizeof (imask); 1657 break; |
1713#ifdef ISO 1714 case GT_ISO: 1715 args.ua.export.ex_addr = 1716 (struct sockaddr *)grp->gr_ptr.gt_isoaddr; 1717 args.ua.export.ex_addrlen = 1718 sizeof(struct sockaddr_iso); 1719 args.ua.export.ex_masklen = 0; 1720 break; 1721#endif /* ISO */ | |
1722 case GT_IGNORE: 1723 return(0); 1724 break; 1725 default: 1726 syslog(LOG_ERR, "bad grouptype"); 1727 if (cp) 1728 *cp = savedc; 1729 return (1); --- 255 unchanged lines hidden (view full) --- 1985get_mountlist() 1986{ 1987 struct mountlist *mlp, **mlpp; 1988 char *host, *dirp, *cp; 1989 char str[STRSIZ]; 1990 FILE *mlfile; 1991 1992 if ((mlfile = fopen(_PATH_RMOUNTLIST, "r")) == NULL) { | 1658 case GT_IGNORE: 1659 return(0); 1660 break; 1661 default: 1662 syslog(LOG_ERR, "bad grouptype"); 1663 if (cp) 1664 *cp = savedc; 1665 return (1); --- 255 unchanged lines hidden (view full) --- 1921get_mountlist() 1922{ 1923 struct mountlist *mlp, **mlpp; 1924 char *host, *dirp, *cp; 1925 char str[STRSIZ]; 1926 FILE *mlfile; 1927 1928 if ((mlfile = fopen(_PATH_RMOUNTLIST, "r")) == NULL) { |
1993 syslog(LOG_ERR, "can't open %s", _PATH_RMOUNTLIST); 1994 return; | 1929 if (errno == ENOENT) 1930 return; 1931 else { 1932 syslog(LOG_ERR, "can't open %s", _PATH_RMOUNTLIST); 1933 return; 1934 } |
1995 } 1996 mlpp = &mlhead; 1997 while (fgets(str, STRSIZ, mlfile) != NULL) { 1998 cp = str; 1999 host = strsep(&cp, " \t\n"); 2000 dirp = strsep(&cp, " \t\n"); 2001 if (host == NULL || dirp == NULL) 2002 continue; --- 76 unchanged lines hidden (view full) --- 2079 syslog(LOG_ERR, "can't update %s", _PATH_RMOUNTLIST); 2080 return; 2081 } 2082 fprintf(mlfile, "%s %s\n", mlp->ml_host, mlp->ml_dirp); 2083 fclose(mlfile); 2084} 2085 2086/* | 1935 } 1936 mlpp = &mlhead; 1937 while (fgets(str, STRSIZ, mlfile) != NULL) { 1938 cp = str; 1939 host = strsep(&cp, " \t\n"); 1940 dirp = strsep(&cp, " \t\n"); 1941 if (host == NULL || dirp == NULL) 1942 continue; --- 76 unchanged lines hidden (view full) --- 2019 syslog(LOG_ERR, "can't update %s", _PATH_RMOUNTLIST); 2020 return; 2021 } 2022 fprintf(mlfile, "%s %s\n", mlp->ml_host, mlp->ml_dirp); 2023 fclose(mlfile); 2024} 2025 2026/* |
2087 * This function is called via. SIGTERM when the system is going down. 2088 * It sends a broadcast RPCMNT_UMNTALL. 2089 */ 2090void 2091send_umntall() 2092{ 2093 (void) clnt_broadcast(RPCPROG_MNT, RPCMNT_VER1, RPCMNT_UMNTALL, 2094 xdr_void, (caddr_t)0, xdr_void, (caddr_t)0, umntall_each); 2095 exit(0); 2096} 2097 2098int 2099umntall_each(resultsp, raddr) 2100 caddr_t resultsp; 2101 struct sockaddr_in *raddr; 2102{ 2103 return (1); 2104} 2105 2106/* | |
2107 * Free up a group list. 2108 */ 2109void 2110free_grp(grp) 2111 struct grouplist *grp; 2112{ 2113 char **addrp; 2114 --- 5 unchanged lines hidden (view full) --- 2120 free((caddr_t)grp->gr_ptr.gt_hostent->h_addr_list); 2121 free(grp->gr_ptr.gt_hostent->h_name); 2122 } 2123 free((caddr_t)grp->gr_ptr.gt_hostent); 2124 } else if (grp->gr_type == GT_NET) { 2125 if (grp->gr_ptr.gt_net.nt_name) 2126 free(grp->gr_ptr.gt_net.nt_name); 2127 } | 2027 * Free up a group list. 2028 */ 2029void 2030free_grp(grp) 2031 struct grouplist *grp; 2032{ 2033 char **addrp; 2034 --- 5 unchanged lines hidden (view full) --- 2040 free((caddr_t)grp->gr_ptr.gt_hostent->h_addr_list); 2041 free(grp->gr_ptr.gt_hostent->h_name); 2042 } 2043 free((caddr_t)grp->gr_ptr.gt_hostent); 2044 } else if (grp->gr_type == GT_NET) { 2045 if (grp->gr_ptr.gt_net.nt_name) 2046 free(grp->gr_ptr.gt_net.nt_name); 2047 } |
2128#ifdef ISO 2129 else if (grp->gr_type == GT_ISO) 2130 free((caddr_t)grp->gr_ptr.gt_isoaddr); 2131#endif | |
2132 free((caddr_t)grp); 2133} 2134 2135#ifdef DEBUG 2136void 2137SYSLOG(int pri, const char *fmt, ...) 2138{ 2139 va_list ap; --- 19 unchanged lines hidden (view full) --- 2159 (opt_flags & (OP_MAPALL | OP_KERB)) == (OP_MAPALL | OP_KERB)) { 2160 syslog(LOG_ERR, "-mapall, -maproot and -kerb mutually exclusive"); 2161 return (1); 2162 } 2163 if ((opt_flags & OP_MASK) && (opt_flags & OP_NET) == 0) { 2164 syslog(LOG_ERR, "-mask requires -net"); 2165 return (1); 2166 } | 2048 free((caddr_t)grp); 2049} 2050 2051#ifdef DEBUG 2052void 2053SYSLOG(int pri, const char *fmt, ...) 2054{ 2055 va_list ap; --- 19 unchanged lines hidden (view full) --- 2075 (opt_flags & (OP_MAPALL | OP_KERB)) == (OP_MAPALL | OP_KERB)) { 2076 syslog(LOG_ERR, "-mapall, -maproot and -kerb mutually exclusive"); 2077 return (1); 2078 } 2079 if ((opt_flags & OP_MASK) && (opt_flags & OP_NET) == 0) { 2080 syslog(LOG_ERR, "-mask requires -net"); 2081 return (1); 2082 } |
2167 if ((opt_flags & (OP_NET | OP_ISO)) == (OP_NET | OP_ISO)) { 2168 syslog(LOG_ERR, "-net and -iso mutually exclusive"); 2169 return (1); 2170 } | |
2171 if ((opt_flags & OP_ALLDIRS) && dp->dp_left) { 2172 syslog(LOG_ERR, "-alldirs has multiple directories"); 2173 return (1); 2174 } 2175 return (0); 2176} 2177 2178/* --- 42 unchanged lines hidden --- | 2083 if ((opt_flags & OP_ALLDIRS) && dp->dp_left) { 2084 syslog(LOG_ERR, "-alldirs has multiple directories"); 2085 return (1); 2086 } 2087 return (0); 2088} 2089 2090/* --- 42 unchanged lines hidden --- |