mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-09 14:50:05 +00:00
Fri Nov 15 12:27:25 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* sysdeps/posix/readv.c (readv): Change return type to ssize_t. Deansideclized. * sysdeps/posix/writev.c (writev): Likewise.
This commit is contained in:
parent
63afd6ae40
commit
ebe3b3ebb7
@ -37,6 +37,14 @@
|
||||
/*
|
||||
* HISTORY
|
||||
* $Log$
|
||||
* Revision 1.12 1996/11/15 19:44:13 thomas
|
||||
* Tue Nov 12 16:58:41 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
|
||||
*
|
||||
* * mach/msg-destroy.c (mach_msg_destroy_port,
|
||||
* mach_msg_destroy_memory): Use prototype syntax.
|
||||
* * hurd/hurdmalloc.c (more_memory, malloc_fork_prepare,
|
||||
* malloc_fork_parent, malloc_fork_child): Likewise.
|
||||
*
|
||||
* Revision 1.11 1996/06/06 15:13:47 miles
|
||||
* Changes to bring in line with the hurd libthreads/malloc.c:
|
||||
* (more_memory): Use assert_perror instead of MACH_CALL.
|
||||
@ -206,9 +214,7 @@ malloc_init (void)
|
||||
}
|
||||
|
||||
static void
|
||||
more_memory(size, fl)
|
||||
int size;
|
||||
register free_list_t fl;
|
||||
more_memory(int size, free_list_t fl)
|
||||
{
|
||||
register int amount;
|
||||
register int n;
|
||||
@ -448,7 +454,8 @@ print_malloc_free_list()
|
||||
}
|
||||
#endif DEBUG
|
||||
|
||||
static void malloc_fork_prepare()
|
||||
static void
|
||||
malloc_fork_prepare(void)
|
||||
/*
|
||||
* Prepare the malloc module for a fork by insuring that no thread is in a
|
||||
* malloc critical section.
|
||||
@ -461,7 +468,8 @@ static void malloc_fork_prepare()
|
||||
}
|
||||
}
|
||||
|
||||
static void malloc_fork_parent()
|
||||
static void
|
||||
malloc_fork_parent(void)
|
||||
/*
|
||||
* Called in the parent process after a fork() to resume normal operation.
|
||||
*/
|
||||
@ -473,7 +481,8 @@ static void malloc_fork_parent()
|
||||
}
|
||||
}
|
||||
|
||||
static void malloc_fork_child()
|
||||
static void
|
||||
malloc_fork_child(void)
|
||||
/*
|
||||
* Called in the child process after a fork() to resume normal operation.
|
||||
*/
|
||||
|
10
mach/mach.h
10
mach/mach.h
@ -1,5 +1,5 @@
|
||||
/* Standard header for all Mach programs.
|
||||
Copyright (C) 1993, 1994 Free Software Foundation, Inc.
|
||||
Copyright (C) 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -71,6 +71,14 @@ mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
|
||||
mach_msg_timeout_t __timeout);
|
||||
|
||||
|
||||
/* Deallocate all port rights and out-of-line memory in MSG. */
|
||||
extern void
|
||||
__mach_msg_destroy (mach_msg_header_t *msg),
|
||||
mach_msg_destroy (mach_msg_header_t *msg);
|
||||
|
||||
/* XXX should be in mach/message.h. */
|
||||
extern typeof (mach_msg) __mach_msg;
|
||||
|
||||
#define __need_FILE
|
||||
#include <stdio.h>
|
||||
|
||||
|
@ -26,6 +26,17 @@
|
||||
/*
|
||||
* HISTORY
|
||||
* $Log$
|
||||
* Revision 1.4 1996/11/15 19:44:43 thomas
|
||||
* Tue Nov 12 16:58:41 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
|
||||
*
|
||||
* * mach/mach.h (__mach_msg_destroy, mach_msg_destroy, __mach_msg):
|
||||
* Provide prototypes.
|
||||
*
|
||||
* * mach/msg-destroy.c (mach_msg_destroy_port,
|
||||
* mach_msg_destroy_memory): Use prototype syntax.
|
||||
* * hurd/hurdmalloc.c (more_memory, malloc_fork_prepare,
|
||||
* malloc_fork_parent, malloc_fork_child): Likewise.
|
||||
*
|
||||
* Revision 1.3 1995/01/23 22:16:52 roland
|
||||
* (mach_msg_destroy): Define as weak alias for __mach_msg_destroy.
|
||||
*
|
||||
@ -53,8 +64,8 @@
|
||||
#include <mach_init.h>
|
||||
#endif
|
||||
|
||||
static void mach_msg_destroy_port();
|
||||
static void mach_msg_destroy_memory();
|
||||
static void mach_msg_destroy_port(mach_port_t, mach_msg_type_name_t);
|
||||
static void mach_msg_destroy_memory(vm_offset_t, vm_size_t);
|
||||
|
||||
/*
|
||||
* Routine: mach_msg_destroy
|
||||
|
@ -894,6 +894,73 @@ Go home and have a glass of warm, dairy-fresh milk.
|
||||
This error code has no purpose.
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Bad message
|
||||
@deftypevr Macro int EBADMSG
|
||||
@comment errno 107
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Identifier removed
|
||||
@deftypevr Macro int EIDRM
|
||||
@comment errno 108
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Multihop attempted
|
||||
@deftypevr Macro int EMULTIHOP
|
||||
@comment errno 109
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: No data available
|
||||
@deftypevr Macro int ENODATA
|
||||
@comment errno 110
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Link has been severed
|
||||
@deftypevr Macro int ENOLINK
|
||||
@comment errno 111
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: No message of desired type
|
||||
@deftypevr Macro int ENOMSG
|
||||
@comment errno 112
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Out of streams resources
|
||||
@deftypevr Macro int ENOSR
|
||||
@comment errno 113
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Device not a stream
|
||||
@deftypevr Macro int ENOSTR
|
||||
@comment errno 114
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Value too large for defined data type
|
||||
@deftypevr Macro int EOVERFLOW
|
||||
@comment errno 115
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Protocol error
|
||||
@deftypevr Macro int EPROTO
|
||||
@comment errno 116
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment XOPEN: Timer expired
|
||||
@deftypevr Macro int ETIME
|
||||
@comment errno 117
|
||||
@end deftypevr
|
||||
|
||||
|
||||
@emph{The following error codes are defined by the Linux/i386 kernel.
|
||||
They are not yet documented.}
|
||||
|
||||
@ -903,18 +970,6 @@ They are not yet documented.}
|
||||
@comment errno ???/85
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: No message of desired type
|
||||
@deftypevr Macro int ENOMSG
|
||||
@comment errno ???/42
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Identifier removed
|
||||
@deftypevr Macro int EIDRM
|
||||
@comment errno ???/43
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Channel number out of range
|
||||
@deftypevr Macro int ECHRNG
|
||||
@ -1011,30 +1066,6 @@ They are not yet documented.}
|
||||
@comment errno ???/59
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Device not a stream
|
||||
@deftypevr Macro int ENOSTR
|
||||
@comment errno ???/60
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: No data available
|
||||
@deftypevr Macro int ENODATA
|
||||
@comment errno ???/61
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Timer expired
|
||||
@deftypevr Macro int ETIME
|
||||
@comment errno ???/62
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Out of streams resources
|
||||
@deftypevr Macro int ENOSR
|
||||
@comment errno ???/63
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Machine is not on the network
|
||||
@deftypevr Macro int ENONET
|
||||
@ -1047,12 +1078,6 @@ They are not yet documented.}
|
||||
@comment errno ???/65
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Link has been severed
|
||||
@deftypevr Macro int ENOLINK
|
||||
@comment errno ???/67
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Advertise error
|
||||
@deftypevr Macro int EADV
|
||||
@ -1071,36 +1096,12 @@ They are not yet documented.}
|
||||
@comment errno ???/70
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Protocol error
|
||||
@deftypevr Macro int EPROTO
|
||||
@comment errno ???/71
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Multihop attempted
|
||||
@deftypevr Macro int EMULTIHOP
|
||||
@comment errno ???/72
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: RFS specific error
|
||||
@deftypevr Macro int EDOTDOT
|
||||
@comment errno ???/73
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Not a data message
|
||||
@deftypevr Macro int EBADMSG
|
||||
@comment errno ???/74
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Value too large for defined data type
|
||||
@deftypevr Macro int EOVERFLOW
|
||||
@comment errno ???/75
|
||||
@end deftypevr
|
||||
|
||||
@comment errno.h
|
||||
@comment Linux???: Name not unique on network
|
||||
@deftypevr Macro int ENOTUNIQ
|
||||
|
@ -96,7 +96,7 @@
|
||||
# define ungetc(c, s) (--read_in, ungetc (c, s))
|
||||
# define inchar() ((c = getc (s)), (void) ++read_in, c)
|
||||
# define encode_error() do { \
|
||||
_IO_funlockfile (s); \
|
||||
funlockfile (s); \
|
||||
__set_errno (EILSEQ); \
|
||||
return done; \
|
||||
} while (0)
|
||||
|
@ -27,9 +27,7 @@ Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Dissect the given mode string into an __io_mode. */
|
||||
int
|
||||
__getmode (mode, mptr)
|
||||
const char *mode;
|
||||
__io_mode *mptr;
|
||||
__getmode (const char *mode, __io_mode *mptr)
|
||||
{
|
||||
register unsigned char i;
|
||||
|
||||
|
@ -24,8 +24,7 @@ Cambridge, MA 02139, USA. */
|
||||
|
||||
/* Make sure that FP has its functions set. */
|
||||
void
|
||||
__stdio_check_funcs (fp)
|
||||
register FILE *fp;
|
||||
__stdio_check_funcs (register FILE *fp)
|
||||
{
|
||||
if (!fp->__seen)
|
||||
{
|
||||
@ -51,8 +50,7 @@ __stdio_check_funcs (fp)
|
||||
/* Figure out what kind of buffering (none, line, or full)
|
||||
and what buffer size to give FP. */
|
||||
static void
|
||||
init_stream (fp)
|
||||
register FILE *fp;
|
||||
init_stream (register FILE *fp)
|
||||
{
|
||||
__stdio_check_funcs (fp);
|
||||
|
||||
@ -141,8 +139,7 @@ __stdio_check_offset (stream)
|
||||
seeking as necessary and updating its `offset' field.
|
||||
Sets ferror(FP) (and possibly errno) for errors. */
|
||||
static void
|
||||
seek_to_target (fp)
|
||||
FILE *fp;
|
||||
seek_to_target (FILE *fp)
|
||||
{
|
||||
int save = errno;
|
||||
if (__stdio_check_offset (fp) == EOF)
|
||||
@ -197,9 +194,7 @@ seek_to_target (fp)
|
||||
flushed to avoid a system call for a single character.
|
||||
This is the default `output room' function. */
|
||||
static void
|
||||
flushbuf (fp, c)
|
||||
register FILE *fp;
|
||||
int c;
|
||||
flushbuf (register FILE *fp, int c)
|
||||
{
|
||||
int flush_only = c == EOF;
|
||||
size_t buffer_written;
|
||||
@ -394,8 +389,7 @@ flushbuf (fp, c)
|
||||
/* Fill the buffer for FP and return the first character read (or EOF).
|
||||
This is the default `input_room' function. */
|
||||
static int
|
||||
fillbuf (fp)
|
||||
register FILE *fp;
|
||||
fillbuf (register FILE *fp)
|
||||
{
|
||||
/* How far into the buffer we read we want to start bufp. */
|
||||
size_t buffer_offset = 0;
|
||||
|
@ -29,9 +29,7 @@ struct memstream_info
|
||||
|
||||
/* Enlarge STREAM's buffer. */
|
||||
static void
|
||||
enlarge_buffer (stream, c)
|
||||
register FILE *stream;
|
||||
int c;
|
||||
enlarge_buffer (register FILE *stream, int c)
|
||||
{
|
||||
struct memstream_info *info = (struct memstream_info *) stream->__cookie;
|
||||
size_t need;
|
||||
@ -96,10 +94,7 @@ enlarge_buffer (stream, c)
|
||||
There is no external state to munge. */
|
||||
|
||||
static int
|
||||
seek (cookie, pos, whence)
|
||||
void *cookie;
|
||||
fpos_t *pos;
|
||||
int whence;
|
||||
seek (void *cookie, fpos_t *pos, int whence)
|
||||
{
|
||||
switch (whence)
|
||||
{
|
||||
@ -120,8 +115,7 @@ seek (cookie, pos, whence)
|
||||
}
|
||||
|
||||
static int
|
||||
free_info (cookie)
|
||||
void *cookie;
|
||||
free_info (void *cookie)
|
||||
{
|
||||
#if 0
|
||||
struct memstream_info *info = (struct memstream_info *) cookie;
|
||||
|
@ -302,7 +302,7 @@ extern char *tmpnam_r __P ((char *__s));
|
||||
#endif
|
||||
|
||||
|
||||
#if def(__USE_SVID) || defined(__USE_XOPEN)
|
||||
#if defined(__USE_SVID) || defined(__USE_XOPEN)
|
||||
/* Generate a unique temporary filename using up to five characters of PFX
|
||||
if it is not NULL. The directory to put this file in is searched for
|
||||
as follows: First the environment variable "TMPDIR" is checked.
|
||||
|
@ -256,7 +256,7 @@ __libc_init_first (int argc __attribute__ ((unused)), ...)
|
||||
cause ld.so to gain an init function, which is not a cool thing. */
|
||||
|
||||
void
|
||||
_dl_start ()
|
||||
_dl_start (void)
|
||||
{
|
||||
abort ();
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ Cambridge, MA 02139, USA. */
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <hurd/ioctl.h>
|
||||
|
||||
#include <mach/mig_support.h>
|
||||
|
||||
#define typesize(type) (1 << (type))
|
||||
|
||||
|
44
sysdeps/mach/hurd/lchown.c
Normal file
44
sysdeps/mach/hurd/lchown.c
Normal file
@ -0,0 +1,44 @@
|
||||
/* Copyright (C) 1991, 1992, 1994, 1995, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <hurd.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
/* Change the owner and group of FILE; if it's a link, do the link and
|
||||
not the target. */
|
||||
int
|
||||
__lchown (file, owner, group)
|
||||
const char *file;
|
||||
uid_t owner;
|
||||
gid_t group;
|
||||
{
|
||||
error_t err;
|
||||
file_t port = __file_name_lookup (file, O_NOLINK, 0);
|
||||
if (port == MACH_PORT_NULL)
|
||||
return -1;
|
||||
err = __file_chown (port, owner, group);
|
||||
__mach_port_deallocate (__mach_task_self (), port);
|
||||
if (err)
|
||||
return __hurd_fail (err);
|
||||
return 0;
|
||||
}
|
||||
|
||||
weak_alias (__lchown, lchown)
|
@ -117,67 +117,76 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
return -1;
|
||||
|
||||
/* Send them all io_select request messages. */
|
||||
err = 0;
|
||||
got = 0;
|
||||
portset = MACH_PORT_NULL;
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type)
|
||||
{
|
||||
int type = d[i].type;
|
||||
d[i].reply_port = __mach_reply_port ();
|
||||
err = __io_select (d[i].io_port, d[i].reply_port,
|
||||
/* Poll only when there's a single descriptor. */
|
||||
(firstfd == lastfd) ? to : 0,
|
||||
&type);
|
||||
switch (err)
|
||||
|
||||
if (firstfd == -1)
|
||||
/* But not if there were no ports to deal with at all. */
|
||||
portset = __mach_reply_port ();
|
||||
else
|
||||
{
|
||||
err = 0;
|
||||
got = 0;
|
||||
portset = MACH_PORT_NULL;
|
||||
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type)
|
||||
{
|
||||
case MACH_RCV_TIMED_OUT:
|
||||
/* No immediate response. This is normal. */
|
||||
err = 0;
|
||||
if (firstfd == lastfd)
|
||||
/* When there's a single descriptor, we don't need a portset,
|
||||
so just pretend we have one, but really use the single reply
|
||||
port. */
|
||||
portset = d[i].reply_port;
|
||||
else if (got == 0)
|
||||
/* We've got multiple reply ports, so we need a port set to
|
||||
multiplex them. */
|
||||
int type = d[i].type;
|
||||
d[i].reply_port = __mach_reply_port ();
|
||||
err = __io_select (d[i].io_port, d[i].reply_port,
|
||||
/* Poll only if there's a single descriptor. */
|
||||
(firstfd == lastfd) ? to : 0,
|
||||
&type);
|
||||
switch (err)
|
||||
{
|
||||
/* We will wait again for a reply later. */
|
||||
if (portset == MACH_PORT_NULL)
|
||||
/* Create the portset to receive all the replies on. */
|
||||
err = __mach_port_allocate (__mach_task_self (),
|
||||
MACH_PORT_RIGHT_PORT_SET,
|
||||
&portset);
|
||||
if (! err)
|
||||
/* Put this reply port in the port set. */
|
||||
__mach_port_move_member (__mach_task_self (),
|
||||
d[i].reply_port, portset);
|
||||
case MACH_RCV_TIMED_OUT:
|
||||
/* No immediate response. This is normal. */
|
||||
err = 0;
|
||||
if (firstfd == lastfd)
|
||||
/* When there's a single descriptor, we don't need a
|
||||
portset, so just pretend we have one, but really
|
||||
use the single reply port. */
|
||||
portset = d[i].reply_port;
|
||||
else if (got == 0)
|
||||
/* We've got multiple reply ports, so we need a port set to
|
||||
multiplex them. */
|
||||
{
|
||||
/* We will wait again for a reply later. */
|
||||
if (portset == MACH_PORT_NULL)
|
||||
/* Create the portset to receive all the replies on. */
|
||||
err = __mach_port_allocate (__mach_task_self (),
|
||||
MACH_PORT_RIGHT_PORT_SET,
|
||||
&portset);
|
||||
if (! err)
|
||||
/* Put this reply port in the port set. */
|
||||
__mach_port_move_member (__mach_task_self (),
|
||||
d[i].reply_port, portset);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* No other error should happen. Callers of select
|
||||
don't expect to see errors, so we simulate
|
||||
readiness of the erring object and the next call
|
||||
hopefully will get the error again. */
|
||||
type = SELECT_ALL;
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 0:
|
||||
/* We got an answer. */
|
||||
if ((type & SELECT_ALL) == 0)
|
||||
/* Bogus answer; treat like an error, as a fake positive. */
|
||||
type = SELECT_ALL;
|
||||
|
||||
/* This port is already ready already. */
|
||||
d[i].type &= type;
|
||||
d[i].type |= SELECT_RETURNED;
|
||||
++got;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* No other error should happen. Callers of select don't
|
||||
expect to see errors, so we simulate readiness of the erring
|
||||
object and the next call hopefully will get the error again. */
|
||||
type = SELECT_ALL;
|
||||
/* FALLTHROUGH */
|
||||
|
||||
case 0:
|
||||
/* We got an answer. */
|
||||
if ((type & SELECT_ALL) == 0)
|
||||
/* Bogus answer; treat like an error, as a fake positive. */
|
||||
type = SELECT_ALL;
|
||||
|
||||
/* This port is already ready already. */
|
||||
d[i].type &= type;
|
||||
d[i].type |= SELECT_RETURNED;
|
||||
++got;
|
||||
break;
|
||||
_hurd_port_free (&d[i].cell->port, &d[i].ulink, d[i].io_port);
|
||||
}
|
||||
_hurd_port_free (&d[i].cell->port, &d[i].ulink, d[i].io_port);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Now wait for reply messages. */
|
||||
if (!err && got == 0)
|
||||
{
|
||||
@ -234,7 +243,7 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
(msg.success.result & SELECT_ALL) == 0)
|
||||
{
|
||||
/* Error or bogus reply. Simulate readiness. */
|
||||
__mach_msg_destroy (&msg);
|
||||
__mach_msg_destroy (&msg.head);
|
||||
msg.success.result = SELECT_ALL;
|
||||
}
|
||||
|
||||
@ -242,13 +251,15 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
readiness. */
|
||||
{
|
||||
int had = got;
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type && d[i].reply_port == msg.head.msgh_local_port)
|
||||
{
|
||||
d[i].type &= msg.success.result;
|
||||
d[i].type |= SELECT_RETURNED;
|
||||
++got;
|
||||
}
|
||||
if (firstfd != -1)
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type
|
||||
&& d[i].reply_port == msg.head.msgh_local_port)
|
||||
{
|
||||
d[i].type &= msg.success.result;
|
||||
d[i].type |= SELECT_RETURNED;
|
||||
++got;
|
||||
}
|
||||
assert (got > had);
|
||||
}
|
||||
}
|
||||
@ -280,10 +291,11 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
err = 0;
|
||||
}
|
||||
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type)
|
||||
__mach_port_destroy (__mach_task_self (), d[i].reply_port);
|
||||
if (firstfd != lastfd && portset != MACH_PORT_NULL)
|
||||
if (firstfd != -1)
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
if (d[i].type)
|
||||
__mach_port_destroy (__mach_task_self (), d[i].reply_port);
|
||||
if (firstfd == -1 || (firstfd != lastfd && portset != MACH_PORT_NULL))
|
||||
/* Destroy PORTSET, but only if it's not actually the reply port for a
|
||||
single descriptor (in which case it's destroyed in the previous loop;
|
||||
not doing it here is just a bit more efficient). */
|
||||
@ -298,26 +310,27 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
|
||||
|
||||
/* Set the user bitarrays. We only ever have to clear bits, as all desired
|
||||
ones are initially set. */
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
{
|
||||
int type = d[i].type;
|
||||
if (firstfd != -1)
|
||||
for (i = firstfd; i <= lastfd; ++i)
|
||||
{
|
||||
int type = d[i].type;
|
||||
|
||||
if ((type & SELECT_RETURNED) == 0)
|
||||
type = 0;
|
||||
|
||||
if ((type & SELECT_RETURNED) == 0)
|
||||
type = 0;
|
||||
|
||||
if (type & SELECT_READ)
|
||||
got++;
|
||||
else if (readfds)
|
||||
FD_CLR (i, readfds);
|
||||
if (type & SELECT_WRITE)
|
||||
got++;
|
||||
else if (writefds)
|
||||
FD_CLR (i, writefds);
|
||||
if (type & SELECT_URG)
|
||||
got++;
|
||||
else if (exceptfds)
|
||||
FD_CLR (i, exceptfds);
|
||||
}
|
||||
if (type & SELECT_READ)
|
||||
got++;
|
||||
else if (readfds)
|
||||
FD_CLR (i, readfds);
|
||||
if (type & SELECT_WRITE)
|
||||
got++;
|
||||
else if (writefds)
|
||||
FD_CLR (i, writefds);
|
||||
if (type & SELECT_URG)
|
||||
got++;
|
||||
else if (exceptfds)
|
||||
FD_CLR (i, exceptfds);
|
||||
}
|
||||
|
||||
return got;
|
||||
}
|
||||
|
@ -106,8 +106,20 @@ struct stat
|
||||
protection bits for unknown users. */
|
||||
#define S_IUNKSHIFT 12
|
||||
|
||||
/* All the unused bits. */
|
||||
#define S_ISPARE (~(S_IFMT|S_INOCACHE|S_IUNKNOWN|07777))
|
||||
/* Read only bits: */
|
||||
|
||||
/* There is a passive translator set for this file */
|
||||
#define S_IPTRANS 000010000000
|
||||
/* There is an active translator running on this file */
|
||||
#define S_IATRANS 000020000000
|
||||
/* This is the root of a filesystem (or single node translator) */
|
||||
#define S_IROOT 000040000000
|
||||
/* All the bits relevant to translators */
|
||||
#define S_ITRANS 000070000000
|
||||
|
||||
/* ALL the unused bits. */
|
||||
#define S_ISPARE (~(S_IFMT|S_ITRANS|S_INOCACHE| \
|
||||
S_IUSEUNK|S_IUNKNOWN|07777))
|
||||
#endif
|
||||
|
||||
/* Default file creation mask (umask). */
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <ansidecl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
@ -27,9 +26,11 @@ Cambridge, MA 02139, USA. */
|
||||
The buffers are filled in the order specified.
|
||||
Operates just like `read' (see <unistd.h>) except that data are
|
||||
put in VECTOR instead of a contiguous buffer. */
|
||||
int
|
||||
DEFUN(readv, (fd, vector, count),
|
||||
int fd AND CONST struct iovec *vector AND size_t count)
|
||||
ssize_t
|
||||
readv (fd, vector, count)
|
||||
int fd;
|
||||
const struct iovec *vector;
|
||||
size_t count;
|
||||
{
|
||||
char *buffer;
|
||||
size_t bytes;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1992 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1992, 1996 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
@ -16,7 +16,6 @@ License along with the GNU C Library; see the file COPYING.LIB. If
|
||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <ansidecl.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
@ -27,9 +26,11 @@ Cambridge, MA 02139, USA. */
|
||||
The data is written in the order specified.
|
||||
Operates just like `write' (see <unistd.h>) except that the data
|
||||
are taken from VECTOR instead of a contiguous buffer. */
|
||||
int
|
||||
DEFUN(writev, (fd, vector, count),
|
||||
int fd AND CONST struct iovec *vector AND size_t count)
|
||||
ssize_t
|
||||
writev (fd, vector, count)
|
||||
int fd;
|
||||
const struct iovec *vector;
|
||||
size_t count;
|
||||
{
|
||||
char *buffer;
|
||||
register char *bp;
|
||||
|
Loading…
Reference in New Issue
Block a user