Mercurial > mplayer.hg
annotate sub/unrar_exec.c @ 32972:fbaae7fe1a13
Fix several issues with Translate().
1. The "Unsafe!" comment has been removed, because the strings passed
to the function are strcpy'd.
2. The needless memsets (one of which with wrong size) have been removed
in favor of a sufficiently simple initialization of trbuf.
3. The array indices are unsigned now, and the manual optimization of
having strlen() outside the for loop has been removed in favor of
optimization performed by the compiler.
4. There is a check now to prevent an out-of-bounds array access.
author | ib |
---|---|
date | Tue, 08 Mar 2011 20:56:51 +0000 |
parents | 22888a8cb312 |
children | 804c3926503b |
rev | line source |
---|---|
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
1 /* |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
2 * List files and extract file from rars by using external executable unrar. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
3 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
4 * Copyright (C) 2005 Jindrich Makovicka <makovick gmail com> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
5 * Copyright (C) 2007 Ulion <ulion2002 gmail com> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
6 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
7 * This file is part of MPlayer. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
8 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
9 * MPlayer is free software; you can redistribute it and/or modify |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
10 * it under the terms of the GNU General Public License as published by |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
11 * the Free Software Foundation; either version 2 of the License, or |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
12 * (at your option) any later version. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
13 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
14 * MPlayer is distributed in the hope that it will be useful, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
17 * GNU General Public License for more details. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
18 * |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
19 * You should have received a copy of the GNU General Public License along |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
20 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
22 */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
23 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
24 #include <sys/wait.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
25 #include <unistd.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
26 #include <fcntl.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
27 #include <stdlib.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
28 #include <stdio.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
29 #include <string.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
30 #include <errno.h> |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
31 #include <locale.h> |
32464
22888a8cb312
Do not use a path for including files in the same directory.
reimar
parents:
32459
diff
changeset
|
32 #include "unrar_exec.h" |
32459
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
33 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
34 #include "mp_msg.h" |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
35 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
36 #define UNRAR_LIST 1 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
37 #define UNRAR_EXTRACT 2 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
38 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
39 char* unrar_executable = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
40 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
41 static FILE* launch_pipe(pid_t *apid, const char *executable, int action, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
42 const char *archive, const char *filename) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
43 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
44 if (!executable || access(executable, R_OK | X_OK)) return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
45 if (access(archive, R_OK)) return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
46 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
47 int mypipe[2]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
48 pid_t pid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
49 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
50 if (pipe(mypipe)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
51 mp_msg(MSGT_GLOBAL, MSGL_ERR, "UnRAR: Cannot create pipe.\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
52 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
53 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
54 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
55 pid = fork(); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
56 if (pid == 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
57 /* This is the child process. Execute the unrar executable. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
58 close(mypipe[0]); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
59 // Close MPlayer's stdin, stdout and stderr so the unrar binary |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
60 // can not mess them up. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
61 // TODO: Close all other files except the pipe. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
62 close(0); close(1); close(2); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
63 // Assign new stdin, stdout and stderr and check they actually got the |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
64 // right descriptors. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
65 if (open("/dev/null", O_RDONLY) != 0 || dup(mypipe[1]) != 1 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
66 || open("/dev/null", O_WRONLY) != 2) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
67 _exit(EXIT_FAILURE); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
68 if (action == UNRAR_LIST) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
69 execl(executable, executable, "v", archive, NULL); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
70 else if (action == UNRAR_EXTRACT) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
71 execl(executable, executable, "p", "-inul", "-p-", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
72 archive,filename,NULL); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
73 mp_msg(MSGT_GLOBAL, MSGL_ERR, "UnRAR: Cannot execute %s\n", executable); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
74 _exit(EXIT_FAILURE); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
75 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
76 if (pid < 0) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
77 /* The fork failed. Report failure. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
78 mp_msg(MSGT_GLOBAL, MSGL_ERR, "UnRAR: Fork failed\n"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
79 return NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
80 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
81 /* This is the parent process. Prepare the pipe stream. */ |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
82 close(mypipe[1]); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
83 *apid = pid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
84 if (action == UNRAR_LIST) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
85 mp_msg(MSGT_GLOBAL, MSGL_V, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
86 "UnRAR: call unrar with command line: %s v %s\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
87 executable, archive); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
88 else if (action == UNRAR_EXTRACT) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
89 mp_msg(MSGT_GLOBAL, MSGL_V, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
90 "UnRAR: call unrar with command line: %s p -inul -p- %s %s\n", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
91 executable, archive, filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
92 return fdopen(mypipe[0], "r"); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
93 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
94 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
95 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
96 #define ALLOC_INCR 1 * 1024 * 1024 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
97 int unrar_exec_get(unsigned char **output, unsigned long *size, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
98 const char *filename, const char *rarfile) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
99 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
100 int bufsize = ALLOC_INCR, bytesread; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
101 pid_t pid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
102 int status = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
103 FILE *rar_pipe; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
104 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
105 rar_pipe=launch_pipe(&pid,unrar_executable,UNRAR_EXTRACT,rarfile,filename); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
106 if (!rar_pipe) return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
107 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
108 *size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
109 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
110 *output = malloc(bufsize); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
111 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
112 while (*output) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
113 bytesread=fread(*output+*size, 1, bufsize-*size, rar_pipe); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
114 if (bytesread <= 0) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
115 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
116 *size += bytesread; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
117 if (*size == bufsize) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
118 char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
119 bufsize += ALLOC_INCR; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
120 p = realloc(*output, bufsize); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
121 if (!p) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
122 free(*output); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
123 *output = p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
124 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
125 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
126 fclose(rar_pipe); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
127 pid = waitpid(pid, &status, 0); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
128 if (!*output || !*size || (pid == -1 && errno != ECHILD) || |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
129 (pid > 0 && status)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
130 free(*output); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
131 *output = NULL; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
132 *size = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
133 return 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
134 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
135 if (bufsize > *size) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
136 char *p = realloc(*output, *size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
137 if (p) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
138 *output = p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
139 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
140 mp_msg(MSGT_GLOBAL, MSGL_V, "UnRAR: got file %s len %lu\n", filename,*size); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
141 return 1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
142 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
143 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
144 #define PARSE_NAME 0 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
145 #define PARSE_PROPS 1 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
146 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
147 int unrar_exec_list(const char *rarfile, ArchiveList_struct **list) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
148 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
149 char buf[1024], fname[1024]; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
150 char *p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
151 pid_t pid; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
152 int status = 0, file_num = -1, ignore_next_line = 0, state = PARSE_NAME; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
153 FILE *rar_pipe; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
154 ArchiveList_struct *alist = NULL, *current = NULL, *new; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
155 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
156 rar_pipe = launch_pipe(&pid, unrar_executable, UNRAR_LIST, rarfile, NULL); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
157 if (!rar_pipe) return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
158 while (fgets(buf, sizeof(buf), rar_pipe)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
159 int packsize, unpsize, ratio, day, month, year, hour, min; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
160 int llen = strlen(buf); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
161 // If read nothing, we got a file_num -1. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
162 if (file_num == -1) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
163 file_num = 0; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
164 if (buf[llen-1] != '\n') |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
165 // The line is too long, ignore it. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
166 ignore_next_line = 2; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
167 if (ignore_next_line) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
168 --ignore_next_line; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
169 state = PARSE_NAME; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
170 continue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
171 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
172 // Trim the line. |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
173 while (llen > 0 && strchr(" \t\n\r\v\f", buf[llen-1])) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
174 --llen; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
175 buf[llen] = '\0'; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
176 p = buf; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
177 while (*p && strchr(" \t\n\r\v\f", *p)) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
178 ++p; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
179 if (!*p) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
180 state = PARSE_NAME; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
181 continue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
182 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
183 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
184 if (state == PARSE_PROPS && sscanf(p, "%d %d %d%% %d-%d-%d %d:%d", |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
185 &unpsize, &packsize, &ratio, &day, |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
186 &month, &year, &hour, &min) == 8) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
187 new = calloc(1, sizeof(ArchiveList_struct)); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
188 if (!new) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
189 file_num = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
190 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
191 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
192 if (!current) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
193 alist = new; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
194 else |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
195 current->next = new; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
196 current = new; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
197 current->item.Name = strdup(fname); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
198 state = PARSE_NAME; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
199 if (!current->item.Name) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
200 file_num = -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
201 break; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
202 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
203 current->item.PackSize = packsize; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
204 current->item.UnpSize = unpsize; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
205 ++file_num; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
206 continue; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
207 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
208 strcpy(fname, p); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
209 state = PARSE_PROPS; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
210 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
211 fclose(rar_pipe); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
212 pid = waitpid(pid, &status, 0); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
213 if (file_num < 0 || (pid == -1 && errno != ECHILD) || |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
214 (pid > 0 && status)) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
215 unrar_exec_freelist(alist); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
216 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
217 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
218 if (!alist) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
219 return -1; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
220 *list = alist; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
221 mp_msg(MSGT_GLOBAL, MSGL_V, "UnRAR: list got %d files\n", file_num); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
222 return file_num; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
223 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
224 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
225 void unrar_exec_freelist(ArchiveList_struct *list) |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
226 { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
227 ArchiveList_struct* tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
228 |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
229 while (list) { |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
230 tmp = list->next; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
231 free(list->item.Name); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
232 free(list); |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
233 list = tmp; |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
234 } |
1a605463f62b
Move vobsub.[ch] and unrar_exec.[ch] to the sub directory.
cigaes
parents:
diff
changeset
|
235 } |