1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-22 13:34:15 +03:00

examples: Add smb2mount

This is an incomplete playground to add a fuse client based on
the Samba-internal libsmb interfaces.

There's a few fuse smb clients out there, but they all suffer from
Samba not exporting the async internal libsmb interfaces.

We don't export those with an API, because we believe we need the ability
to mess with those interfaces. This is an attempt to create a fully
asynchronous user-space fuse client file system that might make it
easier to mess with fancy SMB features than it would be possible in
a kernel client.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Ralph Böhme <slow@samba.org>
This commit is contained in:
Volker Lendecke 2016-10-12 15:02:45 +02:00 committed by Jeremy Allison
parent 857745655b
commit 3b97211d18
8 changed files with 1698 additions and 0 deletions

7
examples/fuse/README Normal file
View File

@ -0,0 +1,7 @@
WARNING:
This is experimental work-in-progress code, don't expect it to do
anything sensible.
Eventually this *might* turn into a fuse client filesystem. This is
not a promise for anything.

1473
examples/fuse/clifuse.c Normal file

File diff suppressed because it is too large Load Diff

27
examples/fuse/clifuse.h Normal file
View File

@ -0,0 +1,27 @@
/*
* Unix SMB/CIFS implementation.
* fusermount smb2 client
* Copyright (C) Volker Lendecke 2016
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __EXAMPLES_FUSE_CLIFUSE_H__
#define __EXAMPLES_FUSE_CLIFUSE_H__
struct cli_state;
int do_mount(struct cli_state *cli, const char *mountpoint);
#endif

167
examples/fuse/smb2mount.c Normal file
View File

@ -0,0 +1,167 @@
/*
* Unix SMB/CIFS implementation.
* fusermount smb2 client
*
* Copyright (C) Volker Lendecke 2016
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "source3/include/includes.h"
#include "popt.h"
#include "popt_common.h"
#include "client.h"
#include "libsmb/proto.h"
#include "clifuse.h"
static struct cli_state *connect_one(struct user_auth_info *auth_info,
const char *server, const char *share)
{
struct cli_state *c = NULL;
NTSTATUS nt_status;
uint32_t flags = 0;
if (get_cmdline_auth_info_use_kerberos(auth_info)) {
flags |= CLI_FULL_CONNECTION_USE_KERBEROS |
CLI_FULL_CONNECTION_FALLBACK_AFTER_KERBEROS;
}
if (get_cmdline_auth_info_use_machine_account(auth_info) &&
!set_cmdline_auth_info_machine_account_creds(auth_info)) {
return NULL;
}
set_cmdline_auth_info_getpass(auth_info);
nt_status = cli_full_connection(&c, lp_netbios_name(), server,
NULL, 0,
share, "?????",
get_cmdline_auth_info_username(auth_info),
lp_workgroup(),
get_cmdline_auth_info_password(auth_info),
flags,
get_cmdline_auth_info_signing_state(auth_info));
if (!NT_STATUS_IS_OK(nt_status)) {
DBG_ERR("cli_full_connection failed! (%s)\n",
nt_errstr(nt_status));
return NULL;
}
if (get_cmdline_auth_info_smb_encrypt(auth_info)) {
nt_status = cli_cm_force_encryption(
c,
get_cmdline_auth_info_username(auth_info),
get_cmdline_auth_info_password(auth_info),
lp_workgroup(),
share);
if (!NT_STATUS_IS_OK(nt_status)) {
cli_shutdown(c);
c = NULL;
}
}
return c;
}
int main(int argc, char *argv[])
{
const char **argv_const = discard_const_p(const char *, argv);
TALLOC_CTX *frame = talloc_stackframe();
struct user_auth_info *auth_info;
poptContext pc;
int opt, ret;
char *unc, *mountpoint, *server, *share;
struct cli_state *cli;
struct poptOption long_options[] = {
POPT_AUTOHELP
POPT_COMMON_SAMBA
POPT_COMMON_CREDENTIALS
POPT_TABLEEND
};
smb_init_locale();
setup_logging(argv[0], DEBUG_STDERR);
lp_set_cmdline("client min protocol", "SMB2");
lp_set_cmdline("client max protocol", "SMB3_11");
auth_info = user_auth_info_init(frame);
if (auth_info == NULL) {
exit(1);
}
popt_common_set_auth_info(auth_info);
lp_load_global(get_dyn_CONFIGFILE());
load_interfaces();
pc = poptGetContext("smb2mount", argc, argv_const, long_options, 0);
poptSetOtherOptionHelp(pc, "//server1/share1 mountpoint");
while ((opt = poptGetNextOpt(pc)) != -1) {
switch(opt) {
default:
fprintf(stderr, "Unknown Option: %c\n", opt);
exit(1);
}
}
if (!poptPeekArg(pc)) {
poptPrintUsage(pc, stderr, 0);
return -1;
}
unc = talloc_strdup(frame, poptGetArg(pc));
if (unc == NULL) {
return -1;
}
string_replace(unc,'/','\\');
if (!poptPeekArg(pc)) {
poptPrintUsage(pc, stderr, 0);
return -1;
}
mountpoint = talloc_strdup(frame, poptGetArg(pc));
if (mountpoint == NULL) {
return -1;
}
poptFreeContext(pc);
popt_burn_cmdline_password(argc, argv);
server = talloc_strdup(frame, unc+2);
if (!server) {
return -1;
}
share = strchr_m(server,'\\');
if (!share) {
fprintf(stderr, "Invalid argument: %s\n", share);
return -1;
}
*share = 0;
share++;
cli = connect_one(auth_info, server, share);
if (cli == NULL) {
return -1;
}
ret = do_mount(cli, mountpoint);
if (ret != 0) {
fprintf(stderr, "mount failed\n");
return -1;
}
TALLOC_FREE(frame);
return 0;
}

14
examples/fuse/wscript Normal file
View File

@ -0,0 +1,14 @@
#!/usr/bin/env python
def configure(conf):
# Check for fuse support
if conf.CHECK_CODE('''
#define FUSE_USE_VERSION 26
#define _FILE_OFFSET_BITS 64
#include "fuse/fuse_lowlevel.h"
int main(void) { return 0; }
''', 'HAVE_FUSE_FUSE_LOWLEVEL_H',
addmain=False,
execute=False) and conf.CHECK_FUNCS_IN('fuse_mount',
'fuse'):
conf.DEFINE('HAVE_FUSE', 1)

View File

@ -0,0 +1,7 @@
#!/usr/bin/env python
if bld.env.HAVE_FUSE:
bld.SAMBA_BINARY('smb2mount',
source='smb2mount.c clifuse.c',
deps='param popt_samba3 libsmb fuse',
install=False)

View File

@ -1469,6 +1469,7 @@ bld.RECURSE('../examples/auth')
bld.RECURSE('../examples/libsmbclient')
bld.RECURSE('../examples/pdb')
bld.RECURSE('../examples/VFS')
bld.RECURSE('../examples/fuse')
bld.RECURSE('lib/netapi/tests')
bld.RECURSE('lib/netapi/examples')
bld.RECURSE('smbd/notifyd')

View File

@ -100,6 +100,8 @@ def configure(conf):
conf.env.replace_add_global_pthread = True
conf.RECURSE('lib/replace')
conf.RECURSE('examples/fuse')
conf.SAMBA_CHECK_PERL(mandatory=True)
conf.find_program('xsltproc', var='XSLTPROC')