adaint.c (__gnat_is_absolute_path): For VxWorks systems we accept dir/file...
2007-08-14 Jose Ruiz <ruiz@adacore.com> * adaint.c (__gnat_is_absolute_path): For VxWorks systems we accept dir/file, device:/dir/file, and device:drive_letter:/dir/file as representing absolute path names. __gnat_set_file_time_name [VMS]: Fix some 64/32 bit issues. * cstreams.c (__gnat_full_name for VxWorks): Use __gnat_is_absolute_path to detect whether we need to add the current directory to normalize the path. From-SVN: r127437
This commit is contained in:
parent
50b8a7b807
commit
fdcf961c8e
|
@ -101,6 +101,7 @@
|
||||||
|
|
||||||
/* Header files and definitions for __gnat_set_file_time_name. */
|
/* Header files and definitions for __gnat_set_file_time_name. */
|
||||||
|
|
||||||
|
#define __NEW_STARLET 1
|
||||||
#include <vms/rms.h>
|
#include <vms/rms.h>
|
||||||
#include <vms/atrdef.h>
|
#include <vms/atrdef.h>
|
||||||
#include <vms/fibdef.h>
|
#include <vms/fibdef.h>
|
||||||
|
@ -119,17 +120,18 @@
|
||||||
Y = tmptime * 10000000 + reftime; }
|
Y = tmptime * 10000000 + reftime; }
|
||||||
|
|
||||||
/* descrip.h doesn't have everything ... */
|
/* descrip.h doesn't have everything ... */
|
||||||
|
typedef struct fibdef* __fibdef_ptr32 __attribute__ (( mode (SI) ));
|
||||||
struct dsc$descriptor_fib
|
struct dsc$descriptor_fib
|
||||||
{
|
{
|
||||||
unsigned long fib$l_len;
|
unsigned int fib$l_len;
|
||||||
struct fibdef *fib$l_addr;
|
__fibdef_ptr32 fib$l_addr;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* I/O Status Block. */
|
/* I/O Status Block. */
|
||||||
struct IOSB
|
struct IOSB
|
||||||
{
|
{
|
||||||
unsigned short status, count;
|
unsigned short status, count;
|
||||||
unsigned long devdep;
|
unsigned int devdep;
|
||||||
};
|
};
|
||||||
|
|
||||||
static char *tryfile;
|
static char *tryfile;
|
||||||
|
@ -1261,7 +1263,7 @@ __gnat_set_file_time_name (char *name, time_t time_stamp)
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
unsigned long long backup, create, expire, revise;
|
unsigned long long backup, create, expire, revise;
|
||||||
unsigned long uic;
|
unsigned int uic;
|
||||||
union
|
union
|
||||||
{
|
{
|
||||||
unsigned short value;
|
unsigned short value;
|
||||||
|
@ -1552,12 +1554,36 @@ __gnat_file_exists (char *name)
|
||||||
int
|
int
|
||||||
__gnat_is_absolute_path (char *name, int length)
|
__gnat_is_absolute_path (char *name, int length)
|
||||||
{
|
{
|
||||||
|
#ifdef __vxworks
|
||||||
|
/* On VxWorks systems, an absolute path can be represented (depending on
|
||||||
|
the host platform) as either /dir/file, or device:/dir/file, or
|
||||||
|
device:drive_letter:/dir/file. */
|
||||||
|
|
||||||
|
int index;
|
||||||
|
|
||||||
|
if (name[0] == '/')
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
for (index = 0; index < length; index++)
|
||||||
|
{
|
||||||
|
if (name[index] == ':' &&
|
||||||
|
((name[index + 1] == '/') ||
|
||||||
|
(isalpha (name[index + 1]) && index + 2 <= length &&
|
||||||
|
name[index + 2] == '/')))
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
else if (name[index] == '/')
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
return (length != 0) &&
|
return (length != 0) &&
|
||||||
(*name == '/' || *name == DIR_SEPARATOR
|
(*name == '/' || *name == DIR_SEPARATOR
|
||||||
#if defined (__EMX__) || defined (MSDOS) || defined (WINNT)
|
#if defined (__EMX__) || defined (MSDOS) || defined (WINNT)
|
||||||
|| (length > 1 && isalpha (name[0]) && name[1] == ':')
|
|| (length > 1 && isalpha (name[0]) && name[1] == ':')
|
||||||
#endif
|
#endif
|
||||||
);
|
);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
* *
|
* *
|
||||||
* Auxiliary C functions for Interfaces.C.Streams *
|
* Auxiliary C functions for Interfaces.C.Streams *
|
||||||
* *
|
* *
|
||||||
* Copyright (C) 1992-2006, Free Software Foundation, Inc. *
|
* Copyright (C) 1992-2007, Free Software Foundation, Inc. *
|
||||||
* *
|
* *
|
||||||
* GNAT is free software; you can redistribute it and/or modify it under *
|
* GNAT is free software; you can redistribute it and/or modify it under *
|
||||||
* terms of the GNU General Public License as published by the Free Soft- *
|
* terms of the GNU General Public License as published by the Free Soft- *
|
||||||
|
@ -200,6 +200,25 @@ __gnat_full_name (char *nam, char *buffer)
|
||||||
strncpy (buffer, __gnat_to_host_file_spec (buffer), __gnat_max_path_len);
|
strncpy (buffer, __gnat_to_host_file_spec (buffer), __gnat_max_path_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined (__vxworks)
|
||||||
|
|
||||||
|
/* On VxWorks systems, an absolute path can be represented (depending on
|
||||||
|
the host platform) as either /dir/file, or device:/dir/file, or
|
||||||
|
device:drive_letter:/dir/file. Use the __gnat_is_absolute_path
|
||||||
|
to verify it. */
|
||||||
|
|
||||||
|
int length;
|
||||||
|
|
||||||
|
if (__gnat_is_absolute_path (nam, strlen (nam)))
|
||||||
|
strcpy (buffer, nam);
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
length = __gnat_max_path_len;
|
||||||
|
__gnat_get_current_dir (buffer, &length);
|
||||||
|
strncat (buffer, nam, __gnat_max_path_len - length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
if (nam[0] != '/')
|
if (nam[0] != '/')
|
||||||
{
|
{
|
||||||
|
@ -211,20 +230,11 @@ __gnat_full_name (char *nam, char *buffer)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __vxworks
|
|
||||||
/* On VxWorks, getcwd always returns an absolute path. But this path
|
|
||||||
can be also a device name like "serial:". In this case '/' should not
|
|
||||||
be appended. As on VxWorks 6.x the returned path can starts with
|
|
||||||
the device name (ex: machine:/directory), we need to test if the last
|
|
||||||
character of the path is ':' to know if '/' should be appended. */
|
|
||||||
if (buffer[strlen (buffer) - 1] != ':')
|
|
||||||
strcat (buffer, "/");
|
|
||||||
#else
|
|
||||||
/* If the name returned is an absolute path, it is safe to append '/'
|
/* If the name returned is an absolute path, it is safe to append '/'
|
||||||
to the path and concatenate the name of the file. */
|
to the path and concatenate the name of the file. */
|
||||||
if (buffer[0] == '/')
|
if (buffer[0] == '/')
|
||||||
strcat (buffer, "/");
|
strcat (buffer, "/");
|
||||||
#endif
|
|
||||||
|
|
||||||
strcat (buffer, nam);
|
strcat (buffer, nam);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue