mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
Sync up Urbans changes from 2.2 into HEAD.
Jeremy.
(This used to be commit d0fcd91443
)
This commit is contained in:
parent
aa567e9c75
commit
a9855dedea
@ -9,6 +9,7 @@
|
|||||||
#include "includes.h"
|
#include "includes.h"
|
||||||
|
|
||||||
#include <mntent.h>
|
#include <mntent.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
|
||||||
#include <asm/types.h>
|
#include <asm/types.h>
|
||||||
#include <asm/posix_types.h>
|
#include <asm/posix_types.h>
|
||||||
@ -30,18 +31,21 @@ static int mount_ro;
|
|||||||
static unsigned mount_fmask;
|
static unsigned mount_fmask;
|
||||||
static unsigned mount_dmask;
|
static unsigned mount_dmask;
|
||||||
static int user_mount;
|
static int user_mount;
|
||||||
|
static char *options;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
help(void)
|
help(void)
|
||||||
{
|
{
|
||||||
printf("\n");
|
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"
|
printf("-s share share name on server\n"
|
||||||
"-r mount read-only\n"
|
"-r mount read-only\n"
|
||||||
"-u uid mount as uid\n"
|
"-u uid mount as uid\n"
|
||||||
"-g gid mount as gid\n"
|
"-g gid mount as gid\n"
|
||||||
"-f mask permission mask for files\n"
|
"-f mask permission mask for files\n"
|
||||||
"-d mask permission mask for directories\n"
|
"-d mask permission mask for directories\n"
|
||||||
|
"-o options name=value, list of options\n"
|
||||||
"-h print this help text\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;
|
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)
|
switch (opt)
|
||||||
{
|
{
|
||||||
@ -76,6 +80,9 @@ parse_args(int argc, char *argv[], struct smb_mount_data *data, char **share)
|
|||||||
case 'd':
|
case 'd':
|
||||||
mount_dmask = strtol(optarg, NULL, 8);
|
mount_dmask = strtol(optarg, NULL, 8);
|
||||||
break;
|
break;
|
||||||
|
case 'o':
|
||||||
|
options = optarg;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -129,6 +136,38 @@ static int mount_ok(char *mount_point)
|
|||||||
return 0;
|
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[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char *mount_point, *share_name = NULL;
|
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_ro) flags |= MS_RDONLY;
|
||||||
|
|
||||||
if (mount(share_name, ".", "smbfs", flags, (char *)&data) < 0)
|
if (do_mount(share_name, flags, &data) < 0) {
|
||||||
{
|
|
||||||
switch (errno) {
|
switch (errno) {
|
||||||
case ENODEV:
|
case ENODEV:
|
||||||
fprintf(stderr, "ERROR: smbfs filesystem not supported by the kernel\n");
|
fprintf(stderr, "ERROR: smbfs filesystem not supported by the kernel\n");
|
||||||
|
@ -641,6 +641,7 @@ static void usage(void)
|
|||||||
"Options:
|
"Options:
|
||||||
username=<arg> SMB username
|
username=<arg> SMB username
|
||||||
password=<arg> SMB password
|
password=<arg> SMB password
|
||||||
|
credentials=<filename> file with username/password
|
||||||
netbiosname=<arg> source NetBIOS name
|
netbiosname=<arg> source NetBIOS name
|
||||||
uid=<arg> mount uid or username
|
uid=<arg> mount uid or username
|
||||||
gid=<arg> mount gid or groupname
|
gid=<arg> mount gid or groupname
|
||||||
@ -652,7 +653,9 @@ static void usage(void)
|
|||||||
workgroup=<arg> workgroup on destination
|
workgroup=<arg> workgroup on destination
|
||||||
sockopt=<arg> TCP socket options
|
sockopt=<arg> TCP socket options
|
||||||
scope=<arg> NetBIOS scope
|
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
|
guest don't prompt for a password
|
||||||
ro mount read-only
|
ro mount read-only
|
||||||
rw mount read-write
|
rw mount read-write
|
||||||
|
Loading…
Reference in New Issue
Block a user