Logo AND Algorithmique Numérique Distribuée

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