summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog20
-rw-r--r--iconv/strtab.c5
-rw-r--r--linuxthreads/ChangeLog5
-rw-r--r--linuxthreads/sysdeps/pthread/bits/libc-lock.h6
-rw-r--r--misc/syslog.c32
-rw-r--r--string/tst-strlen.c3
-rw-r--r--sysdeps/generic/strnlen.c3
7 files changed, 59 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index a4abdeb40c..1d2166270c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,23 @@
+2001-08-27  Ulrich Drepper  <drepper@redhat.com>
+
+	* misc/syslog.c (vsyslog): Try a bit harder to use syslogd.  If
+	the connection went down after we first used it try to connect
+	again and resend the message before printing to the console.
+	Reported by Coserea Gh. Tudor <tudore@tudore.gecadsoftware.com>.
+
+2001-08-27  Jakub Jelinek  <jakub@redhat.com>
+
+	* string/tst-strlen.c (main): Test strnlen (, -1) too.
+	* sysdeps/generic/strnlen.c (__strnlen): Fix for maxlens with top
+	bit set.
+
+2001-08-27  Ulrich Drepper  <drepper@redhat.com>
+
+	* iconv/strtab.c (searchstring): Use correct length for
+	comparison.
+	(strtabadd): Account total size correct if new string has old string as
+	substring.
+
 2001-08-27  Jakub Jelinek  <jakub@redhat.com>
 
 	* elf/rtld.c (dl_main): Update call to _dl_lookup_symbol.
diff --git a/iconv/strtab.c b/iconv/strtab.c
index d567f57e88..4189f97281 100644
--- a/iconv/strtab.c
+++ b/iconv/strtab.c
@@ -193,7 +193,7 @@ searchstring (struct Strent **sep, struct Strent *newstr)
 
   /* Compare the strings.  */
   cmpres = memcmp ((*sep)->reverse, newstr->reverse,
-		   MIN ((*sep)->len, newstr->len));
+		   MIN ((*sep)->len, newstr->len) - 1);
   if (cmpres == 0)
     /* We found a matching string.  */
     return sep;
@@ -236,10 +236,9 @@ strtabadd (struct Strtab *st, const char *str, size_t len)
 	  /* When we get here it means that the string we are about to
 	     add has a common prefix with a string we already have but
 	     it is longer.  In this case we have to put it first.  */
+	  st->total += newstr->len - (*sep)->len;
 	  newstr->next = *sep;
 	  *sep = newstr;
-
-	  st->total += newstr->len - (*sep)->len;
 	}
       else
 	{
diff --git a/linuxthreads/ChangeLog b/linuxthreads/ChangeLog
index 5cbf82783b..1ce5a23186 100644
--- a/linuxthreads/ChangeLog
+++ b/linuxthreads/ChangeLog
@@ -1,3 +1,8 @@
+2001-08-27  Jakub Jelinek  <jakub@redhat.com>
+
+	* sysdeps/pthread/bits/libc-lock.h (__libc_rwlock_t): Only define to
+	non-opaque type if __USE_UNIX98.
+
 2001-08-26  Jakub Jelinek  <jakub@redhat.com>
 
 	* sysdeps/pthread/bits/libc-lock.h (__libc_lock_t): Define
diff --git a/linuxthreads/sysdeps/pthread/bits/libc-lock.h b/linuxthreads/sysdeps/pthread/bits/libc-lock.h
index 02dfc91692..2c1d162773 100644
--- a/linuxthreads/sysdeps/pthread/bits/libc-lock.h
+++ b/linuxthreads/sysdeps/pthread/bits/libc-lock.h
@@ -25,8 +25,12 @@
 /* Mutex type.  */
 #if defined(_LIBC) || defined(_IO_MTSAFE_IO)
 typedef pthread_mutex_t __libc_lock_t;
-typedef pthread_rwlock_t __libc_rwlock_t;
 typedef struct { pthread_mutex_t mutex; } __libc_lock_recursive_t;
+# ifdef __USE_UNIX98
+typedef pthread_rwlock_t __libc_rwlock_t;
+# else
+typedef struct __libc_rwlock_opaque__ __libc_rwlock_t;
+# endif
 #else
 typedef struct __libc_lock_opaque__ __libc_lock_t;
 typedef struct __libc_lock_recursive_opaque__ __libc_lock_recursive_t;
diff --git a/misc/syslog.c b/misc/syslog.c
index 9553c296ea..58f81996aa 100644
--- a/misc/syslog.c
+++ b/misc/syslog.c
@@ -239,17 +239,29 @@ vsyslog(pri, fmt, ap)
 
 	if (!connected || __send(LogFile, buf, bufsize, 0) < 0)
 	  {
-	    closelog_internal ();	/* attempt re-open next time */
-	    /*
-	     * Output the message to the console; don't worry about blocking,
-	     * if console blocks everything will.  Make sure the error reported
-	     * is the one from the syslogd failure.
-	     */
-	    if (LogStat & LOG_CONS &&
-		(fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)
+	    if (connected)
 	      {
-		dprintf (fd, "%s\r\n", buf + msgoff);
-		(void)__close(fd);
+		/* Try to reopen the syslog connection.  Maybe it went
+		   down.  */
+		closelog_internal ();
+		openlog_internal(LogTag, LogStat | LOG_NDELAY, 0);
+	      }
+
+	    if (!connect || __send(LogFile, buf, bufsize, 0) < 0)
+	      {
+		closelog_internal ();	/* attempt re-open next time */
+		/*
+		 * Output the message to the console; don't worry
+		 * about blocking, if console blocks everything will.
+		 * Make sure the error reported is the one from the
+		 * syslogd failure.
+		 */
+		if (LogStat & LOG_CONS &&
+		    (fd = __open(_PATH_CONSOLE, O_WRONLY|O_NOCTTY, 0)) >= 0)
+		  {
+		    dprintf (fd, "%s\r\n", buf + msgoff);
+		    (void)__close(fd);
+		  }
 	      }
 	  }
 
diff --git a/string/tst-strlen.c b/string/tst-strlen.c
index 1b1f8344b8..a1e115927b 100644
--- a/string/tst-strlen.c
+++ b/string/tst-strlen.c
@@ -31,7 +31,8 @@ main(int argc, char *argv[])
 	      buf[words * 4 + 3] = (last & 8) != 0 ? 'e' : '\0';
 	      buf[words * 4 + 4] = '\0';
 
-	      if (strlen (buf) != words * 4 + lens[last])
+	      if (strlen (buf) != words * 4 + lens[last]
+		  || strnlen (buf, -1) != words * 4 + lens[last])
 		{
 		  printf ("failed for base=%Zu, words=%Zu, and last=%Zu\n",
 			  base, words, last);
diff --git a/sysdeps/generic/strnlen.c b/sysdeps/generic/strnlen.c
index f1b6760247..1386acfd9c 100644
--- a/sysdeps/generic/strnlen.c
+++ b/sysdeps/generic/strnlen.c
@@ -36,6 +36,9 @@ __strnlen (const char *str, size_t maxlen)
   if (maxlen == 0)
     return 0;
 
+  if (__builtin_expect (end_ptr < str, 0))
+    end_ptr = (const char *) ~0UL;
+
   /* Handle the first few characters by reading one character at a time.
      Do this until CHAR_PTR is aligned on a longword boundary.  */
   for (char_ptr = str; ((unsigned long int) char_ptr