summaryrefslogtreecommitdiffstats
path: root/winsup
diff options
context:
space:
mode:
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/path.cc37
2 files changed, 29 insertions, 15 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 9dda71a7c..6b4d48297 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,10 @@
2003-02-05 Christopher Faylor <cgf@redhat.com>
+ * path.cc: Change 'to_posix_p' to 'to_posix' throughout.
+ (conv_path_list_buf_size): Accommodate relative paths.
+
+2003-02-05 Christopher Faylor <cgf@redhat.com>
+
* path.cc (etc::dir_changed): Fix debug printf.
2003-02-05 Corinna Vinschen <corinna@vinschen.de>
@@ -99,7 +104,7 @@
* pwdgrp.h: Change arguments of internal_getpwsid,
internal_getgrsid and internal_getgroups to cygpsid.
* passwd.cc (internal_getpwsid): Change argument from cygsid to cygpsid.
- * grp.cc (internal_getgrsid): Ditto.
+ * grp.cc (internal_getgrsid): Ditto.
(internal_getgroups): Ditto.
2003-02-03 Christopher Faylor <cgf@redhat.com>
diff --git a/winsup/cygwin/path.cc b/winsup/cygwin/path.cc
index e32984510..d75f8a0c5 100644
--- a/winsup/cygwin/path.cc
+++ b/winsup/cygwin/path.cc
@@ -1318,13 +1318,13 @@ slash_unc_prefix_p (const char *path)
/* conv_path_list: Convert a list of path names to/from Win32/POSIX. */
static void
-conv_path_list (const char *src, char *dst, int to_posix_p)
+conv_path_list (const char *src, char *dst, int to_posix)
{
char *s;
char *d = dst;
- char src_delim = to_posix_p ? ';' : ':';
- char dst_delim = to_posix_p ? ':' : ';';
- int (*conv_fn) (const char *, char *) = (to_posix_p
+ char src_delim = to_posix ? ';' : ':';
+ char dst_delim = to_posix ? ':' : ';';
+ int (*conv_fn) (const char *, char *) = (to_posix
? cygwin_conv_to_posix_path
: cygwin_conv_to_win32_path);
@@ -3487,23 +3487,29 @@ cygwin_posix_path_list_p (const char *path)
allows the caller to use alloca if it wants. */
static int
-conv_path_list_buf_size (const char *path_list, int to_posix_p)
+conv_path_list_buf_size (const char *path_list, bool to_posix)
{
int i, num_elms, max_mount_path_len, size;
const char *p;
+ path_conv pc(".", PC_FULL | PC_POSIX);
/* The theory is that an upper bound is
current_size + (num_elms * max_mount_path_len) */
- char delim = to_posix_p ? ';' : ':';
- p = path_list;
- for (num_elms = 1; (p = strchr (p, delim)) != NULL; ++num_elms)
- ++p;
+ unsigned nrel;
+ char delim = to_posix ? ';' : ':';
+ for (p = path_list, num_elms = nrel = 0; p; num_elms++)
+ {
+ if (!isabspath (p))
+ nrel++;
+ p = strchr (++p, delim);
+ }
/* 7: strlen ("//c") + slop, a conservative initial value */
- for (max_mount_path_len = 7, i = 0; i < mount_table->nmounts; ++i)
+ for (max_mount_path_len = sizeof ("/cygdrive/X"), i = 0;
+ i < mount_table->nmounts; i++)
{
- int mount_len = (to_posix_p
+ int mount_len = (to_posix
? mount_table->mount[i].posix_pathlen
: mount_table->mount[i].native_pathlen);
if (max_mount_path_len < mount_len)
@@ -3511,20 +3517,23 @@ conv_path_list_buf_size (const char *path_list, int to_posix_p)
}
/* 100: slop */
- size = strlen (path_list) + (num_elms * max_mount_path_len) + 100;
+ size = strlen (path_list)
+ + (num_elms * max_mount_path_len)
+ + (nrel * strlen (to_posix ? pc.get_win32 () : pc.normalized_path))
+ + 100;
return size;
}
extern "C" int
cygwin_win32_to_posix_path_list_buf_size (const char *path_list)
{
- return conv_path_list_buf_size (path_list, 1);
+ return conv_path_list_buf_size (path_list, true);
}
extern "C" int
cygwin_posix_to_win32_path_list_buf_size (const char *path_list)
{
- return conv_path_list_buf_size (path_list, 0);
+ return conv_path_list_buf_size (path_list, false);
}
extern "C" int