Mercurial > mplayer.hg
annotate stream/stream_file.c @ 34179:cdbfbee5c8a9
libdvdcss: Drop #define of snprintf() to _snprintf() if the former is undefined.
This workaround was added for MinGW originally, but nowadays MinGW supports
snprintf() directly so it has become unnecessary.
Furthermore this can play havoc with Cygwin which does not have a _snprintf()
declaration and gives implicit function declaration warnings. Depending on
compiler flags, this can be a fatal error.
This was committed to the libdvdcss Subversion repository as revision 243.
author | diego |
---|---|
date | Wed, 26 Oct 2011 17:02:09 +0000 |
parents | 3e37890b6261 |
children | 5f3501f7f4d9 |
rev | line source |
---|---|
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
1 /* |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
2 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
7 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
12 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
13 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29920
diff
changeset
|
17 */ |
9794 | 18 |
19 #include "config.h" | |
20 | |
16748
ec02252fbaa6
we need stdio.h for SEEK_SET on mingw, patch by Zuxy <zuxy.meng at gmail.com>
faust3
parents:
15461
diff
changeset
|
21 #include <stdio.h> |
9794 | 22 #include <sys/types.h> |
23 #include <sys/stat.h> | |
24 #include <fcntl.h> | |
25 #include <unistd.h> | |
33759 | 26 #if HAVE_SETMODE |
27 #include <io.h> | |
28 #endif | |
9794 | 29 |
30 #include "mp_msg.h" | |
31 #include "stream.h" | |
32 #include "help_mp.h" | |
17012 | 33 #include "m_option.h" |
34 #include "m_struct.h" | |
9794 | 35 |
36 static struct stream_priv_s { | |
37 char* filename; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
38 char *filename2; |
9794 | 39 } stream_priv_dflts = { |
15452 | 40 NULL, NULL |
9794 | 41 }; |
42 | |
43 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
44 /// URL definition | |
25242 | 45 static const m_option_t stream_opts_fields[] = { |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
46 {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
47 {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
9794 | 48 { NULL, NULL, 0, 0, 0, 0, NULL } |
49 }; | |
25691 | 50 static const struct m_struct_st stream_opts = { |
9794 | 51 "file", |
52 sizeof(struct stream_priv_s), | |
53 &stream_priv_dflts, | |
54 stream_opts_fields | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27727
diff
changeset
|
55 }; |
9794 | 56 |
57 static int fill_buffer(stream_t *s, char* buffer, int max_len){ | |
58 int r = read(s->fd,buffer,max_len); | |
59 return (r <= 0) ? -1 : r; | |
60 } | |
61 | |
62 static int write_buffer(stream_t *s, char* buffer, int len) { | |
32794
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
63 int r; |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
64 int wr = 0; |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
65 while (wr < len) { |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
66 r = write(s->fd,buffer,len); |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
67 if (r <= 0) |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
68 return -1; |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
69 wr += r; |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
70 buffer += r; |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
71 } |
77d81e27a176
Fix stream_write_buffer to make sure all requested bytes are written
ranma
parents:
32529
diff
changeset
|
72 return len; |
9794 | 73 } |
74 | |
75 static int seek(stream_t *s,off_t newpos) { | |
76 s->pos = newpos; | |
77 if(lseek(s->fd,s->pos,SEEK_SET)<0) { | |
78 s->eof=1; | |
79 return 0; | |
80 } | |
81 return 1; | |
82 } | |
83 | |
84 static int seek_forward(stream_t *s,off_t newpos) { | |
85 if(newpos<s->pos){ | |
86 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); | |
87 return 0; | |
88 } | |
89 while(s->pos<newpos){ | |
12018 | 90 int len=s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE); |
91 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF | |
92 s->buf_pos=0; | |
93 s->buf_len=len; | |
94 s->pos+=len; | |
9794 | 95 } |
96 return 1; | |
97 } | |
98 | |
21658 | 99 static int control(stream_t *s, int cmd, void *arg) { |
100 switch(cmd) { | |
101 case STREAM_CTRL_GET_SIZE: { | |
102 off_t size; | |
103 | |
104 size = lseek(s->fd, 0, SEEK_END); | |
105 lseek(s->fd, s->pos, SEEK_SET); | |
106 if(size != (off_t)-1) { | |
107 *((off_t*)arg) = size; | |
108 return 1; | |
109 } | |
110 } | |
111 } | |
24257 | 112 return STREAM_UNSUPPORTED; |
21658 | 113 } |
114 | |
9794 | 115 static int open_f(stream_t *stream,int mode, void* opts, int* file_format) { |
116 int f; | |
117 mode_t m = 0; | |
118 off_t len; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
119 unsigned char *filename; |
9794 | 120 struct stream_priv_s* p = (struct stream_priv_s*)opts; |
121 | |
122 if(mode == STREAM_READ) | |
123 m = O_RDONLY; | |
124 else if(mode == STREAM_WRITE) | |
22451
86f7b9cab33b
truncate mencoder's output file if it exists, instead of overwriting just part of it.
lorenm
parents:
21705
diff
changeset
|
125 m = O_RDWR|O_CREAT|O_TRUNC; |
9794 | 126 else { |
10608 | 127 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode); |
9794 | 128 m_struct_free(&stream_opts,opts); |
24257 | 129 return STREAM_UNSUPPORTED; |
9794 | 130 } |
131 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
132 if(p->filename) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
133 filename = p->filename; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
134 else if(p->filename2) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
135 filename = p->filename2; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
136 else |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
137 filename = NULL; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
138 if(!filename) { |
9849 | 139 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n"); |
140 m_struct_free(&stream_opts,opts); | |
141 return STREAM_ERROR; | |
142 } | |
143 | |
30608
c05fbacce55f
Replace platform preprocessor check by HAVE_DOS_PATHS.
komh
parents:
30426
diff
changeset
|
144 #if HAVE_DOS_PATHS |
26005 | 145 // extract '/' from '/x:/path' |
146 if( filename[ 0 ] == '/' && filename[ 1 ] && filename[ 2 ] == ':' ) | |
147 filename++; | |
148 #endif | |
149 | |
9794 | 150 m |= O_BINARY; |
151 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
152 if(!strcmp(filename,"-")){ |
9794 | 153 if(mode == STREAM_READ) { |
154 // read from stdin | |
155 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_ReadSTDIN); | |
156 f=0; // 0=stdin | |
30787
e10ba171be06
Define HAVE_SETMODE conditionally, and use it in stream/stream_file.c instead
komh
parents:
30608
diff
changeset
|
157 #if HAVE_SETMODE |
e10ba171be06
Define HAVE_SETMODE conditionally, and use it in stream/stream_file.c instead
komh
parents:
30608
diff
changeset
|
158 setmode(fileno(stdin),O_BINARY); |
12921 | 159 #endif |
9794 | 160 } else { |
161 mp_msg(MSGT_OPEN,MSGL_INFO,"Writing to stdout\n"); | |
162 f=1; | |
30787
e10ba171be06
Define HAVE_SETMODE conditionally, and use it in stream/stream_file.c instead
komh
parents:
30608
diff
changeset
|
163 #if HAVE_SETMODE |
e10ba171be06
Define HAVE_SETMODE conditionally, and use it in stream/stream_file.c instead
komh
parents:
30608
diff
changeset
|
164 setmode(fileno(stdout),O_BINARY); |
12921 | 165 #endif |
9794 | 166 } |
167 } else { | |
21705
829b1f30a07f
fix compilation on the most delicious variant of unix (mingw) that lacks S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
nicodvb
parents:
21673
diff
changeset
|
168 mode_t openmode = S_IRUSR|S_IWUSR; |
829b1f30a07f
fix compilation on the most delicious variant of unix (mingw) that lacks S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
nicodvb
parents:
21673
diff
changeset
|
169 #ifndef __MINGW32__ |
829b1f30a07f
fix compilation on the most delicious variant of unix (mingw) that lacks S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
nicodvb
parents:
21673
diff
changeset
|
170 openmode |= S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH; |
829b1f30a07f
fix compilation on the most delicious variant of unix (mingw) that lacks S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
nicodvb
parents:
21673
diff
changeset
|
171 #endif |
829b1f30a07f
fix compilation on the most delicious variant of unix (mingw) that lacks S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH
nicodvb
parents:
21673
diff
changeset
|
172 f=open(filename,m, openmode); |
9794 | 173 if(f<0) { |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
174 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename); |
9794 | 175 m_struct_free(&stream_opts,opts); |
9827 | 176 return STREAM_ERROR; |
9794 | 177 } |
178 } | |
179 | |
180 len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); | |
12921 | 181 #ifdef __MINGW32__ |
31883 | 182 // seeks on stdin incorrectly succeed on MinGW |
183 if(f==0) | |
184 len = -1; | |
185 #endif | |
9794 | 186 if(len == -1) { |
21656
32c50eb3ff18
in STREAM_WRITE mode open the stream with O_RDWR|O_CREAT, S_IRUSR|S_IWUSR and disable seek_forward for pipes
nicodvb
parents:
19271
diff
changeset
|
187 if(mode == STREAM_READ) stream->seek = seek_forward; |
9794 | 188 stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE |
29920
4f740437ed2b
Finally rename the STREAM_SEEK define to MP_STREAM_SEEK, there are just too many
reimar
parents:
29304
diff
changeset
|
189 stream->flags |= MP_STREAM_SEEK_FW; |
9794 | 190 } else if(len >= 0) { |
191 stream->seek = seek; | |
192 stream->end_pos = len; | |
193 stream->type = STREAMTYPE_FILE; | |
194 } | |
195 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16748
diff
changeset
|
196 mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len); |
9794 | 197 |
198 stream->fd = f; | |
199 stream->fill_buffer = fill_buffer; | |
200 stream->write_buffer = write_buffer; | |
21658 | 201 stream->control = control; |
32529
0624fa95a2aa
Make the file protocol read up to 64 kB at once when the cache is used,
reimar
parents:
31883
diff
changeset
|
202 stream->read_chunk = 64*1024; |
9794 | 203 |
204 m_struct_free(&stream_opts,opts); | |
205 return STREAM_OK; | |
206 } | |
207 | |
25211 | 208 const stream_info_t stream_info_file = { |
9794 | 209 "File", |
210 "file", | |
211 "Albeu", | |
212 "based on the code from ??? (probably Arpi)", | |
213 open_f, | |
214 { "file", "", NULL }, | |
215 &stream_opts, | |
216 1 // Urls are an option string | |
217 }; |