1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-08-07 06:43:00 +03:00

Fri Aug 25 12:12:42 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>

* sysdeps/mach/hurd/mmap.c: Fix inverted test of MAP_FIXED.

	* stdio/vfscanf.c (number): Allow field width to inhibit first
	digit after base detection.

	* stdio/vfprintf.c (vfprintf: %s): Never search past the limit
	specified by the precision.

	* grp/grpread.c (__grpscan): New function.
	* grp/grp.h (__grpscan): Declare it.
	* grp/getgrgid.c: Use __grpscan.
	* grp/getgrnam.c: Likewise.
	* pwd/pwdread.c (__pwdscan): New function.
	* pwd/pwd.h (__pwdscan): Declare it.
	* pwd/getpwnam.c: Use __pwdscan.
	* pwd/getpwuid.c: Likewise.

Thu Aug 24 16:29:40 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* sysdeps/mach/hurd/mmap.c: Treat (FLAGS & MAP_TYPE) == 0 like
	MAP_FILE.

	* hurd/thread-cancel.c: Return EINTR when called on self.
	* sysdeps/i386/elf/start.S (data_start): Define as weak alias for
	__data_start.
This commit is contained in:
Roland McGrath
1995-08-25 19:23:32 +00:00
parent 3cf595e562
commit 7752137a6a
15 changed files with 144 additions and 98 deletions

View File

@@ -1,3 +1,31 @@
Fri Aug 25 12:12:42 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/mach/hurd/mmap.c: Fix inverted test of MAP_FIXED.
* stdio/vfscanf.c (number): Allow field width to inhibit first
digit after base detection.
* stdio/vfprintf.c (vfprintf: %s): Never search past the limit
specified by the precision.
* grp/grpread.c (__grpscan): New function.
* grp/grp.h (__grpscan): Declare it.
* grp/getgrgid.c: Use __grpscan.
* grp/getgrnam.c: Likewise.
* pwd/pwdread.c (__pwdscan): New function.
* pwd/pwd.h (__pwdscan): Declare it.
* pwd/getpwnam.c: Use __pwdscan.
* pwd/getpwuid.c: Likewise.
Thu Aug 24 16:29:40 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* sysdeps/mach/hurd/mmap.c: Treat (FLAGS & MAP_TYPE) == 0 like
MAP_FILE.
* hurd/thread-cancel.c: Return EINTR when called on self.
* sysdeps/i386/elf/start.S (data_start): Define as weak alias for
__data_start.
Tue Aug 22 16:49:12 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu> Tue Aug 22 16:49:12 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
* inet/netdb.h: Moved to resolv. * inet/netdb.h: Moved to resolv.

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -24,27 +24,13 @@ Cambridge, MA 02139, USA. */
/* Search for an entry with a matching group ID. */ /* Search for an entry with a matching group ID. */
struct group * struct group *
DEFUN(getgrgid, (gid), register gid_t gid) DEFUN(getgrgid, (gid), gid_t gid)
{ {
static PTR info = NULL; int match (struct group *p)
register FILE *stream;
register struct group *g;
if (info == NULL)
{ {
info = __grpalloc(); return p->gr_gid == gid;
if (info == NULL)
return NULL;
} }
static void *info;
stream = __grpopen(); return __grpscan (&info, &match);
if (stream == NULL)
return NULL;
while ((g = __grpread(stream, info)) != NULL)
if (g->gr_gid == (gid_t) gid)
break;
(void) fclose(stream);
return g;
} }

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -24,27 +24,13 @@ Cambridge, MA 02139, USA. */
/* Search for an entry with a matching name. */ /* Search for an entry with a matching name. */
struct group * struct group *
DEFUN(getgrnam, (name), register CONST char *name) DEFUN(getgrnam, (name), const char *name)
{ {
static PTR info = NULL; int match (struct group *p)
register FILE *stream;
register struct group *g;
if (info == NULL)
{ {
info = __grpalloc(); return ! strcmp (name, p->gr_name);
if (info == NULL)
return NULL;
} }
static void *info;
stream = __grpopen(); return __grpscan (&info, &match);
if (stream == NULL)
return NULL;
while ((g = __grpread(stream, info)) != NULL)
if (!strcmp(g->gr_name, name))
break;
(void) fclose(stream);
return g;
} }

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -55,6 +55,11 @@ extern struct group *__grpread __P ((FILE * __stream, __ptr_t __g));
/* Return a chunk of memory containing pre-initialized data for __grpread. */ /* Return a chunk of memory containing pre-initialized data for __grpread. */
extern __ptr_t __grpalloc __P ((void)); extern __ptr_t __grpalloc __P ((void));
/* Scan the group file, filling in G, until SELECTOR returns nonzero for an
entry. Return the `struct group' of G if successful, NULL on failure. */
extern struct group *__grpscan __P ((__ptr_t *__p,
int (*__selector) (struct group *)));
#endif #endif

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -133,3 +133,34 @@ DEFUN(__grpread, (stream, g), FILE *stream AND PTR CONST g)
return &info->g; return &info->g;
} }
struct group *
__grpscan (void **info, int (*selector) (struct group *))
{
FILE *stream;
struct group *p;
if (*info == NULL)
{
*info = __grpalloc ();
if (info == NULL)
return NULL;
}
stream = __grpopen ();
if (stream == NULL)
return NULL;
p = NULL;
while (! feof (stream))
{
p = __grpread (stream, *info);
if (p && (*selector) (p))
break;
p = NULL;
}
(void) fclose (stream);
return p;
}

View File

@@ -42,6 +42,8 @@ hurd_thread_cancel (thread_t thread)
if (! ss) if (! ss)
return EINVAL; return EINVAL;
if (ss == _hurd_self_sigstate ())
return EINTR; /* Bozo. */
__spin_lock (&ss->lock); __spin_lock (&ss->lock);
assert (! ss->critical_section); assert (! ss->critical_section);

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -24,27 +24,13 @@ Cambridge, MA 02139, USA. */
/* Search for an entry with a matching name. */ /* Search for an entry with a matching name. */
struct passwd * struct passwd *
DEFUN(getpwnam, (name), register CONST char *name) DEFUN(getpwnam, (name), const char *name)
{ {
static PTR info = NULL; int match (struct passwd *p)
register FILE *stream;
register struct passwd *p;
if (info == NULL)
{ {
info = __pwdalloc(); return ! strcmp (name, p->pw_name);
if (info == NULL)
return(NULL);
} }
static void *info;
stream = __pwdopen(); return __pwdscan (&info, &match);
if (stream == NULL)
return(NULL);
while ((p = __pwdread(stream, info)) != NULL)
if (!strcmp(p->pw_name, name))
break;
(void) fclose(stream);
return(p);
} }

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -24,27 +24,13 @@ Cambridge, MA 02139, USA. */
/* Search for an entry with a matching uid. */ /* Search for an entry with a matching uid. */
struct passwd * struct passwd *
DEFUN(getpwuid, (uid), register uid_t uid) DEFUN(getpwuid, (uid), uid_t uid)
{ {
static PTR info; int match (struct passwd *p)
register FILE *stream;
register struct passwd *p;
if (info == NULL)
{ {
info = __pwdalloc(); return p->pw_uid == uid;
if (info == NULL)
return(NULL);
} }
static void *info;
stream = __pwdopen(); return __pwdscan (&info, &match);
if (stream == NULL)
return(NULL);
while ((p = __pwdread(stream, info)) != NULL)
if (p->pw_uid == uid)
break;
(void) fclose(stream);
return(p);
} }

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -58,6 +58,12 @@ extern struct passwd *__pwdread __P ((FILE * __stream, __ptr_t __p));
/* Return a chunk of memory containing pre-initialized data for __pwdread. */ /* Return a chunk of memory containing pre-initialized data for __pwdread. */
extern __ptr_t __pwdalloc __P ((void)); extern __ptr_t __pwdalloc __P ((void));
/* Scan the password file, filling in P, until SELECTOR returns nonzero for
an entry. Return the `struct passwd' of P if successful, NULL on
failure. */
extern struct passwd *__pwdscan __P ((__ptr_t *__p,
int (*__selector) (struct passwd *)));
#endif #endif

View File

@@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc. /* Copyright (C) 1991, 1992, 1995 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or The GNU C Library is free software; you can redistribute it and/or
@@ -114,3 +114,34 @@ DEFUN(__pwdread, (stream, p), FILE *stream AND PTR CONST p)
return &info->p; return &info->p;
} }
struct passwd *
__pwdscan (void **info, int (*selector) (struct passwd *))
{
FILE *stream;
struct passwd *p;
if (*info == NULL)
{
*info = __pwdalloc ();
if (info == NULL)
return NULL;
}
stream = __pwdopen ();
if (stream == NULL)
return NULL;
p = NULL;
while (! feof (stream))
{
p = __pwdread (stream, *info);
if (p && (*selector) (p))
break;
p = NULL;
}
(void) fclose (stream);
return p;
}

View File

@@ -533,21 +533,16 @@ vfprintf (s, format, ap)
} }
else if (specs[cnt].info.prec != -1) else if (specs[cnt].info.prec != -1)
{ {
/* Search for the end of the string, but don't search
past the length specified by the precision. */
const char *end = memchr (str, '\0', specs[cnt].info.prec); const char *end = memchr (str, '\0', specs[cnt].info.prec);
if (end) if (end)
len = end - str; len = end - str;
else else
len = strlen (str);
}
else
{
len = strlen (str);
if (specs[cnt].info.prec != -1
&& (size_t) specs[cnt].info.prec < len)
/* Limit the length to the precision. */
len = specs[cnt].info.prec; len = specs[cnt].info.prec;
} }
else
len = strlen (str);
specs[cnt].info.width -= len; specs[cnt].info.width -= len;

View File

@@ -422,7 +422,7 @@ DEFUN(__vfscanf, (s, format, arg),
base = 10; base = 10;
/* Read the number into WORK. */ /* Read the number into WORK. */
do while (width != 0 && c != EOF)
{ {
if (base == 16 ? !isxdigit(c) : if (base == 16 ? !isxdigit(c) :
(!isdigit(c) || c - '0' >= base)) (!isdigit(c) || c - '0' >= base))
@@ -430,11 +430,12 @@ DEFUN(__vfscanf, (s, format, arg),
*w++ = c; *w++ = c;
if (width > 0) if (width > 0)
--width; --width;
} while (inchar() != EOF && width != 0); (void) inchar ();
}
if (w == work || if (w == work ||
(w - work == 1 && (work[0] == '+' || work[0] == '-'))) (w - work == 1 && (work[0] == '+' || work[0] == '-')))
/* There was on number. */ /* There was no number. */
conv_error(); conv_error();
/* Convert the number. */ /* Convert the number. */

View File

@@ -90,3 +90,5 @@ nofini:
.globl __data_start .globl __data_start
__data_start: __data_start:
.long 0 .long 0
.weak data_start
data_start = __data_start

View File

@@ -57,6 +57,7 @@ __mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
break; break;
case MAP_FILE: case MAP_FILE:
case 0: /* Allow, e.g., just MAP_SHARED. */
{ {
mach_port_t robj, wobj; mach_port_t robj, wobj;
if (err = HURD_DPORT_USE (fd, __io_map (port, &robj, &wobj))) if (err = HURD_DPORT_USE (fd, __io_map (port, &robj, &wobj)))
@@ -91,7 +92,7 @@ __mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
mapaddr = (vm_address_t) addr; mapaddr = (vm_address_t) addr;
err = __vm_map (__mach_task_self (), err = __vm_map (__mach_task_self (),
&mapaddr, (vm_size_t) len, (vm_address_t) 0, &mapaddr, (vm_size_t) len, (vm_address_t) 0,
flags & MAP_FIXED, ! (flags & MAP_FIXED),
memobj, (vm_offset_t) offset, memobj, (vm_offset_t) offset,
flags & (MAP_COPY|MAP_PRIVATE), flags & (MAP_COPY|MAP_PRIVATE),
vmprot, VM_PROT_ALL, vmprot, VM_PROT_ALL,

View File

@@ -1 +1 @@
#include <posix/utime.h> #include <io/utime.h>