Annotation of /trunk/transcode/patches/transcode-1.0.3-bigdir.patch
Parent Directory | Revision Log
Revision 618 -
(hide annotations)
(download)
Thu May 29 09:17:35 2008 UTC (16 years, 4 months ago) by niro
File size: 10742 byte(s)
Thu May 29 09:17:35 2008 UTC (16 years, 4 months ago) by niro
File size: 10742 byte(s)
-fixes for 1.0.3
1 | niro | 618 | Submitted By: Chipster <chipster19@free.fr> |
2 | Date: 2007-06-02 | ||
3 | Initial Package Version: 1.0.3 | ||
4 | Upstream Status: Unknown | ||
5 | Origin: http://mirror.linux.org.mt/mirror/gentoo-portage/media-video/transcode/files | ||
6 | Description: | ||
7 | |||
8 | --- transcode-1.0.3/import/iodump.c.old 2005-07-04 09:09:34.000000000 +0200 | ||
9 | +++ transcode-1.0.3/import/iodump.c 2005-11-20 23:35:22.000000000 +0100 | ||
10 | @@ -52,139 +52,217 @@ | ||
11 | |||
12 | static int verbose_flag=TC_QUIET; | ||
13 | |||
14 | -static DIR *dir=NULL; | ||
15 | +typedef struct tcdirlist_ TCDirList; | ||
16 | +struct tcdirlist_ { | ||
17 | + DIR *dir; /* for internal use */ | ||
18 | + | ||
19 | + const char *dir_name; /* saved base path */ | ||
20 | + const char *path_sep; /* optional *nix path separator */ | ||
21 | + | ||
22 | + char filename[PATH_MAX + 2]; | ||
23 | + /* | ||
24 | + * full path of file actually under focus + optional separator + | ||
25 | + * final string terminator | ||
26 | + */ | ||
27 | + char **entries; | ||
28 | + /* array of full PATHs of files in scanned dirlist */ | ||
29 | + | ||
30 | + int nfiles; /* (current) number of files in dirlist */ | ||
31 | + int findex; /* index of file under focus */ | ||
32 | + int buffered; | ||
33 | + /* boolean flag: above array of file in directory is valid? */ | ||
34 | +}; | ||
35 | |||
36 | -static char filename[PATH_MAX+2]; | ||
37 | |||
38 | -static char **rbuf_ptr; | ||
39 | - | ||
40 | -static int nfiles=0, findex=0, buffered=0; | ||
41 | - | ||
42 | -int open_directory(char *dir_name) | ||
43 | +static int compare_name(const void *file1_ptr, const void *file2_ptr) | ||
44 | { | ||
45 | - if((dir = opendir(dir_name))==NULL) return(-1); | ||
46 | - return(0); | ||
47 | + return strcoll(*(const char **)file1_ptr, *(const char **)file2_ptr); | ||
48 | } | ||
49 | |||
50 | -static char *scan_directory(char *dir_name) | ||
51 | -{ | ||
52 | - struct dirent *dent; | ||
53 | - char *end_of_dir; | ||
54 | - int len; | ||
55 | - | ||
56 | - if (dir_name == 0) return NULL; | ||
57 | - if (dir == 0) return NULL; | ||
58 | - | ||
59 | - len = strlen( dir_name ); | ||
60 | - end_of_dir = &dir_name[ len - 1 ]; | ||
61 | - | ||
62 | - if ( *end_of_dir != '/' ) { | ||
63 | - end_of_dir++; | ||
64 | - *end_of_dir = '/'; | ||
65 | - end_of_dir++; | ||
66 | - *end_of_dir = 0; | ||
67 | - } | ||
68 | - | ||
69 | - switch(buffered) { | ||
70 | - | ||
71 | - case 0: | ||
72 | - | ||
73 | - while((dent = readdir( dir ))!=NULL) { | ||
74 | - | ||
75 | - if((strncmp(dent->d_name, ".", 1)==0) || (strcmp(dent->d_name, "..")==0)) | ||
76 | - continue; | ||
77 | - | ||
78 | - snprintf(filename, sizeof(filename), "%s%s", dir_name, dent->d_name); | ||
79 | +static int tc_dirlist_next(TCDirList *tcdir) | ||
80 | +{ | ||
81 | + struct dirent *dent = NULL; | ||
82 | + int have_file = 0; | ||
83 | |||
84 | - //counter | ||
85 | - ++nfiles; | ||
86 | - | ||
87 | - return(filename); | ||
88 | - } | ||
89 | - | ||
90 | - break; | ||
91 | - | ||
92 | - case 1: | ||
93 | - | ||
94 | - if (findex < nfiles) { | ||
95 | - return(rbuf_ptr[findex++]); | ||
96 | - } else { | ||
97 | - return(NULL); | ||
98 | - } | ||
99 | + if (tcdir == NULL) { | ||
100 | + return -1; | ||
101 | + } | ||
102 | |||
103 | - break; | ||
104 | - } | ||
105 | - | ||
106 | - return(NULL); | ||
107 | + do { | ||
108 | + dent = readdir(tcdir->dir); | ||
109 | + if (dent == NULL) { | ||
110 | + break; /* all entries in dirlist have been processed */ | ||
111 | + } | ||
112 | + | ||
113 | + if ((strncmp(dent->d_name, ".", 1) != 0) | ||
114 | + && (strcmp(dent->d_name, "..") != 0)) { | ||
115 | + /* discard special files */ | ||
116 | + have_file = 1; | ||
117 | + } | ||
118 | + | ||
119 | + } while (!have_file); | ||
120 | + | ||
121 | + if (have_file) { | ||
122 | + int res = snprintf(tcdir->filename, sizeof(tcdir->filename), | ||
123 | + "%s%s%s", tcdir->dir_name, tcdir->path_sep, | ||
124 | + dent->d_name); | ||
125 | + /* enforce string terminator */ | ||
126 | + tcdir->filename[sizeof(tcdir->filename)] = '\0'; | ||
127 | + tc_test_string(__FILE__, __LINE__, | ||
128 | + sizeof(tcdir->filename), res, errno); | ||
129 | + return 0; | ||
130 | + } | ||
131 | + return 1; | ||
132 | } | ||
133 | |||
134 | - | ||
135 | -static int compare_name(char **file1_ptr, char **file2_ptr) | ||
136 | +static int tc_dirlist_sortbuf(TCDirList *tcdir) | ||
137 | { | ||
138 | - return strcoll(*file1_ptr, *file2_ptr); | ||
139 | -} | ||
140 | + int n = 0; | ||
141 | |||
142 | + if (tcdir == NULL) { | ||
143 | + return -1; | ||
144 | + } | ||
145 | |||
146 | -int sortbuf_directory(char *dir_name) | ||
147 | -{ | ||
148 | - struct dirent *dent; | ||
149 | - char *end_of_dir; | ||
150 | - int n, len; | ||
151 | + tcdir->entries = malloc(tcdir->nfiles * sizeof(char *)); | ||
152 | + if (tcdir->entries == NULL) { | ||
153 | + fprintf(stderr, "(%s) can't allocate memory for " | ||
154 | + "directory entries\n", __FILE__); | ||
155 | + return -1; | ||
156 | + } | ||
157 | |||
158 | - int (*func) (); | ||
159 | - | ||
160 | - if (dir_name == 0) return(-1); | ||
161 | - if (dir == 0) return(-1); | ||
162 | - if(nfiles == 0) return(-1); | ||
163 | - | ||
164 | - len = strlen( dir_name ); | ||
165 | - end_of_dir = &dir_name[ len - 1 ]; | ||
166 | - | ||
167 | - if ( *end_of_dir != '/' ) { | ||
168 | - end_of_dir++; | ||
169 | - *end_of_dir = '/'; | ||
170 | - end_of_dir++; | ||
171 | - *end_of_dir = 0; | ||
172 | - } | ||
173 | - | ||
174 | - if((rbuf_ptr = (char **) calloc(nfiles, sizeof(char *)))==NULL) { | ||
175 | - perror("out of memory"); | ||
176 | - return(-1); | ||
177 | - } | ||
178 | - | ||
179 | - n=0; | ||
180 | + while (tc_dirlist_next(tcdir) == 0) { | ||
181 | + tcdir->entries[n] = strdup(tcdir->filename); | ||
182 | + if (tcdir->entries[n] == NULL) { | ||
183 | + fprintf(stderr, "(%s) can't memorize dirlist entry " | ||
184 | + "for '%s'\n", __FILE__, | ||
185 | + tcdir->filename); | ||
186 | + } | ||
187 | + n++; | ||
188 | + } | ||
189 | |||
190 | - while((dent = readdir( dir ))!=NULL) { | ||
191 | - | ||
192 | - if((strncmp(dent->d_name, ".", 1)==0) || (strcmp(dent->d_name, "..")==0)) | ||
193 | - continue; | ||
194 | - | ||
195 | - snprintf(filename, sizeof(filename), "%s%s", dir_name, dent->d_name); | ||
196 | - rbuf_ptr[n++] = strdup(filename); | ||
197 | - } | ||
198 | - | ||
199 | - // sorting | ||
200 | + qsort(tcdir->entries, tcdir->nfiles, sizeof(char *), compare_name); | ||
201 | |||
202 | - func = compare_name; | ||
203 | + tcdir->buffered = 1; | ||
204 | + tcdir->findex = 0; | ||
205 | |||
206 | - qsort(rbuf_ptr, nfiles, sizeof(char *), func); | ||
207 | + return 0; | ||
208 | +} | ||
209 | + | ||
210 | +static int tc_dirlist_set_path_sep(TCDirList *tcdir) | ||
211 | +{ | ||
212 | + size_t len = 0; | ||
213 | + char end_of_dir; | ||
214 | |||
215 | - buffered=1; | ||
216 | - findex=0; | ||
217 | + len = strlen(tcdir->dir_name); | ||
218 | + if (len == 0) { | ||
219 | + return -1; | ||
220 | + } | ||
221 | |||
222 | - return(0); | ||
223 | + end_of_dir = tcdir->dir_name[len - 1]; | ||
224 | + if (end_of_dir == '/') { | ||
225 | + tcdir->path_sep = ""; | ||
226 | + } else { | ||
227 | + tcdir->path_sep = "/"; | ||
228 | + } | ||
229 | + | ||
230 | + return 0; | ||
231 | +} | ||
232 | + | ||
233 | +static int tc_dirlist_file_count(TCDirList *tcdir) | ||
234 | +{ | ||
235 | + if (tcdir == NULL) { | ||
236 | + return -1; | ||
237 | + } | ||
238 | + return tcdir->nfiles; | ||
239 | } | ||
240 | |||
241 | |||
242 | -void close_directory() | ||
243 | +static int tc_dirlist_open(TCDirList *tcdir, const char *dirname) | ||
244 | +{ | ||
245 | + int ret; | ||
246 | + | ||
247 | + if (tcdir == NULL) { | ||
248 | + return -1; | ||
249 | + } | ||
250 | + | ||
251 | + tcdir->filename[0] = '\0'; | ||
252 | + tcdir->entries = NULL; | ||
253 | + tcdir->nfiles = 0; | ||
254 | + tcdir->findex = 0; | ||
255 | + tcdir->buffered = 0; | ||
256 | + tcdir->dir_name = dirname; | ||
257 | + | ||
258 | + ret = tc_dirlist_set_path_sep(tcdir); | ||
259 | + if (ret != 0) { | ||
260 | + return ret; | ||
261 | + } | ||
262 | + | ||
263 | + tcdir->dir = opendir(dirname); | ||
264 | + if (tcdir->dir == NULL) { | ||
265 | + return -1; | ||
266 | + } | ||
267 | + | ||
268 | + rewinddir(tcdir->dir); | ||
269 | + while (tc_dirlist_next(tcdir) == 0) { | ||
270 | + tcdir->nfiles++; | ||
271 | + } | ||
272 | + rewinddir(tcdir->dir); | ||
273 | + | ||
274 | + return 0; | ||
275 | +} | ||
276 | + | ||
277 | +static void tc_dirlist_close(TCDirList *tcdir) | ||
278 | { | ||
279 | - if(dir!=NULL) closedir(dir); | ||
280 | - dir=NULL; | ||
281 | + if (tcdir != NULL) { | ||
282 | + if (tcdir->buffered == 1) { | ||
283 | + int i = 0; | ||
284 | + for (i = 0; i < tcdir->nfiles; i++) { | ||
285 | + if (tcdir->entries[i] != NULL) { | ||
286 | + /* should be always true */ | ||
287 | + free(tcdir->entries[i]); | ||
288 | + tcdir->nfiles--; | ||
289 | + } | ||
290 | + } | ||
291 | + | ||
292 | + if (tcdir->entries != NULL) { | ||
293 | + /* should be always true */ | ||
294 | + free(tcdir->entries); | ||
295 | + } | ||
296 | + | ||
297 | + if (tcdir->nfiles > 0) { | ||
298 | + /* should never happen */ | ||
299 | + fprintf(stderr, "(%s) left out %i directory entries", | ||
300 | + __FILE__, tcdir->nfiles); | ||
301 | + } | ||
302 | + } | ||
303 | + | ||
304 | + if (tcdir->dir != NULL) { | ||
305 | + closedir(tcdir->dir); | ||
306 | + tcdir->dir = NULL; | ||
307 | + } | ||
308 | + } | ||
309 | } | ||
310 | |||
311 | -void freebuf_directory() | ||
312 | +static char *tc_dirlist_scan(TCDirList *tcdir) | ||
313 | { | ||
314 | - free(rbuf_ptr); | ||
315 | + char *ret = NULL; | ||
316 | + | ||
317 | + if (tcdir == NULL) { | ||
318 | + return NULL; | ||
319 | + } | ||
320 | + | ||
321 | + if (tcdir->buffered == 0) { | ||
322 | + if (tc_dirlist_next(tcdir) == 0) { | ||
323 | + ret = tcdir->filename; | ||
324 | + } | ||
325 | + } else { /* tcdir->buffered == 0 */ | ||
326 | + /* buffered */ | ||
327 | + if (tcdir->findex < tcdir->nfiles) { | ||
328 | + ret = tcdir->entries[tcdir->findex++]; | ||
329 | + } | ||
330 | + } | ||
331 | + | ||
332 | + return ret; | ||
333 | } | ||
334 | |||
335 | /* ------------------------------------------------------------ | ||
336 | @@ -203,6 +281,7 @@ | ||
337 | |||
338 | info_t ipipe_avi; | ||
339 | |||
340 | + TCDirList tcdir; | ||
341 | #ifdef NET_STREAM | ||
342 | struct sockaddr_in sin; | ||
343 | struct hostent *hp; | ||
344 | @@ -326,13 +405,13 @@ | ||
345 | |||
346 | //PASS 1: check file type - file order not important | ||
347 | |||
348 | - if((open_directory(ipipe->name))<0) { | ||
349 | + if(tc_dirlist_open(&tcdir, ipipe->name)<0) { | ||
350 | fprintf(stderr, "(%s) unable to open directory \"%s\"\n", __FILE__, ipipe->name); | ||
351 | exit(1); | ||
352 | } else if(verbose_flag & TC_DEBUG) | ||
353 | fprintf(stderr, "(%s) scanning directory \"%s\"\n", __FILE__, ipipe->name); | ||
354 | |||
355 | - while((name=scan_directory(ipipe->name))!=NULL) { | ||
356 | + while((name=tc_dirlist_scan(&tcdir))!=NULL) { | ||
357 | |||
358 | if((ipipe->fd_in = open(name, O_RDONLY))<0) { | ||
359 | perror("file open"); | ||
360 | @@ -386,7 +465,7 @@ | ||
361 | } // check itype | ||
362 | } // process files | ||
363 | |||
364 | - close_directory(); | ||
365 | + tc_dirlist_close(&tcdir); | ||
366 | |||
367 | if(!found) { | ||
368 | fprintf(stderr,"\nerror: no valid files found in %s\n", name); | ||
369 | @@ -398,17 +477,17 @@ | ||
370 | |||
371 | //PASS 2: dump files in correct order | ||
372 | |||
373 | - if((open_directory(ipipe->name))<0) { | ||
374 | + if(tc_dirlist_open(&tcdir, ipipe->name)<0) { | ||
375 | fprintf(stderr, "(%s) unable to sort directory entries\"%s\"\n", __FILE__, name); | ||
376 | exit(1); | ||
377 | } | ||
378 | |||
379 | - if((sortbuf_directory(ipipe->name))<0) { | ||
380 | + if(tc_dirlist_sortbuf(&tcdir)<0) { | ||
381 | fprintf(stderr, "(%s) unable to sort directory entries\"%s\"\n", __FILE__, name); | ||
382 | exit(1); | ||
383 | } | ||
384 | |||
385 | - while((name=scan_directory(ipipe->name))!=NULL) { | ||
386 | + while((name=tc_dirlist_scan(&tcdir))!=NULL) { | ||
387 | |||
388 | if((ipipe->fd_in = open(name, O_RDONLY))<0) { | ||
389 | perror("file open"); | ||
390 | @@ -480,9 +559,8 @@ | ||
391 | close(ipipe->fd_in); | ||
392 | |||
393 | }//process files | ||
394 | - | ||
395 | - close_directory(); | ||
396 | - freebuf_directory(); | ||
397 | + | ||
398 | + tc_dirlist_close(&tcdir); | ||
399 | |||
400 | break; | ||
401 | } | ||
402 | @@ -492,24 +570,25 @@ | ||
403 | int fileinfo_dir(char *dname, int *fd, long *magic) | ||
404 | { | ||
405 | char *name=NULL; | ||
406 | + TCDirList tcdir; | ||
407 | |||
408 | //check file type - file order not important | ||
409 | |||
410 | - if((open_directory(dname))<0) { | ||
411 | + if(tc_dirlist_open(&tcdir, dname)<0) { | ||
412 | fprintf(stderr, "(%s) unable to open directory \"%s\"\n", __FILE__, dname); | ||
413 | exit(1); | ||
414 | } else if(verbose_flag & TC_DEBUG) | ||
415 | |||
416 | fprintf(stderr, "(%s) scanning directory \"%s\"\n", __FILE__, dname); | ||
417 | |||
418 | - if((name=scan_directory(dname))==NULL) return(-1); | ||
419 | + if((name=tc_dirlist_scan(&tcdir))==NULL) return(-1); | ||
420 | |||
421 | if((*fd= open(name, O_RDONLY))<0) { | ||
422 | perror("open file"); | ||
423 | return(-1); | ||
424 | } | ||
425 | |||
426 | - close_directory(); | ||
427 | + tc_dirlist_close(&tcdir); | ||
428 | |||
429 | //first valid magic must be the same for all | ||
430 | //files to follow, but is not checked here |