Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/winsup
diff options
context:
space:
mode:
authorChristopher Faylor <me@cgf.cx>2003-01-27 03:16:01 +0300
committerChristopher Faylor <me@cgf.cx>2003-01-27 03:16:01 +0300
commitfea48988ea866e6ef4f29247a13a8b28eb9be7ce (patch)
tree40e1433368cfe58c000284730c207907c298c633 /winsup
parent285d6b97b11d0516ba82b0deb59afe746ef8fb93 (diff)
* strings.h (strechr): New function.
* uinfo.cc (pwdgrp::next_str): Search only for input char in string. Return EOS on failure. Don't check for NULL since it shouldn't be possible. (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'. (pwdgrp::next_num): Pass explicit separator character to next_str. * grp.cc (pwdgrp::parse_group): Ditto. * passwd.cc (pwdgrp::parse_passwd): Ditto. Revamp test for garbage input. * pwdgrp.h (pwdgrp::next_str): Don't use default parameter.
Diffstat (limited to 'winsup')
-rw-r--r--winsup/cygwin/ChangeLog13
-rw-r--r--winsup/cygwin/grp.cc4
-rw-r--r--winsup/cygwin/passwd.cc17
-rw-r--r--winsup/cygwin/pwdgrp.h2
-rw-r--r--winsup/cygwin/string.h21
-rw-r--r--winsup/cygwin/uinfo.cc23
6 files changed, 54 insertions, 26 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 7ad151b88..b965d82fa 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,5 +1,18 @@
2003-01-26 Christopher Faylor <cgf@redhat.com>
+ * strings.h (strechr): New function.
+ * uinfo.cc (pwdgrp::next_str): Search only for input char in string.
+ Return EOS on failure. Don't check for NULL since it shouldn't be
+ possible.
+ (pwdgrp::add_line): Revert to replacing '\n' in input line with '\0'.
+ (pwdgrp::next_num): Pass explicit separator character to next_str.
+ * grp.cc (pwdgrp::parse_group): Ditto.
+ * passwd.cc (pwdgrp::parse_passwd): Ditto. Revamp test for garbage
+ input.
+ * pwdgrp.h (pwdgrp::next_str): Don't use default parameter.
+
+2003-01-26 Christopher Faylor <cgf@redhat.com>
+
* uinfo.cc (pwdgrp::load): Regularize strace output. Add warning for
CreateFile failure.
diff --git a/winsup/cygwin/grp.cc b/winsup/cygwin/grp.cc
index 44abc9745..35bba1fe2 100644
--- a/winsup/cygwin/grp.cc
+++ b/winsup/cygwin/grp.cc
@@ -37,11 +37,11 @@ bool
pwdgrp::parse_group ()
{
# define grp (*group_buf)[curr_lines]
- grp.gr_name = next_str ();
+ grp.gr_name = next_str (':');
if (!*grp.gr_name)
return false;
- grp.gr_passwd = next_str ();
+ grp.gr_passwd = next_str (':');
if (!next_num (grp.gr_gid))
return false;
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index 113f92acf..c257bd640 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -38,18 +38,17 @@ bool
pwdgrp::parse_passwd ()
{
# define res (*passwd_buf)[curr_lines]
- res.pw_name = next_str ();
- res.pw_passwd = next_str ();
-
- if (res.pw_name == res.pw_passwd)
- return false;
-
+ res.pw_name = next_str (':');
+ res.pw_passwd = next_str (':');
+ char *p = raw_ptr ();
(void) next_num (res.pw_uid);
+ if (p == raw_ptr ())
+ return false; /* parsing did not advance. line is garbage */
(void) next_num (res.pw_gid);
res.pw_comment = NULL;
- res.pw_gecos = next_str ();
- res.pw_dir = next_str ();
- res.pw_shell = next_str ();
+ res.pw_gecos = next_str (':');
+ res.pw_dir = next_str (':');
+ res.pw_shell = next_str (':');
return true;
# undef res
}
diff --git a/winsup/cygwin/pwdgrp.h b/winsup/cygwin/pwdgrp.h
index a5fdc1953..73d41a097 100644
--- a/winsup/cygwin/pwdgrp.h
+++ b/winsup/cygwin/pwdgrp.h
@@ -46,7 +46,7 @@ class pwdgrp
void read_group ();
char *add_line (char *);
char *raw_ptr () const {return lptr;}
- char *next_str (char = 0);
+ char *next_str (char);
bool next_num (unsigned long&);
bool next_num (unsigned int& i)
{
diff --git a/winsup/cygwin/string.h b/winsup/cygwin/string.h
index 6e410249b..0ac9745ad 100644
--- a/winsup/cygwin/string.h
+++ b/winsup/cygwin/string.h
@@ -38,6 +38,27 @@ strchr (const char *s, int c)
return res;
}
+#undef strechr
+#define strechr cygwin_strechr
+static inline __stdcall char *
+strechr (const char *s, int c)
+{
+ register char * res;
+ __asm__ __volatile__ ("\
+ movb %%al,%%ah\n\
+1: movb (%1),%%al\n\
+ cmpb %%ah,%%al\n\
+ je 2f\n\
+ incl %1\n\
+ testb %%al,%%al\n\
+ jne 1b\n\
+ decl %1\n\
+2: movl %1,%0\n\
+ ":"=a" (res), "=r" (s)
+ :"0" (c), "1" (s));
+ return res;
+}
+
extern const char isalpha_array[];
#undef strcasematch
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index 82712d9d4..a6831e2a9 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -394,24 +394,17 @@ cygheap_user::env_name (const char *name, size_t namelen)
char *
pwdgrp::next_str (char c)
{
- if (!lptr)
- return NULL;
- char search[] = ":\n\0\0";
- search[2] = c;
char *res = lptr;
- char *p = strpbrk (lptr, search);
- if (p)
- {
- lptr = (*p == '\n') ? p : p + 1;
- *p = '\0';
- }
+ lptr = strechr (lptr, c);
+ if (*lptr)
+ *lptr++ = '\0';
return res;
}
bool
pwdgrp::next_num (unsigned long& n)
{
- char *p = next_str ();
+ char *p = next_str (':');
if (!p)
return -1;
char *cp;
@@ -425,11 +418,13 @@ pwdgrp::add_line (char *eptr)
if (eptr)
{
lptr = eptr;
- eptr = strchr (lptr, '\n');
- if (eptr)
+ eptr = strechr (lptr, '\n');
+ if (*eptr)
{
if (eptr > lptr && eptr[-1] == '\r')
- eptr[-1] = '\n';
+ eptr[-1] = '\0';
+ else
+ *eptr = '\0';
eptr++;
}
if (curr_lines >= max_lines)