* path.cc (get_device_number): Remove special com? consideration.
(special_chars): Make static. (special_introducers): New. (special_char): Allow specified valid_chars args. (fnunmunge): Handle aux-like filenames correctly. (special_name): Add con, conin$, conout$. (mount_item::fnmunge): Use __small_sprintf return value to calculate increments.
This commit is contained in:
parent
18072a4fe5
commit
e47d564835
|
@ -1,3 +1,14 @@
|
||||||
|
2003-07-10 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
|
* path.cc (get_device_number): Remove special com? consideration.
|
||||||
|
(special_chars): Make static.
|
||||||
|
(special_introducers): New.
|
||||||
|
(special_char): Allow specified valid_chars args.
|
||||||
|
(fnunmunge): Handle aux-like filenames correctly.
|
||||||
|
(special_name): Add con, conin$, conout$.
|
||||||
|
(mount_item::fnmunge): Use __small_sprintf return value to calculate
|
||||||
|
increments.
|
||||||
|
|
||||||
2003-07-09 Christopher Faylor <cgf@redhat.com>
|
2003-07-09 Christopher Faylor <cgf@redhat.com>
|
||||||
|
|
||||||
* include/cygwin/version.h: Bump DLL minor number to 1.
|
* include/cygwin/version.h: Bump DLL minor number to 1.
|
||||||
|
|
|
@ -1099,15 +1099,6 @@ get_device_number (const char *unix_path, const char *w32_path, int &unit)
|
||||||
if (devn == FH_BAD)
|
if (devn == FH_BAD)
|
||||||
devn = get_raw_device_number (unix_path + 5, NULL, unit);
|
devn = get_raw_device_number (unix_path + 5, NULL, unit);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
char *p = strrchr (unix_path, '/');
|
|
||||||
if (p)
|
|
||||||
unix_path = p + 1;
|
|
||||||
if (udeveqn ("com", 3)
|
|
||||||
&& (unit = digits (unix_path + 3)) >= 0 && unit < 100)
|
|
||||||
devn = FH_SERIAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return devn;
|
return devn;
|
||||||
}
|
}
|
||||||
|
@ -1390,7 +1381,7 @@ set_flags (unsigned *flags, unsigned val)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
char special_chars[] =
|
static char special_chars[] =
|
||||||
"\001" "\002" "\003" "\004" "\005" "\006" "\007" "\010"
|
"\001" "\002" "\003" "\004" "\005" "\006" "\007" "\010"
|
||||||
"\011" "\012" "\013" "\014" "\015" "\016" "\017" "\020"
|
"\011" "\012" "\013" "\014" "\015" "\016" "\017" "\020"
|
||||||
"\021" "\022" "\023" "\024" "\025" "\026" "\027" "\030"
|
"\021" "\022" "\023" "\024" "\025" "\026" "\027" "\030"
|
||||||
|
@ -1400,28 +1391,66 @@ char special_chars[] =
|
||||||
"I" "J" "K" "L" "M" "N" "O" "P"
|
"I" "J" "K" "L" "M" "N" "O" "P"
|
||||||
"Q" "R" "S" "T" "U" "V" "W" "X"
|
"Q" "R" "S" "T" "U" "V" "W" "X"
|
||||||
"Y" "Z";
|
"Y" "Z";
|
||||||
|
static char special_introducers[] =
|
||||||
|
"anpcl";
|
||||||
|
|
||||||
static inline char
|
static char
|
||||||
special_char (const char *s)
|
special_char (const char *s, const char *valid_chars = special_chars)
|
||||||
{
|
|
||||||
char *p = strechr (special_chars, *s);
|
|
||||||
if (*p == '%' && strlen (p) >= 3)
|
|
||||||
{
|
{
|
||||||
|
if (*s != '%' || strlen (s) < 3)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
char *p;
|
||||||
char hex[] = {s[1], s[2], '\0'};
|
char hex[] = {s[1], s[2], '\0'};
|
||||||
unsigned char c = strtoul (hex, &p, 16);
|
unsigned char c = strtoul (hex, &p, 16);
|
||||||
p = strechr (special_chars, c);
|
p = strechr (valid_chars, c);
|
||||||
}
|
|
||||||
return *p;
|
return *p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Determines if name is "special". Assumes that name is empty or "absolute" */
|
||||||
|
static int
|
||||||
|
special_name (const char *s, int inc = 1)
|
||||||
|
{
|
||||||
|
if (!*s)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
s += inc;
|
||||||
|
if (strpbrk (s, special_chars))
|
||||||
|
return !strncasematch (s, "%2f", 3);
|
||||||
|
|
||||||
|
if (strcasematch (s, "nul")
|
||||||
|
|| strcasematch (s, "aux")
|
||||||
|
|| strcasematch (s, "prn")
|
||||||
|
|| strcasematch (s, "con")
|
||||||
|
|| strcasematch (s, "conin$")
|
||||||
|
|| strcasematch (s, "conout$"))
|
||||||
|
return -1;
|
||||||
|
if (!strncasematch (s, "com", 3)
|
||||||
|
&& !strncasematch (s, "lpt", 3))
|
||||||
|
return false;
|
||||||
|
char *p;
|
||||||
|
(void) strtoul (s + 3, &p, 10);
|
||||||
|
return -(*p == '\0');
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
fnunmunge (char *dst, const char *src)
|
fnunmunge (char *dst, const char *src)
|
||||||
{
|
{
|
||||||
bool converted = false;
|
bool converted = false;
|
||||||
char c;
|
char c;
|
||||||
|
|
||||||
|
if ((c = special_char (src, special_introducers)))
|
||||||
|
{
|
||||||
|
__small_sprintf (dst, "%c%s", c, src + 3);
|
||||||
|
if (special_name (dst, 0))
|
||||||
|
{
|
||||||
|
*dst++ = c;
|
||||||
|
src += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
while (*src)
|
while (*src)
|
||||||
if (*src != '%' || !(c = special_char (src)))
|
if (!(c = special_char (src)))
|
||||||
*dst++ = *src++;
|
*dst++ = *src++;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1434,28 +1463,6 @@ fnunmunge (char *dst, const char *src)
|
||||||
return converted;
|
return converted;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determines if name is "special". Assumes that name is empty or "absolute" */
|
|
||||||
static int
|
|
||||||
special_name (const char *s)
|
|
||||||
{
|
|
||||||
if (!*s)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (strpbrk (++s, special_chars))
|
|
||||||
return !strncasematch (s, "%2f", 3);
|
|
||||||
|
|
||||||
if (strcasematch (s, "nul")
|
|
||||||
|| strcasematch (s, "aux")
|
|
||||||
|| strcasematch (s, "prn"))
|
|
||||||
return -1;
|
|
||||||
if (!strncasematch (s, "com", 3)
|
|
||||||
&& !strncasematch (s, "lpt", 3))
|
|
||||||
return false;
|
|
||||||
char *p;
|
|
||||||
(void) strtol (s, &p, 10);
|
|
||||||
return -(*p == '\0');
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
mount_item::fnmunge (char *dst, const char *src)
|
mount_item::fnmunge (char *dst, const char *src)
|
||||||
{
|
{
|
||||||
|
@ -1467,19 +1474,13 @@ mount_item::fnmunge (char *dst, const char *src)
|
||||||
char *d = dst;
|
char *d = dst;
|
||||||
*d++ = *src++;
|
*d++ = *src++;
|
||||||
if (name_type < 0)
|
if (name_type < 0)
|
||||||
{
|
d += __small_sprintf (d, "%%%02x", (unsigned char) *src++);
|
||||||
__small_sprintf (d, "%%%02x", (unsigned char) *src++);
|
|
||||||
d += 3;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (*src)
|
while (*src)
|
||||||
if (!special_char (src))
|
if (!strchr (special_chars, *src) || (*src == '%' && !special_char (src)))
|
||||||
*d++ = *src++;
|
*d++ = *src++;
|
||||||
else
|
else
|
||||||
{
|
d += __small_sprintf (d, "%%%02x", (unsigned char) *src++);
|
||||||
__small_sprintf (d, "%%%02x", (unsigned char) *src++);
|
|
||||||
d += 3;
|
|
||||||
}
|
|
||||||
*d = *src;
|
*d = *src;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue