Mercurial > mplayer.hg
changeset 15519:07a841d9a8e1
ported smb:// to the new stream api, patch by Matthieu Tourne [matthieu puntum tourne ab gmail puntum com]
author | nicodvb |
---|---|
date | Thu, 19 May 2005 20:58:11 +0000 |
parents | 9391bf60ccdf |
children | 2c5186ed83b9 |
files | libmpdemux/stream_smb.c |
diffstat | 1 files changed, 153 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdemux/stream_smb.c Thu May 19 20:58:11 2005 +0000 @@ -0,0 +1,153 @@ + +#include "config.h" + +#ifdef LIBSMBCLIENT + +#include <libsmbclient.h> +#include <unistd.h> +#include <stdio.h> + +#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 +}; + +#endif