Deleted Added
full compact
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 ---