comparison liboctave/file-ops.cc @ 5138:5fa9670b5956

[project @ 2005-02-09 23:13:03 by jwe]
author jwe
date Wed, 09 Feb 2005 23:13:03 +0000
parents 14dc2267c343
children 8b7b4ffab39c
comparison
equal deleted inserted replaced
5137:5ee7da8b8a4b 5138:5fa9670b5956
307 #else 307 #else
308 msg = NOT_SUPPORTED ("rmdir"); 308 msg = NOT_SUPPORTED ("rmdir");
309 #endif 309 #endif
310 310
311 return status; 311 return status;
312 }
313
314 std::string
315 file_ops::canonicalize_file_name (const std::string& name)
316 {
317 std::string msg;
318 return canonicalize_file_name (name, msg);
319 }
320
321 std::string
322 file_ops::canonicalize_file_name (const std::string& name, std::string& msg)
323 {
324 msg = std::string ();
325
326 std::string retval;
327
328 #if defined (HAVE_CANONICALIZE_FILE_NAME)
329
330 char *tmp = ::canonicalize_file_name (name.c_str ());
331
332 if (tmp)
333 {
334 retval = tmp;
335 ::free (tmp);
336 }
337
338 #elif defined (HAVE_RESOLVEPATH)
339
340 #if !defined (errno)
341 extern int errno;
342 #endif
343
344 #if !defined (__set_errno)
345 # define __set_errno(Val) errno = (Val)
346 #endif
347
348 if (name.empty ())
349 {
350 __set_errno (ENOENT);
351 return retval;
352 }
353
354 // All known hosts with resolvepath (e.g. Solaris 7) don't turn
355 // relative names into absolute ones, so prepend the working
356 // directory if the path is not absolute.
357
358 name = octave_env::make_absolute (name);
359
360 size_t resolved_size = name.length ();
361
362 while (1)
363 {
364 resolved_size = 2 * resolved_size + 1;
365
366 OCTAVE_LOCAL_BUFFER (char, resolved, resolved_size);
367
368 resolved_len = ::resolvepath (name, resolved, resolved_size);
369
370 if (resolved_len < 0)
371 break;
372
373 if (resolved_len < resolved_size)
374 {
375 retval = resolved;
376 break;
377 }
378 }
379
380 #else
381
382 // XXX FIXME XXX -- provide replacement here...
383 retval = name;
384
385 #endif
386
387 if (retval.empty ())
388 {
389 using namespace std;
390 msg = ::strerror (errno);
391 }
392
393 return retval;
312 } 394 }
313 395
314 // We provide a replacement for tempnam(). 396 // We provide a replacement for tempnam().
315 397
316 std::string 398 std::string