Deleted Added
full compact
46c46
< __FBSDID("$FreeBSD: head/usr.sbin/mountd/mountd.c 150214 2005-09-16 11:24:28Z pjd $");
---
> __FBSDID("$FreeBSD: head/usr.sbin/mountd/mountd.c 158857 2006-05-23 17:10:17Z rodrigc $");
65,68d64
< #include <ufs/ufs/ufsmount.h>
< #include <fs/msdosfs/msdosfsmount.h>
< #include <fs/ntfs/ntfsmount.h>
< #include <isofs/cd9660/cd9660_mount.h> /* XXX need isofs in include */
85a82
> #include "mntopts.h"
965a963
> struct export_args export;
966a965
> struct iovec *iov;
969a969
> char errmsg[255];
970a971
> int iovlen;
971a973,974
> bzero(&export, sizeof(export));
> export.ex_flags = MNT_DELEXPORT;
973a977,979
> iov = NULL;
> iovlen = 0;
> bzero(errmsg, sizeof(errmsg));
1000a1007,1016
>
> if (num > 0) {
> build_iovec(&iov, &iovlen, "fstype", NULL, 0);
> build_iovec(&iov, &iovlen, "fspath", NULL, 0);
> build_iovec(&iov, &iovlen, "from", NULL, 0);
> build_iovec(&iov, &iovlen, "update", NULL, 0);
> build_iovec(&iov, &iovlen, "export", &export, sizeof(export));
> build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg));
> }
>
1002,1007d1017
< union {
< struct ufs_args ua;
< struct iso_args ia;
< struct msdosfs_args da;
< struct ntfs_args na;
< } targs;
1013,1018c1023,1040
< bzero(&targs, sizeof targs);
< targs.ua.fspec = NULL;
< targs.ua.export.ex_flags = MNT_DELEXPORT;
< if (mount(fsp->f_fstypename, fsp->f_mntonname,
< fsp->f_flags | MNT_UPDATE, (caddr_t)&targs) < 0 &&
< errno != ENOENT)
---
> iov[1].iov_base = fsp->f_fstypename;
> iov[1].iov_len = strlen(fsp->f_fstypename) + 1;
> iov[3].iov_base = fsp->f_mntonname;
> iov[3].iov_len = strlen(fsp->f_mntonname) + 1;
> iov[5].iov_base = fsp->f_mntfromname;
> iov[5].iov_len = strlen(fsp->f_mntfromname) + 1;
>
> /*
> * Kick out MNT_ROOTFS. It should not be passed from
> * userland to kernel. It should only be used
> * internally in the kernel.
> */
> if (fsp->f_flags & MNT_ROOTFS) {
> fsp->f_flags &= ~MNT_ROOTFS;
> }
>
> if (nmount(iov, iovlen, fsp->f_flags) < 0 &&
> errno != ENOENT) {
1020,1021c1042,1044
< "can't delete exports for %s: %m",
< fsp->f_mntonname);
---
> "can't delete exports for %s: %m %s",
> fsp->f_mntonname, errmsg);
> }
1025a1049,1062
> if (iov != NULL) {
> /* Free strings allocated by strdup() in getmntopts.c */
> free(iov[0].iov_base); /* fstype */
> free(iov[2].iov_base); /* fspath */
> free(iov[4].iov_base); /* from */
> free(iov[6].iov_base); /* update */
> free(iov[8].iov_base); /* export */
> free(iov[10].iov_base); /* errmsg */
>
> /* free iov, allocated by realloc() */
> free(iov);
> iovlen = 0;
> }
>
1028c1065
< * mount() as we go along to push the export rules into the kernel.
---
> * nmount() as we go along to push the export rules into the kernel.
1781c1818
< * Do the mount syscall with the update flag to push the export info into
---
> * Do the nmount() syscall with the update flag to push the export info into
1785,1792c1822,1823
< do_mount(ep, grp, exflags, anoncrp, dirp, dirplen, fsb)
< struct exportlist *ep;
< struct grouplist *grp;
< int exflags;
< struct xucred *anoncrp;
< char *dirp;
< int dirplen;
< struct statfs *fsb;
---
> do_mount(struct exportlist *ep, struct grouplist *grp, int exflags,
> struct xucred *anoncrp, char *dirp, int dirplen, struct statfs *fsb)
1796,1797c1827,1829
< struct export_args *eap;
< char *cp = NULL;
---
> struct export_args eap;
> char errmsg[255];
> char *cp;
1799,1805c1831,1834
< char savedc = '\0';
< union {
< struct ufs_args ua;
< struct iso_args ia;
< struct msdosfs_args da;
< struct ntfs_args na;
< } args;
---
> char savedc;
> struct iovec *iov;
> int iovlen;
> int ret;
1807,1810c1836,1840
< bzero(&args, sizeof args);
< /* XXX, we assume that all xx_args look like ufs_args. */
< args.ua.fspec = 0;
< eap = &args.ua.export;
---
> cp = NULL;
> savedc = '\0';
> iov = NULL;
> iovlen = 0;
> ret = 0;
1812,1814c1842,1846
< eap->ex_flags = exflags;
< eap->ex_anon = *anoncrp;
< eap->ex_indexfile = ep->ex_indexfile;
---
> bzero(&eap, sizeof(eap));
> bzero(errmsg, sizeof(errmsg));
> eap.ex_flags = exflags;
> eap.ex_anon = *anoncrp;
> eap.ex_indexfile = ep->ex_indexfile;
1819a1852,1859
>
> build_iovec(&iov, &iovlen, "fstype", NULL, 0);
> build_iovec(&iov, &iovlen, "fspath", NULL, 0);
> build_iovec(&iov, &iovlen, "from", NULL, 0);
> build_iovec(&iov, &iovlen, "update", NULL, 0);
> build_iovec(&iov, &iovlen, "export", &eap, sizeof(eap));
> build_iovec(&iov, &iovlen, "errmsg", errmsg, sizeof(errmsg));
>
1825,1827c1865,1867
< eap->ex_addr = ai->ai_addr;
< eap->ex_addrlen = ai->ai_addrlen;
< eap->ex_masklen = 0;
---
> eap.ex_addr = ai->ai_addr;
> eap.ex_addrlen = ai->ai_addrlen;
> eap.ex_masklen = 0;
1833c1873
< eap->ex_addr =
---
> eap.ex_addr =
1835,1836c1875,1877
< eap->ex_addrlen = args.ua.export.ex_addr->sa_len;
< eap->ex_mask =
---
> eap.ex_addrlen =
> ((struct sockaddr *)&grp->gr_ptr.gt_net.nt_net)->sa_len;
> eap.ex_mask =
1838c1879
< eap->ex_masklen = args.ua.export.ex_mask->sa_len;
---
> eap.ex_masklen = ((struct sockaddr *)&grp->gr_ptr.gt_net.nt_mask)->sa_len;
1841,1844c1882,1885
< eap->ex_addr = NULL;
< eap->ex_addrlen = 0;
< eap->ex_mask = NULL;
< eap->ex_masklen = 0;
---
> eap.ex_addr = NULL;
> eap.ex_addrlen = 0;
> eap.ex_mask = NULL;
> eap.ex_masklen = 0;
1847c1888,1889
< return(0);
---
> ret = 0;
> goto error_exit;
1853c1895,1896
< return (1);
---
> ret = 1;
> goto error_exit;
1863,1864c1906,1913
< while (mount(fsb->f_fstypename, dirp,
< fsb->f_flags | MNT_UPDATE, (caddr_t)&args) < 0) {
---
> iov[1].iov_base = fsb->f_fstypename; /* "fstype" */
> iov[1].iov_len = strlen(fsb->f_fstypename) + 1;
> iov[3].iov_base = fsb->f_mntonname; /* "fspath" */
> iov[3].iov_len = strlen(fsb->f_mntonname) + 1;
> iov[5].iov_base = fsb->f_mntfromname; /* "from" */
> iov[5].iov_len = strlen(fsb->f_mntfromname) + 1;
>
> while (nmount(iov, iovlen, 0) < 0) {
1869,1870c1918,1921
< if (opt_flags & OP_QUIET)
< return (1);
---
> if (opt_flags & OP_QUIET) {
> ret = 1;
> goto error_exit;
> }
1877c1928,1929
< return (1);
---
> ret = 1;
> goto error_exit;
1888c1940,1941
< return (1);
---
> ret = 1;
> goto error_exit;
1899c1952,1953
< return (1);
---
> ret = 1;
> goto error_exit;
1908c1962,1963
< return (1);
---
> ret = 1;
> goto error_exit;
1919c1974,1987
< return (0);
---
> error_exit:
> /* free strings allocated by strdup() in getmntopts.c */
> if (iov != NULL) {
> free(iov[0].iov_base); /* fstype */
> free(iov[2].iov_base); /* fspath */
> free(iov[4].iov_base); /* from */
> free(iov[6].iov_base); /* update */
> free(iov[8].iov_base); /* export */
> free(iov[10].iov_base); /* errmsg */
>
> /* free iov, allocated by realloc() */
> free(iov);
> }
> return (ret);