Skip to content

Commit 5160fff

Browse files
committed
Implement single SMB share with browse/load content
1 parent dee34a6 commit 5160fff

24 files changed

Lines changed: 1441 additions & 3 deletions

Makefile.common

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

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

27032784
#####################################
27042785
### Android Play Feature Delivery ###

config.def.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -710,6 +710,7 @@
710710
#define DEFAULT_SETTINGS_SHOW_USER true
711711
#define DEFAULT_SETTINGS_SHOW_DIRECTORY true
712712
#define DEFAULT_SETTINGS_SHOW_STEAM true
713+
#define DEFAULT_SETTINGS_SHOW_SMB_CLIENT true
713714

714715
#define DEFAULT_QUICK_MENU_SHOW_RESUME_CONTENT true
715716
#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
@@ -1611,6 +1611,15 @@ static struct config_array_setting *populate_settings_array(
16111611
SETTING_ARRAY("ai_service_url", settings->arrays.ai_service_url, true, DEFAULT_AI_SERVICE_URL, true);
16121612
#endif
16131613

1614+
#ifdef HAVE_SMBCLIENT
1615+
SETTING_ARRAY("smb_client_server_address", settings->arrays.smb_client_server_address, false, NULL, true);
1616+
SETTING_ARRAY("smb_client_share", settings->arrays.smb_client_share, false, NULL, true);
1617+
SETTING_ARRAY("smb_client_subdir", settings->arrays.smb_client_subdir, false, NULL, true);
1618+
SETTING_ARRAY("smb_client_username", settings->arrays.smb_client_username, false, NULL, true);
1619+
SETTING_ARRAY("smb_client_password", settings->arrays.smb_client_password, false, NULL, true);
1620+
SETTING_ARRAY("smb_client_workgroup", settings->arrays.smb_client_workgroup, false, NULL, true);
1621+
#endif
1622+
16141623
#ifdef HAVE_LAKKA
16151624
SETTING_ARRAY("cpu_main_gov", settings->arrays.cpu_main_gov, false, NULL, true);
16161625
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
@@ -2747,6 +2760,10 @@ static struct config_int_setting *populate_settings_int(
27472760
#endif
27482761
SETTING_INT("input_turbo_bind", &settings->ints.input_turbo_bind, true, DEFAULT_TURBO_BIND, false);
27492762

2763+
#ifdef HAVE_SMBCLIENT
2764+
SETTING_INT("smb_client_auth_mode", &settings->ints.smb_client_auth_mode, true, DEFAULT_SMB_CLIENT_AUTH_MODE, false);
2765+
#endif
2766+
27502767
*size = count;
27512768

27522769
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
@@ -541,7 +544,15 @@ typedef struct settings
541544
char ai_service_url[PATH_MAX_LENGTH];
542545

543546
char translation_service_url[2048]; /* TODO/FIXME - check size */
544-
} arrays;
547+
#ifdef HAVE_SMBCLIENT
548+
char smb_client_server_address[256];
549+
char smb_client_share[256];
550+
char smb_client_subdir[PATH_MAX_LENGTH];
551+
char smb_client_username[128];
552+
char smb_client_password[128];
553+
char smb_client_workgroup[64];
554+
#endif
555+
} arrays;
545556

546557
struct
547558
{
@@ -890,6 +901,9 @@ typedef struct settings
890901
bool settings_show_directory;
891902
#ifdef HAVE_MIST
892903
bool settings_show_steam;
904+
#endif
905+
#ifdef HAVE_SMBCLIENT
906+
bool settings_show_smb_client;
893907
#endif
894908
bool quick_menu_show_resume_content;
895909
bool quick_menu_show_restart_content;
@@ -1144,6 +1158,9 @@ typedef struct settings
11441158
bool game_ai_show_debug;
11451159
#endif
11461160

1161+
#ifdef HAVE_SMBCLIENT
1162+
bool smb_client_enable;
1163+
#endif
11471164
} bools;
11481165

11491166
uint8_t flags;

intl/msg_hash_lbl.h

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

intl/msg_hash_us.h

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16962,3 +16962,97 @@ MSG_HASH(
1696216962
"Show the 'Game AI' option."
1696316963
)
1696416964
#endif
16965+
#ifdef HAVE_SMBCLIENT
16966+
MSG_HASH(
16967+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SETTINGS,
16968+
"SMB Network Settings"
16969+
)
16970+
MSG_HASH(
16971+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SETTINGS,
16972+
"Configure SMB network share settings."
16973+
)
16974+
MSG_HASH(
16975+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_ENABLE,
16976+
"Enable SMB Client"
16977+
)
16978+
MSG_HASH(
16979+
MENU_ENUM_SUBLABEL_SMB_CLIENT_ENABLE,
16980+
"Enable SMB network share access."
16981+
)
16982+
MSG_HASH(
16983+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SERVER,
16984+
"SMB Server"
16985+
)
16986+
MSG_HASH(
16987+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SERVER,
16988+
"Server IP address or hostname."
16989+
)
16990+
MSG_HASH(
16991+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SHARE,
16992+
"SMB Share Name"
16993+
)
16994+
MSG_HASH(
16995+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SHARE,
16996+
"Name of the network share to access."
16997+
)
16998+
MSG_HASH(
16999+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SUBDIR,
17000+
"SMB Sub directory (optional)"
17001+
)
17002+
MSG_HASH(
17003+
MENU_ENUM_SUBLABEL_SMB_CLIENT_SUBDIR,
17004+
"Sub directory path on the share."
17005+
)
17006+
MSG_HASH(
17007+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_USERNAME,
17008+
"SMB Username"
17009+
)
17010+
MSG_HASH(
17011+
MENU_ENUM_SUBLABEL_SMB_CLIENT_USERNAME,
17012+
"Username for authentication."
17013+
)
17014+
MSG_HASH(
17015+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_PASSWORD,
17016+
"SMB Password"
17017+
)
17018+
MSG_HASH(
17019+
MENU_ENUM_SUBLABEL_SMB_CLIENT_PASSWORD,
17020+
"Password for authentication."
17021+
)
17022+
MSG_HASH(
17023+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_WORKGROUP,
17024+
"SMB Workgroup"
17025+
)
17026+
MSG_HASH(
17027+
MENU_ENUM_SUBLABEL_SMB_CLIENT_WORKGROUP,
17028+
"Workgroup or domain name."
17029+
)
17030+
MSG_HASH(
17031+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_AUTH_MODE,
17032+
"SMB Authentication Mode"
17033+
)
17034+
MSG_HASH(
17035+
MENU_ENUM_SUBLABEL_SMB_CLIENT_AUTH_MODE,
17036+
"Select the authentication used in your environment."
17037+
)
17038+
MSG_HASH(
17039+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_BROWSE,
17040+
"Browse SMB Share"
17041+
)
17042+
MSG_HASH(
17043+
MENU_ENUM_SUBLABEL_SMB_CLIENT_BROWSE,
17044+
"Browse files on the configured SMB share."
17045+
)
17046+
MSG_HASH(
17047+
MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_SMB_CLIENT,
17048+
"Show 'SMB Client'"
17049+
)
17050+
MSG_HASH(
17051+
MENU_ENUM_SUBLABEL_SETTINGS_SHOW_SMB_CLIENT,
17052+
"Show 'SMB Client' settings."
17053+
)
17054+
MSG_HASH(
17055+
MENU_ENUM_LABEL_VALUE_SMB_CLIENT_SMB_SHARE,
17056+
"SMB Share"
17057+
)
17058+
#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)