From 49867bd432352d19172ab26cf873bd5651e69e25 Mon Sep 17 00:00:00 2001 From: ben Date: Mon, 31 Jul 2006 17:39:17 +0000 Subject: introduce new 'stream' directory for all stream layer related components and split them from libmpdemux git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19277 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_smb.c | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 stream/stream_smb.c (limited to 'stream/stream_smb.c') diff --git a/stream/stream_smb.c b/stream/stream_smb.c new file mode 100644 index 0000000000..21c8d39e5d --- /dev/null +++ b/stream/stream_smb.c @@ -0,0 +1,148 @@ + +#include "config.h" + +#include +#include + +#include "mp_msg.h" +#include "stream.h" +#include "help_mp.h" +#include "m_option.h" +#include "m_struct.h" + +static struct stream_priv_s { +} stream_priv_dflts = { +}; + +#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) +// URL definition +static m_option_t stream_opts_fields[] = { + { NULL, NULL, 0, 0, 0, 0, NULL } +}; + +static struct m_struct_st stream_opts = { + "smb", + sizeof(struct stream_priv_s), + &stream_priv_dflts, + stream_opts_fields +}; + +static char smb_password[15]; +static char smb_username[15]; + +static void smb_auth_fn(const char *server, const char *share, + char *workgroup, int wgmaxlen, char *username, int unmaxlen, + char *password, int pwmaxlen) +{ + char temp[128]; + + strcpy(temp, "LAN"); + if (temp[strlen(temp) - 1] == 0x0a) + temp[strlen(temp) - 1] = 0x00; + + if (temp[0]) strncpy(workgroup, temp, wgmaxlen - 1); + + strcpy(temp, smb_username); + if (temp[strlen(temp) - 1] == 0x0a) + temp[strlen(temp) - 1] = 0x00; + + if (temp[0]) strncpy(username, temp, unmaxlen - 1); + + strcpy(temp, smb_password); + if (temp[strlen(temp) - 1] == 0x0a) + temp[strlen(temp) - 1] = 0x00; + + if (temp[0]) strncpy(password, temp, pwmaxlen - 1); +} + +static int seek(stream_t *s,off_t newpos) { + s->pos = newpos; + if(smbc_lseek(s->fd,s->pos,SEEK_SET)<0) { + s->eof=1; + return 0; + } + return 1; +} + +static int fill_buffer(stream_t *s, char* buffer, int max_len){ + int r = smbc_read(s->fd,buffer,max_len); + return (r <= 0) ? -1 : r; +} + +static int write_buffer(stream_t *s, char* buffer, int len) { + int r = smbc_write(s->fd,buffer,len); + return (r <= 0) ? -1 : r; +} + +static void close_f(stream_t *s){ + smbc_close(s->fd); +} + +static int open_f (stream_t *stream, int mode, void *opts, int* file_format) { + struct stream_priv_s *p = (struct stream_priv_s*)opts; + char *filename; + mode_t m = 0; + off_t len; + int fd, err; + + filename = stream->url; + + if(mode == STREAM_READ) + m = O_RDONLY; + else if (mode == STREAM_WRITE) //who's gonna do that ? + m = O_WRONLY; + else { + mp_msg(MSGT_OPEN, MSGL_ERR, "[smb] Unknown open mode %d\n", mode); + m_struct_free (&stream_opts, opts); + return STREAM_UNSUPORTED; + } + + if(!filename) { + mp_msg(MSGT_OPEN,MSGL_ERR, "[smb] Bad url\n"); + m_struct_free(&stream_opts, opts); + return STREAM_ERROR; + } + + err = smbc_init(smb_auth_fn, 1); + if (err < 0) { + mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_SMBInitError,err); + m_struct_free(&stream_opts, opts); + return STREAM_ERROR; + } + + fd = smbc_open(filename, m,0644); + if (fd < 0) { + mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_SMBFileNotFound, filename); + m_struct_free(&stream_opts, opts); + return STREAM_ERROR; + } + + len = smbc_lseek(fd,0,SEEK_END); + smbc_lseek (fd, 0, SEEK_SET); + if (len <= 0) + stream->flags = 0; + else { + stream->flags = STREAM_READ | STREAM_SEEK; + stream->end_pos = len; + stream->seek = seek; + } + stream->type = STREAMTYPE_SMB; + stream->fd = fd; + stream->fill_buffer = fill_buffer; + stream->write_buffer = write_buffer; + stream->close = close_f; + + m_struct_free(&stream_opts, opts); + return STREAM_OK; +} + +stream_info_t stream_info_smb = { + "Server Message Block", + "smb", + "M. Tourne", + "based on the code from 'a bulgarian' (one says)", + open_f, + {"smb", NULL}, + &stream_opts, + 0 //Url is an option string +}; -- cgit v1.2.3