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:
parent
857745655b
commit
3b97211d18
7
examples/fuse/README
Normal file
7
examples/fuse/README
Normal 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
1473
examples/fuse/clifuse.c
Normal file
File diff suppressed because it is too large
Load Diff
27
examples/fuse/clifuse.h
Normal file
27
examples/fuse/clifuse.h
Normal 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
167
examples/fuse/smb2mount.c
Normal 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
14
examples/fuse/wscript
Normal 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)
|
7
examples/fuse/wscript_build
Normal file
7
examples/fuse/wscript_build
Normal 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)
|
@ -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')
|
||||
|
Loading…
Reference in New Issue
Block a user