annotate libmenu/menu_filesel.c @ 10624:cdfd4a43c406

I've juste found a bug which prevent to load a file whose name contain a quote ('). The menu simply execute a "loadfile '%p'" but when the %p is replaced by the actual value, quotes in it are not escaped ! Moreover, mp_input_parse_cmd contain some code to unescape strings but this code was placed after the string was copied in his final buffer. So this patch correct this issue. By Aurlien Jacobs
author albeu
date Fri, 15 Aug 2003 18:45:35 +0000
parents edfe34c5405d
children 261022c048cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
1
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
2 #include <stdlib.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
3 #include <stdio.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
4 #include <dirent.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
5 #include <errno.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
6 #include <string.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
7 #include <sys/types.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
8 #include <sys/stat.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
9 #include <ctype.h>
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
10 #include <unistd.h>
8291
abe95dde3223 limits.h required to get a PATH_MAX definition (on solaris)
jkeil
parents: 8226
diff changeset
11 #include <limits.h>
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
12
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
13
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
14 #include "../config.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
15
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
16 #include "../m_struct.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
17 #include "../m_option.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
18
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
19 #include "img_format.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
20 #include "mp_image.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
21
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
22 #include "menu.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
23 #include "menu_list.h"
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
24 #include "../input/input.h"
9380
edfe34c5405d linux->osdep
arpi
parents: 9249
diff changeset
25 #include "../osdep/keycodes.h"
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
26
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
27 struct list_entry_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
28 struct list_entry p;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
29 int d;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
30 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
31
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
32 struct menu_priv_s {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
33 menu_list_priv_t p;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
34 char* dir; // current dir
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
35 /// Cfg fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
36 char* path;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
37 char* title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
38 char* file_action;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
39 char* dir_action;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
40 int auto_close;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
41 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
42
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
43 static struct menu_priv_s cfg_dflt = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
44 MENU_LIST_PRIV_DFLT,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
45 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
46
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
47 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
48 "Select a file: %p",
8226
4b8fcc2af8f1 quote the filenames
albeu
parents: 8197
diff changeset
49 "loadfile '%p'",
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
50 NULL,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
51 0
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
52 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
53
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
54 #define ST_OFF(m) M_ST_OFF(struct menu_priv_s,m)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
55
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
56 static m_option_t cfg_fields[] = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
57 MENU_LIST_PRIV_FIELDS,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
58 { "path", ST_OFF(path), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
59 { "title", ST_OFF(title), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
60 { "file-action", ST_OFF(file_action), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
61 { "dir-action", ST_OFF(dir_action), CONF_TYPE_STRING, 0, 0, 0, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
62 { "auto-close", ST_OFF(auto_close), CONF_TYPE_FLAG, 0, 0, 1, NULL },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
63 { NULL, NULL, NULL, 0,0,0,NULL }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
64 };
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
65
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
66 #define mpriv (menu->priv)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
67
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
68 static void free_entry(list_entry_t* entry) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
69 free(entry->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
70 free(entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
71 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
72
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
73 static char* replace_path(char* title , char* dir) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
74 char *p = strstr(title,"%p");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
75 if(p) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
76 int tl = strlen(title);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
77 int dl = strlen(dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
78 int t1l = p-title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
79 int l = tl - 2 + dl;
10624
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
80 char *r, *n, *d = dir;
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
81 char term = *(p-1);
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
82
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
83 do {
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
84 if (*d == '\\' || *d == term)
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
85 l++;
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
86 } while (*d++);
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
87 r = malloc(l + 1);
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
88 n = r + t1l;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
89 memcpy(r,title,t1l);
10624
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
90 do {
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
91 if (*dir == '\\' || *dir == term)
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
92 *n++ = '\\';
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
93 } while ((*n++ = *dir++));
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
94 if(tl - t1l - 2 > 0)
10624
cdfd4a43c406 I've juste found a bug which prevent to load a file whose name contain
albeu
parents: 9380
diff changeset
95 strcpy(n-1,p+2);
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
96 return r;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
97 } else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
98 return title;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
99 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
100
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
101 typedef int (*kill_warn)(const void*, const void*);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
102
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
103 static int mylstat(char *dir, char *file,struct stat* st) {
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
104 int l = strlen(dir) + strlen(file);
8613
f88ba181ecf2 some 10l bugfixes
arpi
parents: 8358
diff changeset
105 char s[l+2];
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
106 sprintf(s,"%s/%s",dir,file);
9249
8546faeb0112 lstat->stat
arpi
parents: 9104
diff changeset
107 return stat(s,st);
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
108 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
109
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
110 static int compare(char **a, char **b){
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
111 if((*a)[strlen(*a) - 1] == '/') {
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
112 if((*b)[strlen(*b) - 1] == '/')
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
113 return strcmp(*b, *a) ;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
114 else
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
115 return 1;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
116 } else {
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
117 if((*b)[strlen(*b) - 1] == '/')
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
118 return -1;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
119 else
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
120 return strcmp(*b, *a);
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
121 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
122 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
123
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
124 static int open_dir(menu_t* menu,char* args) {
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
125 char **namelist, **tp;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
126 struct dirent *dp;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
127 struct stat st;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
128 int n;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
129 char* p = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
130 list_entry_t* e;
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
131 DIR* dirp;
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
132
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
133 menu_list_init(menu);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
134
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
135 if(mpriv->dir)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
136 free(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
137 mpriv->dir = strdup(args);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
138 if(mpriv->p.title && mpriv->p.title != mpriv->title && mpriv->p.title != cfg_dflt.p.title)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
139 free(mpriv->p.title);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
140 p = strstr(mpriv->title,"%p");
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
141
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
142 mpriv->p.title = replace_path(mpriv->title,mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
143
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
144 if ((dirp = opendir (mpriv->dir)) == NULL){
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
145 printf("opendir error: %s", strerror(errno));
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
146 return 0;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
147 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
148
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
149 namelist = (char **) malloc(sizeof(char *));
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
150
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
151 n=0;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
152 while ((dp = readdir(dirp)) != NULL) {
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
153 if(dp->d_name[0] == '.' && strcmp(dp->d_name,"..") != 0)
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
154 continue;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
155 if(n%20 == 0){ // Get some more mem
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
156 if((tp = (char **) realloc(namelist, (n+20) * sizeof (char *)))
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
157 == NULL) {
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
158 printf("realloc error: %s", strerror(errno));
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
159 n--;
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
160 goto bailout;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
161 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
162 namelist=tp;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
163 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
164
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
165 namelist[n] = (char *) malloc(strlen(dp->d_name) + 2);
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
166 if(namelist[n] == NULL){
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
167 printf("malloc error: %s", strerror(errno));
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
168 n--;
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
169 goto bailout;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
170 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
171
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
172 strcpy(namelist[n], dp->d_name);
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
173 mylstat(args,namelist[n],&st);
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
174 if(S_ISDIR(st.st_mode))
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
175 strcat(namelist[n], "/");
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
176 n++;
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
177 }
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
178
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
179 bailout:
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
180 qsort(namelist, n, sizeof(char *), (kill_warn)compare);
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
181
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
182 if (n < 0) {
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
183 printf("readdir error: %s\n",strerror(errno));
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
184 return 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
185 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
186 while(n--) {
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
187 if((e = calloc(1,sizeof(list_entry_t))) != NULL){
8613
f88ba181ecf2 some 10l bugfixes
arpi
parents: 8358
diff changeset
188 e->p.next = NULL;
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
189 e->p.txt = strdup(namelist[n]);
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
190 if(strchr(namelist[n], '/') != NULL)
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
191 e->d = 1;
8358
ecf6a4cf3272 No scandir() an no functions defined within other functions.
arpi
parents: 8291
diff changeset
192 menu_list_add_entry(menu,e);
9104
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
193 }else{
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
194 printf("malloc error: %s", strerror(errno));
a0aacfb492a5 Also attached some cleanup to menu_filesel.c, mainly to make it more
arpi
parents: 8853
diff changeset
195 }
8197
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
196 free(namelist[n]);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
197 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
198 free(namelist);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
199
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
200 return 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
201 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
202
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
203
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
204 static void read_cmd(menu_t* menu,int cmd) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
205 mp_cmd_t* c = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
206 switch(cmd) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
207 case MENU_CMD_OK: {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
208 // Directory
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
209 if(mpriv->p.current->d) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
210 if(mpriv->dir_action) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
211 int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
212 char filename[fname_len];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
213 char* str;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
214 sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
215 str = replace_path(mpriv->dir_action,filename);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
216 c = mp_input_parse_cmd(str);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
217 if(str != mpriv->dir_action)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
218 free(str);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
219 } else { // Default action : open this dirctory ourself
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
220 int l = strlen(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
221 char *slash = NULL, *p = NULL;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
222 if(strcmp(mpriv->p.current->p.txt,"../") == 0) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
223 if(l <= 1) break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
224 mpriv->dir[l-1] = '\0';
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
225 slash = strrchr(mpriv->dir,'/');
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
226 if(!slash) break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
227 slash[1] = '\0';
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
228 p = strdup(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
229 } else {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
230 p = malloc(l + strlen(mpriv->p.current->p.txt) + 1);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
231 sprintf(p,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
232 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
233 menu_list_uninit(menu,free_entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
234 if(!open_dir(menu,p)) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
235 printf("Can't open directory %s\n",p);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
236 menu->cl = 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
237 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
238 free(p);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
239 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
240 } else { // Files
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
241 int fname_len = strlen(mpriv->dir) + strlen(mpriv->p.current->p.txt) + 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
242 char filename[fname_len];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
243 char *str;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
244 sprintf(filename,"%s%s",mpriv->dir,mpriv->p.current->p.txt);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
245 str = replace_path(mpriv->file_action,filename);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
246 c = mp_input_parse_cmd(str);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
247 if(str != mpriv->file_action)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
248 free(str);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
249 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
250 if(c) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
251 mp_input_queue_cmd(c);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
252 if(mpriv->auto_close)
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
253 menu->cl = 1;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
254 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
255 } break;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
256 default:
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
257 menu_list_read_cmd(menu,cmd);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
258 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
259 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
260
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
261 static void read_key(menu_t* menu,int c){
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
262 if(c == KEY_BS) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
263 mpriv->p.current = mpriv->p.menu; // Hack : we consider that the first entry is ../
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
264 read_cmd(menu,MENU_CMD_OK);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
265 } else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
266 menu_list_read_key(menu,c,1);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
267 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
268
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
269 static void clos(menu_t* menu) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
270 menu_list_uninit(menu,free_entry);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
271 free(mpriv->dir);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
272 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
273
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
274 static int open_fs(menu_t* menu, char* args) {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
275 char *path = mpriv->path;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
276 int r = 0;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
277 char wd[PATH_MAX+1];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
278 args = NULL; // Warning kill
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
279
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
280 menu->draw = menu_list_draw;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
281 menu->read_cmd = read_cmd;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
282 menu->read_key = read_key;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
283 menu->close = clos;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
284
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
285 getcwd(wd,PATH_MAX);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
286 if(!path || path[0] == '\0') {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
287 int l = strlen(wd) + 2;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
288 char b[l];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
289 sprintf(b,"%s/",wd);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
290 r = open_dir(menu,b);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
291 } else if(path[0] != '/') {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
292 int al = strlen(path);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
293 int l = strlen(wd) + al + 3;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
294 char b[l];
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
295 if(b[al-1] != '/')
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
296 sprintf(b,"%s/%s/",wd,path);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
297 else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
298 sprintf(b,"%s/%s",wd,path);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
299 r = open_dir(menu,b);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
300 } else
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
301 r = open_dir(menu,path);
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
302
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
303 return r;
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
304 }
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
305
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
306 const menu_info_t menu_info_filesel = {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
307 "File seletor menu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
308 "filesel",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
309 "Albeu",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
310 "",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
311 {
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
312 "fs_cfg",
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
313 sizeof(struct menu_priv_s),
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
314 &cfg_dflt,
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
315 cfg_fields
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
316 },
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
317 open_fs
b31caec933e9 OSD menus initial version
albeu
parents:
diff changeset
318 };