Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add the new integrated files version (use xbt data structures instead my own data...
[simgrid.git] / tools / tesh2 / src / getpath.c
1 #include <com.h>\r
2 \r
3 /*#include <stdlib.h>\r
4 #include <string.h>\r
5 \r
6 */\r
7 \r
8 #include <sys/types.h>\r
9 #include <sys/stat.h>\r
10 \r
11 #ifndef WIN32\r
12 #include <pwd.h>\r
13 #else\r
14 #endif\r
15 \r
16 #include <errno.h>\r
17 #include <getpath.h>\r
18 \r
19 #ifndef PATH_MAX\r
20 #define PATH_MAX 255\r
21 #endif\r
22 \r
23 #ifndef WIN32\r
24 int\r
25 getpath(const char* file, char** path)\r
26 {\r
27         char buffer1[PATH_MAX + 1] = {0};\r
28         char buffer2[PATH_MAX + 1] = {0};\r
29         char buffer3[PATH_MAX + 1] = {0};       \r
30         char *p1,*p2;\r
31         size_t len = strlen(file);\r
32         char* last_delimiter = NULL;\r
33         struct stat buffer = {0};               \r
34         \r
35         strncpy(buffer1, file, len);    \r
36         \r
37         /* remove the /////// */\r
38         while((p1 = strstr(buffer1, "//"))) \r
39         {\r
40                 if(p1[2]) \r
41                         strcpy(p1, p1 + 1); \r
42                 else \r
43                         p1[1] = '\0';\r
44         }\r
45         \r
46         if(*buffer1 == '~') \r
47         {\r
48                 for(p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *p2++ = *p1++);\r
49                         *p2 = '\0';                             \r
50                 \r
51                 if(buffer2[0] == '\0') \r
52                 {\r
53                         char* home = getenv("HOME");\r
54         \r
55                         if(home) \r
56                         {\r
57                                 strcpy(buffer2, home);          \r
58                         } \r
59                         else \r
60                         {\r
61                                 struct passwd* pw = getpwuid(getuid());  \r
62                                 \r
63                                 if(!pw) \r
64                                 {\r
65                                         *path = NULL;\r
66                                         return -1;      \r
67                                 }\r
68                                 \r
69                                 strcpy(buffer2,pw->pw_dir);     \r
70                         }\r
71                         \r
72                         strcat(buffer2, p1);\r
73                 } \r
74                 \r
75         }\r
76         else if (buffer1[0] != '/') \r
77         {\r
78         \r
79                 getcwd(buffer2, PATH_MAX + 1);  \r
80                 \r
81                 if(buffer1[0] == '.' && buffer1[1] == '/') \r
82                 {       /* replace */\r
83                         strcat(buffer2, &buffer1[1]);           \r
84                 } \r
85                 else \r
86                 {       \r
87                         strcat(buffer2, "/");                   \r
88                         strcat(buffer2, buffer1);               \r
89                 }\r
90         } \r
91         else \r
92         {       \r
93                 strcpy(buffer2, buffer1);                       /* copy */\r
94         }\r
95                 \r
96         /*\r
97          * check for /..\r
98          */\r
99         while((p1 = strstr( buffer2, "/.." ))) \r
100         {\r
101                 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
102                 \r
103                 if (*(p1 + 3)) \r
104                         memmove(p2, p1+3, strlen(p1+3)+1);\r
105                 else \r
106                         *p2 = '\0';\r
107         }\r
108         \r
109         /*\r
110          * try to find links, and resolve them.\r
111          */\r
112         p1 = strtok( buffer2, "/" );\r
113         \r
114         *buffer3 = '\0';\r
115         \r
116         while(p1) \r
117         {\r
118                 strcat( buffer3, "/" );\r
119                 strcat( buffer3, p1 );\r
120                 \r
121                 len = readlink(buffer3, buffer1, PATH_MAX);\r
122                 \r
123                 if (len != -1) \r
124                 {\r
125                         *(buffer1 + len) = '\0';\r
126                         strcpy(buffer3, buffer1 );\r
127                 }\r
128                 \r
129                 p1 = strtok( NULL, "/" );\r
130         }\r
131         \r
132         if(stat(buffer3, &buffer) || !S_ISREG(buffer.st_mode))\r
133         {\r
134                 *path = NULL;\r
135                 errno = ENOENT;\r
136                 return -1;\r
137         }                                                               \r
138                 \r
139         last_delimiter = strrchr(buffer3, '/');\r
140         \r
141         len = strlen(buffer3);\r
142         \r
143         if(last_delimiter)\r
144                 len -=strlen(last_delimiter);                    \r
145         \r
146         *path = (char*) calloc(len + 1, sizeof(char));\r
147         \r
148         if(!(*path))\r
149         {\r
150                 *path = NULL;\r
151                 return -1;\r
152         }\r
153                 \r
154         strncpy(*path, buffer3, len);\r
155 \r
156         return len;\r
157 }\r
158 \r
159 int\r
160 translatepath(const char* totranslate, char** translated)\r
161 {\r
162         char buffer1[PATH_MAX + 1] = {0};               \r
163         char buffer2[PATH_MAX + 1] = {0};\r
164         char buffer3[PATH_MAX + 1] = {0};       \r
165         char *p1,*p2;\r
166         size_t len;     \r
167         struct stat buffer = {0};\r
168         \r
169         len = strlen(totranslate);                                              \r
170         \r
171         strncpy(buffer1, totranslate, len);     \r
172         \r
173         if(!strcmp(buffer1,"."))\r
174         {\r
175                 *translated = getcwd(NULL,0);\r
176                 return strlen(*translated);\r
177         }\r
178         else if(!strcmp(buffer1, "/.."))\r
179         {\r
180                 *translated = strdup("/");\r
181                 return strlen(*translated);\r
182         }\r
183         \r
184         while((p1 = strstr(buffer1, "//"))) \r
185                 if(p1[2]) \r
186                         strcpy(p1, p1 + 1); \r
187                 else \r
188                         p1[1] = '\0';\r
189         \r
190         \r
191         \r
192         if (buffer1[0] == '~') \r
193         {\r
194                 for (p2 = buffer2, p1 = buffer1 + 1; *p1 && (*p1 != '/'); *(p2++) = *(p1++));\r
195                 \r
196                 *p2 = '\0';                             \r
197                 \r
198                 if(buffer2[0] == '\0') \r
199                 {\r
200                         char* home = getenv("HOME");\r
201         \r
202                         if(home) \r
203                         {\r
204                                 strcpy(buffer2, home);\r
205                         } \r
206                         else \r
207                         {\r
208                                 struct passwd* pw = getpwuid(getuid());  /* get entry */\r
209                                 \r
210                                 if(!pw)\r
211                                 {\r
212                                         *translated = NULL; \r
213                                         return -1;\r
214                                 }\r
215                                 \r
216                                 strcpy(buffer2,pw->pw_dir);     \r
217                         }\r
218                         \r
219                         strcat(buffer2, p1);\r
220                 } \r
221         }\r
222         else if (*buffer1 != '/') \r
223         {\r
224         \r
225                 getcwd(buffer2, PATH_MAX + 1);\r
226                 \r
227                 if (*buffer1 == '.' && *(buffer1 + 1) == '/') \r
228                 {\r
229                         strcat(buffer2, buffer1+1);             \r
230                 } \r
231                 else \r
232                 {       \r
233                         strcat(buffer2, "/");                   \r
234                         strcat(buffer2, buffer1);               \r
235                 }\r
236         } \r
237         else \r
238         {       \r
239                 strcpy(buffer2, buffer1);                       \r
240         }\r
241         \r
242         /*\r
243          * check for /..\r
244          */\r
245         while((p1 = strstr( buffer2, "/.." ))) \r
246         {\r
247                 for( p2 = p1; --p2 > buffer2 && *p2 != '/'; );\r
248                 \r
249                 if (*(p1 + 3)) \r
250                         memmove(p2, p1+3, strlen(p1+3)+1);\r
251                 else \r
252                         *p2 = '\0';\r
253         }\r
254         \r
255         /*\r
256          * try to find links.\r
257          */\r
258         p1 = strtok( buffer2, "/" );\r
259         \r
260         \r
261         *buffer3 = '\0';\r
262         \r
263         while(p1) \r
264         {\r
265                 strcat( buffer3, "/" );\r
266                 strcat( buffer3, p1 );\r
267                 \r
268                 len = readlink(buffer3, buffer1, PATH_MAX);\r
269                 \r
270                 if (len != -1) \r
271                 {\r
272                         *(buffer1 + len) = '\0';\r
273                         strcpy(buffer3, buffer1 );\r
274                 }\r
275                 \r
276                 p1 = strtok( NULL, "/" );\r
277         }\r
278         \r
279         if (!(*buffer3)) \r
280                 strcpy(buffer3, "/" );          \r
281         \r
282         len = strlen(buffer3);\r
283         \r
284         if(stat(buffer3, &buffer) || !S_ISDIR(buffer.st_mode))\r
285         {\r
286                 *translated = NULL;\r
287                 errno = ENOTDIR;\r
288                 return -1;\r
289         }\r
290                                  \r
291         \r
292         *translated = (char*) calloc(len + 1, sizeof(char));\r
293         \r
294         if(!(*translated))\r
295         {\r
296                 *translated = NULL;\r
297                 return -1;\r
298         }\r
299         \r
300         strncpy(*translated, buffer3, len);\r
301         \r
302         return len;\r
303 }\r
304 #else\r
305 int\r
306 getpath(const char* file, char** path)\r
307 {\r
308         DWORD len;\r
309         char* part = NULL;\r
310         char buffer[PATH_MAX + 1] = {0}; \r
311         struct stat info = {0};\r
312         \r
313         len = GetFullPathName(file, PATH_MAX, buffer, &part );\r
314         \r
315         if(!len)\r
316         {\r
317                 *path = NULL;\r
318                 return -1;\r
319         }\r
320 \r
321         \r
322         if(stat(buffer, &info) || !S_ISREG(info.st_mode))\r
323         {\r
324                 *path = NULL;\r
325                 errno = ENOENT;\r
326                 return -1;\r
327         }               \r
328         \r
329         *path = (char*)calloc(strlen(buffer) - strlen(part), sizeof(char));\r
330 \r
331 \r
332         *path = strncpy(*path, buffer, strlen(buffer) - strlen(part) - 1);\r
333 \r
334         return (int)(strlen(buffer) - strlen(part) -1);\r
335 }\r
336 \r
337 int\r
338 translatepath(const char* totranslate, char** translated)\r
339 {\r
340 \r
341         return 0;\r
342 }\r
343 \r
344 #endif\r
345 \r
346 \r