diff options
-rw-r--r-- | source3/client/smbmnt.c | 46 | ||||
-rw-r--r-- | source3/client/smbmount.c | 5 |
2 files changed, 46 insertions, 5 deletions
diff --git a/source3/client/smbmnt.c b/source3/client/smbmnt.c index b7e30c3967..209d50ab81 100644 --- a/source3/client/smbmnt.c +++ b/source3/client/smbmnt.c @@ -9,6 +9,7 @@ #include "includes.h" #include <mntent.h> +#include <sys/utsname.h> #include <asm/types.h> #include <asm/posix_types.h> @@ -30,18 +31,21 @@ static int mount_ro; static unsigned mount_fmask; static unsigned mount_dmask; static int user_mount; +static char *options; static void help(void) { printf("\n"); - printf("usage: smbmnt mount-point [options]\n"); + printf("Usage: smbmnt mount-point [options]\n"); + printf("Version %s\n\n",VERSION); printf("-s share share name on server\n" "-r mount read-only\n" "-u uid mount as uid\n" "-g gid mount as gid\n" "-f mask permission mask for files\n" "-d mask permission mask for directories\n" + "-o options name=value, list of options\n" "-h print this help text\n"); } @@ -50,7 +54,7 @@ parse_args(int argc, char *argv[], struct smb_mount_data *data, char **share) { int opt; - while ((opt = getopt (argc, argv, "s:u:g:rf:d:")) != EOF) + while ((opt = getopt (argc, argv, "s:u:g:rf:d:o:")) != EOF) { switch (opt) { @@ -76,6 +80,9 @@ parse_args(int argc, char *argv[], struct smb_mount_data *data, char **share) case 'd': mount_dmask = strtol(optarg, NULL, 8); break; + case 'o': + options = optarg; + break; default: return -1; } @@ -129,6 +136,38 @@ static int mount_ok(char *mount_point) return 0; } +/* Tries to mount using the appropriate format. For 2.2 the struct, + for 2.4 the ascii version. */ +static int +do_mount(char *share_name, unsigned int flags, struct smb_mount_data *data) +{ + pstring opts; + struct utsname uts; + char *release, *major, *minor; + char *data1, *data2; + + uname(&uts); + release = uts.release; + major = strsep(&release, "."); + minor = strsep(&release, "."); + if (major && minor && atoi(major) == 2 && atoi(minor) < 4) { + /* < 2.4, assume struct */ + data1 = (char *) data; + data2 = opts; + } else { + /* >= 2.4, assume ascii but fall back on struct */ + data1 = opts; + data2 = (char *) data; + } + + slprintf(opts, sizeof(opts), + "version=7,uid=%d,gid=%d,file_mode=0%o,dir_mode=0%o,%s", + data->uid, data->gid, data->file_mode, data->dir_mode,options); + if (mount(share_name, ".", "smbfs", flags, data1) == 0) + return 0; + return mount(share_name, ".", "smbfs", flags, data2); +} + int main(int argc, char *argv[]) { char *mount_point, *share_name = NULL; @@ -205,8 +244,7 @@ static int mount_ok(char *mount_point) if (mount_ro) flags |= MS_RDONLY; - if (mount(share_name, ".", "smbfs", flags, (char *)&data) < 0) - { + if (do_mount(share_name, flags, &data) < 0) { switch (errno) { case ENODEV: fprintf(stderr, "ERROR: smbfs filesystem not supported by the kernel\n"); diff --git a/source3/client/smbmount.c b/source3/client/smbmount.c index 3c0b132937..9b92cf261a 100644 --- a/source3/client/smbmount.c +++ b/source3/client/smbmount.c @@ -641,6 +641,7 @@ static void usage(void) "Options: username=<arg> SMB username password=<arg> SMB password + credentials=<filename> file with username/password netbiosname=<arg> source NetBIOS name uid=<arg> mount uid or username gid=<arg> mount gid or groupname @@ -652,7 +653,9 @@ static void usage(void) workgroup=<arg> workgroup on destination sockopt=<arg> TCP socket options scope=<arg> NetBIOS scope - credentials=<filename> file with username/password + iocharset=<arg> Linux charset (iso8859-1, utf8) + codepage=<arg> server codepage (cp850) + ttl=<arg> dircache time to live guest don't prompt for a password ro mount read-only rw mount read-write |