Skip to content

Commit 6f05f84

Browse files
committed
Implement single SMB share with browse/load content
1 parent b1be705 commit 6f05f84

24 files changed

Lines changed: 1446 additions & 3 deletions

Makefile.common

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2706,6 +2706,87 @@ ifeq ($(HAVE_TEST_DRIVERS), 1)
27062706
OBJ += input/drivers/test_input.o
27072707
endif
27082708

2709+
ifneq (,$(filter 1,$(HAVE_SMBCLIENT) $(HAVE_BUILTINSMBCLIENT)))
2710+
DEFINES += -DHAVE_SMBCLIENT
2711+
2712+
ifeq ($(HAVE_SMBCLIENT),1)
2713+
# system libsmb2
2714+
ifeq ($(shell pkg-config --exists libsmb2 && echo yes),yes)
2715+
CFLAGS += $(shell pkg-config --cflags libsmb2)
2716+
LIBS += $(shell pkg-config --libs libsmb2)
2717+
else
2718+
LIBS += -lsmb2
2719+
endif
2720+
else ifeq ($(HAVE_BUILTINSMBCLIENT),1)
2721+
# builtin libsmb2
2722+
INCLUDE_DIRS += -I$(DEPS_DIR)/libsmb2/include
2723+
INCLUDE_DIRS += -I$(DEPS_DIR)/libsmb2/include/smb2
2724+
CFLAGS += "-D_U_=__attribute__((unused))"
2725+
CFLAGS += -DHAVE_STRING_H -DSTDC_HEADERS -DHAVE_TIME_H -DHAVE_STDLIB_H -DHAVE_UNISTD_H
2726+
CFLAGS += -DHAVE_FCNTL_H -DHAVE_POLL_H
2727+
CFLAGS += -DHAVE_SYS_SOCKET_H -DHAVE_NETINET_IN_H -DHAVE_NETINET_TCP_H
2728+
CFLAGS += -DHAVE_ARPA_INET_H -DHAVE_NETDB_H -DHAVE_SYS_UIO_H
2729+
CFLAGS += -DHAVE_LINGER
2730+
OBJ += \
2731+
deps/libsmb2/lib/aes.o \
2732+
deps/libsmb2/lib/aes_apple.o \
2733+
deps/libsmb2/lib/aes128ccm.o \
2734+
deps/libsmb2/lib/asn1-ber.o \
2735+
deps/libsmb2/lib/aes_reference.o \
2736+
deps/libsmb2/lib/alloc.o \
2737+
deps/libsmb2/lib/compat.o \
2738+
deps/libsmb2/lib/dcerpc.o \
2739+
deps/libsmb2/lib/dcerpc-lsa.o \
2740+
deps/libsmb2/lib/dcerpc-srvsvc.o \
2741+
deps/libsmb2/lib/errors.o \
2742+
deps/libsmb2/lib/hmac.o \
2743+
deps/libsmb2/lib/hmac-md5.o \
2744+
deps/libsmb2/lib/init.o \
2745+
deps/libsmb2/lib/krb5-wrapper.o \
2746+
deps/libsmb2/lib/libsmb2.o \
2747+
deps/libsmb2/lib/md4c.o \
2748+
deps/libsmb2/lib/md5.o \
2749+
deps/libsmb2/lib/ntlmssp.o \
2750+
deps/libsmb2/lib/pdu.o \
2751+
deps/libsmb2/lib/sha1.o \
2752+
deps/libsmb2/lib/sha224-256.o \
2753+
deps/libsmb2/lib/sha384-512.o \
2754+
deps/libsmb2/lib/smb2-cmd-close.o \
2755+
deps/libsmb2/lib/smb2-cmd-create.o \
2756+
deps/libsmb2/lib/smb2-cmd-echo.o \
2757+
deps/libsmb2/lib/smb2-cmd-error.o \
2758+
deps/libsmb2/lib/smb2-cmd-flush.o \
2759+
deps/libsmb2/lib/smb2-cmd-ioctl.o \
2760+
deps/libsmb2/lib/smb2-cmd-lock.o \
2761+
deps/libsmb2/lib/smb2-cmd-logoff.o \
2762+
deps/libsmb2/lib/smb2-cmd-negotiate.o \
2763+
deps/libsmb2/lib/smb2-cmd-oplock-break.o \
2764+
deps/libsmb2/lib/smb2-cmd-notify-change.o \
2765+
deps/libsmb2/lib/smb2-cmd-query-directory.o \
2766+
deps/libsmb2/lib/smb2-cmd-query-info.o \
2767+
deps/libsmb2/lib/smb2-cmd-read.o \
2768+
deps/libsmb2/lib/smb2-cmd-session-setup.o \
2769+
deps/libsmb2/lib/smb2-cmd-set-info.o \
2770+
deps/libsmb2/lib/smb2-cmd-tree-connect.o \
2771+
deps/libsmb2/lib/smb2-cmd-tree-disconnect.o \
2772+
deps/libsmb2/lib/smb2-cmd-write.o \
2773+
deps/libsmb2/lib/smb2-data-file-info.o \
2774+
deps/libsmb2/lib/smb2-data-filesystem-info.o \
2775+
deps/libsmb2/lib/smb2-data-security-descriptor.o \
2776+
deps/libsmb2/lib/smb2-data-reparse-point.o \
2777+
deps/libsmb2/lib/smb2-share-enum.o \
2778+
deps/libsmb2/lib/smb2-signing.o \
2779+
deps/libsmb2/lib/smb3-seal.o \
2780+
deps/libsmb2/lib/socket.o \
2781+
deps/libsmb2/lib/spnego-wrapper.o \
2782+
deps/libsmb2/lib/sync.o \
2783+
deps/libsmb2/lib/timestamps.o \
2784+
deps/libsmb2/lib/usha.o \
2785+
deps/libsmb2/lib/unicode.o
2786+
endif
2787+
2788+
OBJ += $(LIBRETRO_COMM_DIR)/vfs/vfs_implementation_smb.o
2789+
endif
27092790

27102791
#####################################
27112792
### Android Play Feature Delivery ###

config.def.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,7 @@
706706
#define DEFAULT_SETTINGS_SHOW_USER true
707707
#define DEFAULT_SETTINGS_SHOW_DIRECTORY true
708708
#define DEFAULT_SETTINGS_SHOW_STEAM true
709+
#define DEFAULT_SETTINGS_SHOW_SMB_CLIENT true
709710

710711
#define DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT true
711712
#define DEFAULT_QUICK_MENU_SHOW_RESTART_CONTENT true
@@ -1907,3 +1908,7 @@
19071908
#define DEFAULT_FILTER_BY_CURRENT_CORE false
19081909

19091910
#endif
1911+
1912+
#ifdef HAVE_SMBCLIENT
1913+
#define DEFAULT_SMB_CLIENT_AUTH_MODE 1
1914+
#endif

configuration.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1612,6 +1612,15 @@ static struct config_array_setting *populate_settings_array(
16121612
SETTING_ARRAY("ai_service_url", settings->arrays.ai_service_url, true, DEFAULT_AI_SERVICE_URL, true);
16131613
#endif
16141614

1615+
#ifdef HAVE_SMBCLIENT
1616+
SETTING_ARRAY("smb_client_server_address", settings->arrays.smb_client_server_address, false, NULL, true);
1617+
SETTING_ARRAY("smb_client_share", settings->arrays.smb_client_share, false, NULL, true);
1618+
SETTING_ARRAY("smb_client_subdir", settings->arrays.smb_client_subdir, false, NULL, true);
1619+
SETTING_ARRAY("smb_client_username", settings->arrays.smb_client_username, false, NULL, true);
1620+
SETTING_ARRAY("smb_client_password", settings->arrays.smb_client_password, false, NULL, true);
1621+
SETTING_ARRAY("smb_client_workgroup", settings->arrays.smb_client_workgroup, false, NULL, true);
1622+
#endif
1623+
16151624
#ifdef HAVE_LAKKA
16161625
SETTING_ARRAY("cpu_main_gov", settings->arrays.cpu_main_gov, false, NULL, true);
16171626
SETTING_ARRAY("cpu_menu_gov", settings->arrays.cpu_menu_gov, false, NULL, true);
@@ -2252,6 +2261,10 @@ static struct config_bool_setting *populate_settings_bool(
22522261
SETTING_BOOL("network_remote_enable", &settings->bools.network_remote_enable, false, false /* TODO */, false);
22532262
#endif
22542263
#endif
2264+
#ifdef HAVE_SMBCLIENT
2265+
SETTING_BOOL("settings_show_smb_client", &settings->bools.settings_show_smb_client, true, DEFAULT_SETTINGS_SHOW_SMB_CLIENT, false);
2266+
SETTING_BOOL("smb_client_enable", &settings->bools.smb_client_enable, true, false, false);
2267+
#endif
22552268
#ifdef HAVE_BSV_MOVIE
22562269
SETTING_BOOL("replay_checkpoint_deserialize", &settings->bools.replay_checkpoint_deserialize, true, DEFAULT_REPLAY_CHECKPOINT_DESERIALIZE, false);
22572270
#endif
@@ -2749,6 +2762,10 @@ static struct config_int_setting *populate_settings_int(
27492762
#endif
27502763
SETTING_INT("input_turbo_bind", &settings->ints.input_turbo_bind, true, DEFAULT_TURBO_BIND, false);
27512764

2765+
#ifdef HAVE_SMBCLIENT
2766+
SETTING_INT("smb_client_auth_mode", &settings->ints.smb_client_auth_mode, true, DEFAULT_SMB_CLIENT_AUTH_MODE, false);
2767+
#endif
2768+
27522769
*size = count;
27532770

27542771
return tmp;

configuration.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,9 @@ typedef struct settings
155155
int input_overlay_lightgun_port;
156156
#endif
157157
int input_turbo_bind;
158+
#ifdef HAVE_SMBCLIENT
159+
int smb_client_auth_mode;
160+
#endif
158161
} ints;
159162

160163
struct
@@ -543,7 +546,15 @@ typedef struct settings
543546
char ai_service_url[PATH_MAX_LENGTH];
544547

545548
char translation_service_url[2048]; /* TODO/FIXME - check size */
546-
} arrays;
549+
#ifdef HAVE_SMBCLIENT
550+
char smb_client_server_address[256];
551+
char smb_client_share[256];
552+
char smb_client_subdir[PATH_MAX_LENGTH];
553+
char smb_client_username[128];
554+
char smb_client_password[128];
555+
char smb_client_workgroup[64];
556+
#endif
557+
} arrays;
547558

548559
struct
549560
{
@@ -892,6 +903,9 @@ typedef struct settings
892903
bool settings_show_directory;
893904
#ifdef HAVE_MIST
894905
bool settings_show_steam;
906+
#endif
907+
#ifdef HAVE_SMBCLIENT
908+
bool settings_show_smb_client;
895909
#endif
896910
bool quick_menu_show_resume_content;
897911
bool quick_menu_show_restart_content;
@@ -1145,6 +1159,9 @@ typedef struct settings
11451159
bool game_ai_show_debug;
11461160
#endif
11471161

1162+
#ifdef HAVE_SMBCLIENT
1163+
bool smb_client_enable;
1164+
#endif
11481165
} bools;
11491166

11501167
uint8_t flags;

intl/msg_hash_lbl.h

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6728,3 +6728,53 @@ MSG_HASH(
67286728
"game_ai_show_debug"
67296729
)
67306730
#endif
6731+
#ifdef HAVE_SMBCLIENT
6732+
MSG_HASH(
6733+
MENU_ENUM_LABEL_SETTINGS_SHOW_SMB_CLIENT,
6734+
"settings_show_smb_client"
6735+
)
6736+
MSG_HASH(
6737+
MENU_ENUM_LABEL_SMB_CLIENT_SETTINGS,
6738+
"smb_client_settings"
6739+
)
6740+
MSG_HASH(
6741+
MENU_ENUM_LABEL_DEFERRED_SMB_CLIENT_SETTINGS_LIST,
6742+
"deferred_smb_client_settings_list"
6743+
)
6744+
MSG_HASH(
6745+
MENU_ENUM_LABEL_SMB_CLIENT_ENABLE,
6746+
"smb_client_enable"
6747+
)
6748+
MSG_HASH(
6749+
MENU_ENUM_LABEL_SMB_CLIENT_SERVER,
6750+
"smb_client_server"
6751+
)
6752+
MSG_HASH(
6753+
MENU_ENUM_LABEL_SMB_CLIENT_SHARE,
6754+
"smb_client_share"
6755+
)
6756+
MSG_HASH(
6757+
MENU_ENUM_LABEL_SMB_CLIENT_SUBDIR,
6758+
"smb_client_subdir"
6759+
)
6760+
MSG_HASH(
6761+
MENU_ENUM_LABEL_SMB_CLIENT_USERNAME,
6762+
"smb_client_username"
6763+
)
6764+
MSG_HASH(
6765+
MENU_ENUM_LABEL_SMB_CLIENT_PASSWORD,
6766+
"smb_client_password"
6767+
)
6768+
MSG_HASH(
6769+
MENU_ENUM_LABEL_SMB_CLIENT_WORKGROUP,
6770+
"smb_client_workgroup"
6771+
)
6772+
MSG_HASH(
6773+
MENU_ENUM_LABEL_SMB_CLIENT_AUTH_MODE,
6774+
"smb_client_auth_mode"
6775+
)
6776+
MSG_HASH(
6777+
MENU_ENUM_LABEL_SMB_CLIENT_BROWSE,
6778+
"smb_client_browse"
6779+
)
6780+
#endif

intl/msg_hash_us.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17040,3 +17040,97 @@ MSG_HASH(
1704017040
"Show the 'Game AI' option."
1704117041
)
1704217042
#endif
17043+
#ifdef HAVE_SMBCLIENT
17044+
MSG_HASH(
17045+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SETTINGS,
17046+
"SMB Network Settings"
17047+
)
17048+
MSG_HASH(
17049+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SETTINGS,
17050+
"Configure SMB network share settings."
17051+
)
17052+
MSG_HASH(
17053+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_ENABLE,
17054+
"Enable SMB Client"
17055+
)
17056+
MSG_HASH(
17057+
MENU_ENUM_SUBLABEL_SMB_CLIENT_ENABLE,
17058+
"Enable SMB network share access."
17059+
)
17060+
MSG_HASH(
17061+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SERVER,
17062+
"SMB Server"
17063+
)
17064+
MSG_HASH(
17065+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SERVER,
17066+
"Server IP address or hostname."
17067+
)
17068+
MSG_HASH(
17069+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SHARE,
17070+
"SMB Share Name"
17071+
)
17072+
MSG_HASH(
17073+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SHARE,
17074+
"Name of the network share to access."
17075+
)
17076+
MSG_HASH(
17077+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SUBDIR,
17078+
"SMB Sub directory (optional)"
17079+
)
17080+
MSG_HASH(
17081+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SUBDIR,
17082+
"Sub directory path on the share."
17083+
)
17084+
MSG_HASH(
17085+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_USERNAME,
17086+
"SMB Username"
17087+
)
17088+
MSG_HASH(
17089+
MENU_ENUM_SUBLABEL_SMB_CLIENT_USERNAME,
17090+
"Username for authentication."
17091+
)
17092+
MSG_HASH(
17093+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_PASSWORD,
17094+
"SMB Password"
17095+
)
17096+
MSG_HASH(
17097+
MENU_ENUM_SUBLABEL_SMB_CLIENT_PASSWORD,
17098+
"Password for authentication."
17099+
)
17100+
MSG_HASH(
17101+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_WORKGROUP,
17102+
"SMB Workgroup"
17103+
)
17104+
MSG_HASH(
17105+
MENU_ENUM_SUBLABEL_SMB_CLIENT_WORKGROUP,
17106+
"Workgroup or domain name."
17107+
)
17108+
MSG_HASH(
17109+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_AUTH_MODE,
17110+
"SMB Authentication Mode"
17111+
)
17112+
MSG_HASH(
17113+
MENU_ENUM_SUBLABEL_SMB_CLIENT_AUTH_MODE,
17114+
"Select the authentication used in your environment."
17115+
)
17116+
MSG_HASH(
17117+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_BROWSE,
17118+
"Browse SMB Share"
17119+
)
17120+
MSG_HASH(
17121+
MENU_ENUM_SUBLABEL_SMB_CLIENT_BROWSE,
17122+
"Browse files on the configured SMB share."
17123+
)
17124+
MSG_HASH(
17125+
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_SMB_CLIENT,
17126+
"Show 'SMB Client'"
17127+
)
17128+
MSG_HASH(
17129+
MENU_ENUM_SUBLABEL_SETTINGS_SHOW_SMB_CLIENT,
17130+
"Show 'SMB Client' settings."
17131+
)
17132+
MSG_HASH(
17133+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SMB_SHARE,
17134+
"SMB Share"
17135+
)
17136+
#endif

libretro-common/include/vfs/vfs.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
#include <retro_common_api.h>
2727
#include <boolean.h>
28+
#include <stdint.h>
2829

2930
#ifdef RARCH_INTERNAL
3031
#ifndef VFS_FRONTEND
@@ -60,7 +61,8 @@ enum vfs_scheme
6061
{
6162
VFS_SCHEME_NONE = 0,
6263
VFS_SCHEME_CDROM,
63-
VFS_SCHEME_SAF
64+
VFS_SCHEME_SAF,
65+
VFS_SCHEME_SMB
6466
};
6567

6668
#if !(defined(__WINRT__) && defined(__cplusplus_winrt))
@@ -86,6 +88,9 @@ struct libretro_vfs_implementation_file
8688
int fd;
8789
unsigned hints;
8890
enum vfs_scheme scheme;
91+
#ifdef HAVE_SMBCLIENT
92+
intptr_t smb_fh;
93+
#endif
8994
};
9095
#endif
9196

0 commit comments

Comments
 (0)