From 3b8b7cb9d481828953f105f92bacc07a3cb2f332 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 5 Mar 2020 10:55:36 +0100 Subject: stream_smb: remove this This required libsmbclient, which is a heavy dependency, and as a library, has all kinds of problems. For one, the API requires completely unacceptable global state (in particular, leaks auth state), and is not thread-safe (meaning concurrent reads to multiple files block each other). There are better replacements: you can use the Linux kernel's builtin CIFS support, fusesmb, or contribute supoport for libdsm. --- Copyright | 1 - stream/stream.c | 4 -- stream/stream_smb.c | 155 ---------------------------------------------------- wscript | 7 --- wscript_build.py | 1 - 5 files changed, 168 deletions(-) delete mode 100644 stream/stream_smb.c diff --git a/Copyright b/Copyright index 20f14c6f70..b7f5bfd5e6 100644 --- a/Copyright +++ b/Copyright @@ -53,7 +53,6 @@ The following files are still GPL only (--enable-lgpl disables them): stream/stream_cdda.c unknown stream/stream_dvb.* must stay GPL stream/stream_dvdnav.c unknown - stream/stream_smb.c will stay GPLv3 video/out/vo_caca.c unknown video/out/vo_direct3d.c unknown video/out/vo_vaapi.c probably impossible (some company's code) diff --git a/stream/stream.c b/stream/stream.c index a3285e4d8f..c8b3d34a51 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -44,7 +44,6 @@ extern const stream_info_t stream_info_cdda; extern const stream_info_t stream_info_dvb; -extern const stream_info_t stream_info_smb; extern const stream_info_t stream_info_null; extern const stream_info_t stream_info_memory; extern const stream_info_t stream_info_mf; @@ -71,9 +70,6 @@ static const stream_info_t *const stream_list[] = { #if HAVE_DVBIN &stream_info_dvb, #endif -#if HAVE_LIBSMBCLIENT - &stream_info_smb, -#endif #if HAVE_DVDNAV &stream_info_ifo_dvdnav, &stream_info_dvdnav, diff --git a/stream/stream_smb.c b/stream/stream_smb.c deleted file mode 100644 index 1e52b55a37..0000000000 --- a/stream/stream_smb.c +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Original author: M. Tourne - * - * This file is part of mpv. - * - * mpv 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. - * - * mpv 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 mpv. If not, see . - */ - -#include "config.h" - -#include -#include -#include - -#include "common/msg.h" -#include "stream.h" -#include "options/m_option.h" - -#include "config.h" -#if !HAVE_GPL -#error GPL only -#endif - -static pthread_mutex_t smb_lock = PTHREAD_MUTEX_INITIALIZER; - -struct priv { - int fd; -}; - -static void smb_auth_fn(const char *server, const char *share, - char *workgroup, int wgmaxlen, char *username, int unmaxlen, - char *password, int pwmaxlen) -{ - strncpy(workgroup, "LAN", wgmaxlen - 1); - workgroup[wgmaxlen - 1] = '\0'; -} - -static int64_t get_size(stream_t *s) { - struct priv *p = s->priv; - pthread_mutex_lock(&smb_lock); - off_t size = smbc_lseek(p->fd,0,SEEK_END); - smbc_lseek(p->fd,s->pos,SEEK_SET); - pthread_mutex_unlock(&smb_lock); - return size; -} - -static int seek(stream_t *s,int64_t newpos) { - struct priv *p = s->priv; - pthread_mutex_lock(&smb_lock); - off_t size = smbc_lseek(p->fd,newpos,SEEK_SET); - pthread_mutex_unlock(&smb_lock); - if(size<0) { - return 0; - } - return 1; -} - -static int fill_buffer(stream_t *s, void *buffer, int max_len){ - struct priv *p = s->priv; - pthread_mutex_lock(&smb_lock); - int r = smbc_read(p->fd,buffer,max_len); - pthread_mutex_unlock(&smb_lock); - return (r <= 0) ? -1 : r; -} - -static int write_buffer(stream_t *s, void *buffer, int len) { - struct priv *p = s->priv; - int wr; - pthread_mutex_lock(&smb_lock); - wr = smbc_write(p->fd,buffer,len); - pthread_mutex_unlock(&smb_lock); - return wr; -} - -static void close_f(stream_t *s){ - struct priv *p = s->priv; - pthread_mutex_lock(&smb_lock); - smbc_close(p->fd); - pthread_mutex_unlock(&smb_lock); -} - -static int open_f (stream_t *stream) -{ - char *filename; - int64_t len; - int fd, err; - - struct priv *priv = talloc_zero(stream, struct priv); - stream->priv = priv; - - filename = stream->url; - - bool write = stream->mode == STREAM_WRITE; - mode_t m = write ? O_RDWR|O_CREAT|O_TRUNC : O_RDONLY; - - if(!filename) { - MP_ERR(stream, "[smb] Bad url\n"); - return STREAM_ERROR; - } - - pthread_mutex_lock(&smb_lock); - err = smbc_init(smb_auth_fn, 1); - pthread_mutex_unlock(&smb_lock); - if (err < 0) { - MP_ERR(stream, "Cannot init the libsmbclient library: %d\n",err); - return STREAM_ERROR; - } - - pthread_mutex_lock(&smb_lock); - fd = smbc_open(filename, m,0644); - pthread_mutex_unlock(&smb_lock); - if (fd < 0) { - MP_ERR(stream, "Could not open from LAN: '%s'\n", filename); - return STREAM_ERROR; - } - - len = 0; - if(!write) { - pthread_mutex_lock(&smb_lock); - len = smbc_lseek(fd,0,SEEK_END); - smbc_lseek (fd, 0, SEEK_SET); - pthread_mutex_unlock(&smb_lock); - } - if(len > 0 || write) { - stream->seekable = true; - stream->seek = seek; - } - priv->fd = fd; - stream->fill_buffer = fill_buffer; - stream->write_buffer = write_buffer; - stream->close = close_f; - stream->get_size = get_size; - stream->streaming = true; - - return STREAM_OK; -} - -const stream_info_t stream_info_smb = { - .name = "smb", - .open = open_f, - .protocols = (const char*const[]){"smb", NULL}, - .can_write = true, //who's gonna do that? - .stream_origin = STREAM_ORIGIN_FS, -}; diff --git a/wscript b/wscript index 7506b1bceb..71574e79ac 100644 --- a/wscript +++ b/wscript @@ -326,13 +326,6 @@ iconv support use --disable-iconv.", 'deps': 'os-linux', 'func': check_statement('sys/mman.h', 'memfd_create("mpv", MFD_CLOEXEC | MFD_ALLOW_SEALING)') - }, { - 'name': '--libsmbclient', - 'desc': 'Samba support (makes mpv GPLv3)', - 'deps': 'libdl && gpl', - 'func': check_pkg_config('smbclient'), - 'default': 'disable', - 'module': 'input', }, { 'name' : '--lua', 'desc' : 'Lua', diff --git a/wscript_build.py b/wscript_build.py index f80fb08a83..d4ec3ff4ec 100644 --- a/wscript_build.py +++ b/wscript_build.py @@ -383,7 +383,6 @@ def build(ctx): ( "stream/stream_memory.c" ), ( "stream/stream_mf.c" ), ( "stream/stream_null.c" ), - ( "stream/stream_smb.c", "libsmbclient" ), ## Subtitles ( "sub/ass_mp.c", "libass"), -- cgit v1.2.3