summaryrefslogtreecommitdiff
path: root/src/input/input_file.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/input_file.c')
-rw-r--r--src/input/input_file.c123
1 files changed, 40 insertions, 83 deletions
diff --git a/src/input/input_file.c b/src/input/input_file.c
index fd2b0e733..2fe3925ea 100644
--- a/src/input/input_file.c
+++ b/src/input/input_file.c
@@ -15,9 +15,7 @@
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- * $Id: input_file.c,v 1.122 2007/03/29 19:47:17 dgp85 Exp $
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*/
#ifdef HAVE_CONFIG_H
@@ -46,10 +44,10 @@
#define LOG
*/
-#include "xine_internal.h"
-#include "xineutils.h"
-#include "compat.h"
-#include "input_plugin.h"
+#include <xine/xine_internal.h>
+#include <xine/xineutils.h>
+#include <xine/compat.h>
+#include <xine/input_plugin.h>
#define MAXFILES 65535
@@ -82,8 +80,8 @@ typedef struct {
int fh;
#ifdef HAVE_MMAP
int mmap_on;
- void *mmap_base;
- void *mmap_curr;
+ uint8_t *mmap_base;
+ uint8_t *mmap_curr;
off_t mmap_len;
#endif
char *mrl;
@@ -144,7 +142,7 @@ static int check_mmap_file(file_input_plugin_t *this) {
}
#endif
-static off_t file_plugin_read (input_plugin_t *this_gen, char *buf, off_t len) {
+static off_t file_plugin_read (input_plugin_t *this_gen, void *buf, off_t len) {
file_input_plugin_t *this = (file_input_plugin_t *) this_gen;
#ifdef HAVE_MMAP
@@ -223,7 +221,7 @@ static off_t file_plugin_seek (input_plugin_t *this_gen, off_t offset, int origi
#ifdef HAVE_MMAP /* Simulate f*() library calls */
if ( check_mmap_file(this) ) {
- void *new_point = this->mmap_curr;
+ uint8_t *new_point = this->mmap_curr;
switch(origin) {
case SEEK_SET: new_point = this->mmap_base + offset; break;
case SEEK_CUR: new_point = this->mmap_curr + offset; break;
@@ -327,31 +325,8 @@ static void file_plugin_dispose (input_plugin_t *this_gen ) {
}
static char *decode_uri (char *uri) {
-
- int len = strlen (uri);
- int i;
-
uri = strdup(uri);
-
- for (i=0; i<len; i++) {
-
- if ( (uri[i]=='%') && (i<(len-2)) ) {
-
- int c;
-
- if ( sscanf (&uri[i+1], "%02x", &c) == 1) {
-
- uri[i]= (char) c;
-
- memmove (uri+i+1, uri+i+3, len-i-3);
-
- len-=2;
- }
- }
- }
-
- uri[len] = 0;
-
+ _x_mrl_unescape (uri);
return uri;
}
@@ -362,7 +337,7 @@ static int file_plugin_open (input_plugin_t *this_gen ) {
lprintf("file_plugin_open\n");
- if (strncasecmp (this->mrl, "file:", 5) == 0)
+ if (strncasecmp (this->mrl, "file:/", 6) == 0)
{
if (strncasecmp (this->mrl, "file://localhost/", 16) == 0)
filename = decode_uri(&(this->mrl[16]));
@@ -372,43 +347,27 @@ static int file_plugin_open (input_plugin_t *this_gen ) {
filename = decode_uri(&(this->mrl[5]));
}
else
- filename = decode_uri(this->mrl);
+ filename = strdup(this->mrl); /* NEVER unescape plain file names! */
this->fh = open (filename, O_RDONLY|O_BINARY);
-
- free(filename);
if (this->fh == -1) {
- /* try again without unescaping; such MRLs might be invalid,
- * but we are a nice software */
- if (strncasecmp (this->mrl, "file:", 5) == 0)
- {
- if (strncasecmp (this->mrl, "file://localhost/", 16) == 0)
- this->fh = open(&this->mrl[16], O_RDONLY|O_BINARY);
- else if (strncasecmp (this->mrl, "file://127.0.0.1/", 16) == 0)
- this->fh = open(&this->mrl[16], O_RDONLY|O_BINARY);
- else
- this->fh = open(&this->mrl[5], O_RDONLY|O_BINARY);
+ if (errno == EACCES) {
+ _x_message(this->stream, XINE_MSG_PERMISSION_ERROR, this->mrl, NULL);
+ xine_log (this->stream->xine, XINE_LOG_MSG,
+ _("input_file: Permission denied: >%s<\n"), this->mrl);
+ } else if (errno == ENOENT) {
+ _x_message(this->stream, XINE_MSG_FILE_NOT_FOUND, this->mrl, NULL);
+ xine_log (this->stream->xine, XINE_LOG_MSG,
+ _("input_file: File not found: >%s<\n"), this->mrl);
}
- else
- this->fh = open(this->mrl, O_RDONLY|O_BINARY);
-
- if (this->fh == -1) {
- if (errno == EACCES) {
- _x_message(this->stream, XINE_MSG_PERMISSION_ERROR, this->mrl, NULL);
- xine_log (this->stream->xine, XINE_LOG_MSG,
- _("input_file: Permission denied: >%s<\n"), this->mrl);
- return -1;
- } else if (errno == ENOENT) {
- _x_message(this->stream, XINE_MSG_FILE_NOT_FOUND, this->mrl, NULL);
- xine_log (this->stream->xine, XINE_LOG_MSG,
- _("input_file: File not found: >%s<\n"), this->mrl);
- }
- return -1;
- }
+ free(filename);
+ return -1;
}
+ free(filename);
+
#ifdef HAVE_MMAP
this->mmap_on = 0;
this->mmap_base = NULL;
@@ -423,10 +382,16 @@ static int file_plugin_open (input_plugin_t *this_gen ) {
}
#ifdef HAVE_MMAP
- if ( (this->mmap_base = mmap(NULL, sbuf.st_size, PROT_READ, MAP_SHARED, this->fh, 0)) != (void*)-1 ) {
- this->mmap_on = 1;
- this->mmap_curr = this->mmap_base;
- this->mmap_len = sbuf.st_size;
+ {
+ size_t tmp_size = sbuf.st_size; /* may cause truncation - if it does, DON'T mmap! */
+ if ((tmp_size == sbuf.st_size) &&
+ ( (this->mmap_base = mmap(NULL, tmp_size, PROT_READ, MAP_SHARED, this->fh, 0)) != (void*)-1 )) {
+ this->mmap_on = 1;
+ this->mmap_curr = this->mmap_base;
+ this->mmap_len = sbuf.st_size;
+ } else {
+ this->mmap_base = NULL;
+ }
}
#endif
@@ -654,14 +619,6 @@ static off_t get_file_size(char *filepathname, char *origin) {
return pstat.st_size;
}
-static const char *file_class_get_description (input_class_t *this_gen) {
- return _("file input plugin");
-}
-
-static const char *file_class_get_identifier (input_class_t *this_gen) {
- return "file";
-}
-
static xine_mrl_t **file_class_get_dir (input_class_t *this_gen,
const char *filename, int *nFiles) {
@@ -723,9 +680,9 @@ static xine_mrl_t **file_class_get_dir (input_class_t *this_gen,
return NULL;
}
- dir_files = (xine_mrl_t *) xine_xmalloc(sizeof(xine_mrl_t) * MAXFILES);
- hide_files = (xine_mrl_t *) xine_xmalloc(sizeof(xine_mrl_t) * MAXFILES);
- norm_files = (xine_mrl_t *) xine_xmalloc(sizeof(xine_mrl_t) * MAXFILES);
+ dir_files = (xine_mrl_t *) xine_xcalloc(MAXFILES, sizeof(xine_mrl_t));
+ hide_files = (xine_mrl_t *) xine_xcalloc(MAXFILES, sizeof(xine_mrl_t));
+ norm_files = (xine_mrl_t *) xine_xcalloc(MAXFILES, sizeof(xine_mrl_t));
while((pdirent = readdir(pdir)) != NULL) {
@@ -1006,8 +963,8 @@ static void *init_plugin (xine_t *xine, void *data) {
config = xine->config;
this->input_class.get_instance = file_class_get_instance;
- this->input_class.get_identifier = file_class_get_identifier;
- this->input_class.get_description = file_class_get_description;
+ this->input_class.identifier = "file";
+ this->input_class.description = N_("file input plugin");
this->input_class.get_dir = file_class_get_dir;
this->input_class.get_autoplay_list = NULL;
this->input_class.dispose = file_class_dispose;
@@ -1046,6 +1003,6 @@ static void *init_plugin (xine_t *xine, void *data) {
const plugin_info_t xine_plugin_info[] EXPORTED = {
/* type, API, "name", version, special_info, init_function */
- { PLUGIN_INPUT | PLUGIN_MUST_PRELOAD, 17, "FILE", XINE_VERSION_CODE, NULL, init_plugin },
+ { PLUGIN_INPUT | PLUGIN_MUST_PRELOAD, 18, "FILE", XINE_VERSION_CODE, NULL, init_plugin },
{ PLUGIN_NONE, 0, "", 0, NULL, NULL }
};