diff options
author | sheldonh <sheldonh@FreeBSD.org> | 2001-12-14 11:06:03 +0000 |
---|---|---|
committer | sheldonh <sheldonh@FreeBSD.org> | 2001-12-14 11:06:03 +0000 |
commit | 4e260b134ff188548ec2c8a16a37570a4abf1257 (patch) | |
tree | 672d7786f89ed3b67f221098cb86cf0bc53ad5e3 /contrib/smbfs/mount_smbfs/mount_smbfs.c | |
download | FreeBSD-src-4e260b134ff188548ec2c8a16a37570a4abf1257.zip FreeBSD-src-4e260b134ff188548ec2c8a16a37570a4abf1257.tar.gz |
Import smbfs-1.4.1.
This is Boris Popov's SMB/CIFS file system implementation for FreeBSD.
Obtained from: Boris Popov via ftp://ftp.butya.kz/pub/smbfs/
Diffstat (limited to 'contrib/smbfs/mount_smbfs/mount_smbfs.c')
-rw-r--r-- | contrib/smbfs/mount_smbfs/mount_smbfs.c | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/contrib/smbfs/mount_smbfs/mount_smbfs.c b/contrib/smbfs/mount_smbfs/mount_smbfs.c new file mode 100644 index 0000000..3122bc4 --- /dev/null +++ b/contrib/smbfs/mount_smbfs/mount_smbfs.c @@ -0,0 +1,265 @@ +/* + * Copyright (c) 2000-2001, Boris Popov + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Boris Popov. + * 4. Neither the name of the author nor the names of any co-contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $Id: mount_smbfs.c,v 1.13 2001/04/16 12:46:46 bp Exp $ + */ +#include <sys/param.h> +#include <sys/stat.h> +#include <sys/errno.h> +#include <sys/mount.h> + +#include <stdio.h> +#include <string.h> +#include <pwd.h> +#include <grp.h> +#include <unistd.h> +#include <ctype.h> +#include <stdlib.h> +#include <err.h> +#include <sysexits.h> + +#include <cflib.h> + +#include <netsmb/smb.h> +#include <netsmb/smb_conn.h> +#include <netsmb/smb_lib.h> + +#include <fs/smbfs/smbfs.h> + +#include "mntopts.h" + +static char mount_point[MAXPATHLEN + 1]; +static void usage(void); + +static struct mntopt mopts[] = { + MOPT_STDOPTS, + { NULL } +}; + + +int +main(int argc, char *argv[]) +{ + struct smb_ctx sctx, *ctx = &sctx; + struct smbfs_args mdata; + struct stat st; + struct vfsconf vfc; + char *next; + int opt, error, mntflags, caseopt; + + if (argc == 2) { + if (strcmp(argv[1], "-h") == 0) { + usage(); + } else if (strcmp(argv[1], "-v") == 0) { + errx(EX_OK, "version %d.%d.%d", SMBFS_VERSION / 100000, + (SMBFS_VERSION % 10000) / 1000, + (SMBFS_VERSION % 1000) / 100); + } + } + if (argc < 3) + usage(); + + error = getvfsbyname(SMBFS_VFSNAME, &vfc); + if (error && vfsisloadable(SMBFS_VFSNAME)) { + if(vfsload(SMBFS_VFSNAME)) + err(EX_OSERR, "vfsload("SMBFS_VFSNAME")"); + endvfsent(); + error = getvfsbyname(SMBFS_VFSNAME, &vfc); + } + if (error) + errx(EX_OSERR, "SMB filesystem is not available"); + + if (smb_lib_init() != 0) + exit(1); + + mntflags = error = 0; + bzero(&mdata, sizeof(mdata)); + mdata.uid = mdata.gid = -1; + caseopt = SMB_CS_NONE; + + if (smb_ctx_init(ctx, argc, argv, SMBL_SHARE, SMBL_SHARE, SMB_ST_DISK) != 0) + exit(1); + if (smb_ctx_readrc(ctx) != 0) + exit(1); + if (smb_rc) + rc_close(smb_rc); + + while ((opt = getopt(argc, argv, STDPARAM_OPT"c:d:f:g:l:n:o:u:w:")) != -1) { + switch (opt) { + case STDPARAM_ARGS: + error = smb_ctx_opt(ctx, opt, optarg); + if (error) + exit(1); + break; + case 'u': { + struct passwd *pwd; + + pwd = isdigit(optarg[0]) ? + getpwuid(atoi(optarg)) : getpwnam(optarg); + if (pwd == NULL) + errx(EX_NOUSER, "unknown user '%s'", optarg); + mdata.uid = pwd->pw_uid; + break; + } + case 'g': { + struct group *grp; + + grp = isdigit(optarg[0]) ? + getgrgid(atoi(optarg)) : getgrnam(optarg); + if (grp == NULL) + errx(EX_NOUSER, "unknown group '%s'", optarg); + mdata.gid = grp->gr_gid; + break; + } + case 'd': + errno = 0; + mdata.dir_mode = strtol(optarg, &next, 8); + if (errno || *next != 0) + errx(EX_DATAERR, "invalid value for directory mode"); + break; + case 'f': + errno = 0; + mdata.file_mode = strtol(optarg, &next, 8); + if (errno || *next != 0) + errx(EX_DATAERR, "invalid value for file mode"); + break; + case '?': + usage(); + /*NOTREACHED*/ + case 'n': { + char *inp, *nsp; + + nsp = inp = optarg; + while ((nsp = strsep(&inp, ",;:")) != NULL) { + if (strcasecmp(nsp, "LONG") == 0) + mdata.flags |= SMBFS_MOUNT_NO_LONG; + else + errx(EX_DATAERR, "unknown suboption '%s'", nsp); + } + break; + }; + case 'o': + getmntopts(optarg, mopts, &mntflags, 0); + break; + case 'c': + switch (optarg[0]) { + case 'l': + caseopt |= SMB_CS_LOWER; + break; + case 'u': + caseopt |= SMB_CS_UPPER; + break; + default: + errx(EX_DATAERR, "invalid suboption '%c' for -c", + optarg[0]); + } + break; + default: + usage(); + } + } + + if (optind == argc - 2) + optind++; + + if (optind != argc - 1) + usage(); + realpath(argv[optind], mount_point); + + if (stat(mount_point, &st) == -1) + err(EX_OSERR, "could not find mount point %s", mount_point); + if (!S_ISDIR(st.st_mode)) { + errno = ENOTDIR; + err(EX_OSERR, "can't mount on %s", mount_point); + } +/* + if (smb_getextattr(mount_point, &einfo) == 0) + errx(EX_OSERR, "can't mount on %s twice", mount_point); +*/ + if (mdata.uid == -1) + mdata.uid = st.st_uid; + if (mdata.gid == -1) + mdata.gid = st.st_gid; + if (mdata.file_mode == 0 ) + mdata.file_mode = st.st_mode & (S_IRWXU | S_IRWXG | S_IRWXO); + if (mdata.dir_mode == 0) { + mdata.dir_mode = mdata.file_mode; + if (mdata.dir_mode & S_IRUSR) + mdata.dir_mode |= S_IXUSR; + if (mdata.dir_mode & S_IRGRP) + mdata.dir_mode |= S_IXGRP; + if (mdata.dir_mode & S_IROTH) + mdata.dir_mode |= S_IXOTH; + } + /* + * For now, let connection be private for this mount + */ + ctx->ct_ssn.ioc_opt |= SMBVOPT_PRIVATE; + ctx->ct_ssn.ioc_owner = ctx->ct_sh.ioc_owner = 0; /* root */ + ctx->ct_ssn.ioc_group = ctx->ct_sh.ioc_group = mdata.gid; + opt = 0; + if (mdata.dir_mode & S_IXGRP) + opt |= SMBM_EXECGRP; + if (mdata.dir_mode & S_IXOTH) + opt |= SMBM_EXECOTH; + ctx->ct_ssn.ioc_rights |= opt; + ctx->ct_sh.ioc_rights |= opt; + error = smb_ctx_resolve(ctx); + if (error) + exit(1); + error = smb_ctx_lookup(ctx, SMBL_SHARE, SMBLK_CREATE); + if (error) { + exit(1); + } + strcpy(mdata.mount_point,mount_point); + mdata.version = SMBFS_VERSION; + mdata.dev = ctx->ct_fd; + mdata.caseopt = caseopt; + error = mount(SMBFS_VFSNAME, mdata.mount_point, mntflags, (void*)&mdata); + smb_ctx_done(ctx); + if (error) { + smb_error("mount error: %s", error, mdata.mount_point); + exit(1); + } + return 0; +} + +static void +usage(void) +{ + fprintf(stderr, "%s\n%s\n%s\n%s\n", + "usage: mount_smbfs [-Chv] [-U user] [-connection options]", + " [-M mode] [-c case] [-d mode] [-f mode]", + " [-g gid] [-l locale] [-n os2] [-u uid] [-w scheme]", + " /user@server/share node"); + + exit (1); +} |