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:
Thomas Bushnell, BSG 1996-11-15 19:50:04 +00:00
parent 63afd6ae40
commit ebe3b3ebb7
16 changed files with 288 additions and 202 deletions

View File

@ -37,6 +37,14 @@
/* /*
* HISTORY * HISTORY
* $Log$ * $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 * Revision 1.11 1996/06/06 15:13:47 miles
* Changes to bring in line with the hurd libthreads/malloc.c: * Changes to bring in line with the hurd libthreads/malloc.c:
* (more_memory): Use assert_perror instead of MACH_CALL. * (more_memory): Use assert_perror instead of MACH_CALL.
@ -206,9 +214,7 @@ malloc_init (void)
} }
static void static void
more_memory(size, fl) more_memory(int size, free_list_t fl)
int size;
register free_list_t fl;
{ {
register int amount; register int amount;
register int n; register int n;
@ -448,7 +454,8 @@ print_malloc_free_list()
} }
#endif DEBUG #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 * Prepare the malloc module for a fork by insuring that no thread is in a
* malloc critical section. * 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. * 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. * Called in the child process after a fork() to resume normal operation.
*/ */

View File

@ -1,5 +1,5 @@
/* Standard header for all Mach programs. /* 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. 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
@ -71,6 +71,14 @@ mach_msg_server_timeout (boolean_t (*__demux) (mach_msg_header_t *__request,
mach_msg_timeout_t __timeout); 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 #define __need_FILE
#include <stdio.h> #include <stdio.h>

View File

@ -26,6 +26,17 @@
/* /*
* HISTORY * HISTORY
* $Log$ * $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 * Revision 1.3 1995/01/23 22:16:52 roland
* (mach_msg_destroy): Define as weak alias for __mach_msg_destroy. * (mach_msg_destroy): Define as weak alias for __mach_msg_destroy.
* *
@ -53,8 +64,8 @@
#include <mach_init.h> #include <mach_init.h>
#endif #endif
static void mach_msg_destroy_port(); static void mach_msg_destroy_port(mach_port_t, mach_msg_type_name_t);
static void mach_msg_destroy_memory(); static void mach_msg_destroy_memory(vm_offset_t, vm_size_t);
/* /*
* Routine: mach_msg_destroy * Routine: mach_msg_destroy

View File

@ -894,6 +894,73 @@ Go home and have a glass of warm, dairy-fresh milk.
This error code has no purpose. This error code has no purpose.
@end deftypevr @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. @emph{The following error codes are defined by the Linux/i386 kernel.
They are not yet documented.} They are not yet documented.}
@ -903,18 +970,6 @@ They are not yet documented.}
@comment errno ???/85 @comment errno ???/85
@end deftypevr @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 errno.h
@comment Linux???: Channel number out of range @comment Linux???: Channel number out of range
@deftypevr Macro int ECHRNG @deftypevr Macro int ECHRNG
@ -1011,30 +1066,6 @@ They are not yet documented.}
@comment errno ???/59 @comment errno ???/59
@end deftypevr @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 errno.h
@comment Linux???: Machine is not on the network @comment Linux???: Machine is not on the network
@deftypevr Macro int ENONET @deftypevr Macro int ENONET
@ -1047,12 +1078,6 @@ They are not yet documented.}
@comment errno ???/65 @comment errno ???/65
@end deftypevr @end deftypevr
@comment errno.h
@comment Linux???: Link has been severed
@deftypevr Macro int ENOLINK
@comment errno ???/67
@end deftypevr
@comment errno.h @comment errno.h
@comment Linux???: Advertise error @comment Linux???: Advertise error
@deftypevr Macro int EADV @deftypevr Macro int EADV
@ -1071,36 +1096,12 @@ They are not yet documented.}
@comment errno ???/70 @comment errno ???/70
@end deftypevr @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 errno.h
@comment Linux???: RFS specific error @comment Linux???: RFS specific error
@deftypevr Macro int EDOTDOT @deftypevr Macro int EDOTDOT
@comment errno ???/73 @comment errno ???/73
@end deftypevr @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 errno.h
@comment Linux???: Name not unique on network @comment Linux???: Name not unique on network
@deftypevr Macro int ENOTUNIQ @deftypevr Macro int ENOTUNIQ

View File

@ -96,7 +96,7 @@
# define ungetc(c, s) (--read_in, ungetc (c, s)) # define ungetc(c, s) (--read_in, ungetc (c, s))
# define inchar() ((c = getc (s)), (void) ++read_in, c) # define inchar() ((c = getc (s)), (void) ++read_in, c)
# define encode_error() do { \ # define encode_error() do { \
_IO_funlockfile (s); \ funlockfile (s); \
__set_errno (EILSEQ); \ __set_errno (EILSEQ); \
return done; \ return done; \
} while (0) } while (0)

View File

@ -27,9 +27,7 @@ Cambridge, MA 02139, USA. */
/* Dissect the given mode string into an __io_mode. */ /* Dissect the given mode string into an __io_mode. */
int int
__getmode (mode, mptr) __getmode (const char *mode, __io_mode *mptr)
const char *mode;
__io_mode *mptr;
{ {
register unsigned char i; register unsigned char i;

View File

@ -24,8 +24,7 @@ Cambridge, MA 02139, USA. */
/* Make sure that FP has its functions set. */ /* Make sure that FP has its functions set. */
void void
__stdio_check_funcs (fp) __stdio_check_funcs (register FILE *fp)
register FILE *fp;
{ {
if (!fp->__seen) if (!fp->__seen)
{ {
@ -51,8 +50,7 @@ __stdio_check_funcs (fp)
/* Figure out what kind of buffering (none, line, or full) /* Figure out what kind of buffering (none, line, or full)
and what buffer size to give FP. */ and what buffer size to give FP. */
static void static void
init_stream (fp) init_stream (register FILE *fp)
register FILE *fp;
{ {
__stdio_check_funcs (fp); __stdio_check_funcs (fp);
@ -141,8 +139,7 @@ __stdio_check_offset (stream)
seeking as necessary and updating its `offset' field. seeking as necessary and updating its `offset' field.
Sets ferror(FP) (and possibly errno) for errors. */ Sets ferror(FP) (and possibly errno) for errors. */
static void static void
seek_to_target (fp) seek_to_target (FILE *fp)
FILE *fp;
{ {
int save = errno; int save = errno;
if (__stdio_check_offset (fp) == EOF) if (__stdio_check_offset (fp) == EOF)
@ -197,9 +194,7 @@ seek_to_target (fp)
flushed to avoid a system call for a single character. flushed to avoid a system call for a single character.
This is the default `output room' function. */ This is the default `output room' function. */
static void static void
flushbuf (fp, c) flushbuf (register FILE *fp, int c)
register FILE *fp;
int c;
{ {
int flush_only = c == EOF; int flush_only = c == EOF;
size_t buffer_written; size_t buffer_written;
@ -394,8 +389,7 @@ flushbuf (fp, c)
/* Fill the buffer for FP and return the first character read (or EOF). /* Fill the buffer for FP and return the first character read (or EOF).
This is the default `input_room' function. */ This is the default `input_room' function. */
static int static int
fillbuf (fp) fillbuf (register FILE *fp)
register FILE *fp;
{ {
/* How far into the buffer we read we want to start bufp. */ /* How far into the buffer we read we want to start bufp. */
size_t buffer_offset = 0; size_t buffer_offset = 0;

View File

@ -29,9 +29,7 @@ struct memstream_info
/* Enlarge STREAM's buffer. */ /* Enlarge STREAM's buffer. */
static void static void
enlarge_buffer (stream, c) enlarge_buffer (register FILE *stream, int c)
register FILE *stream;
int c;
{ {
struct memstream_info *info = (struct memstream_info *) stream->__cookie; struct memstream_info *info = (struct memstream_info *) stream->__cookie;
size_t need; size_t need;
@ -96,10 +94,7 @@ enlarge_buffer (stream, c)
There is no external state to munge. */ There is no external state to munge. */
static int static int
seek (cookie, pos, whence) seek (void *cookie, fpos_t *pos, int whence)
void *cookie;
fpos_t *pos;
int whence;
{ {
switch (whence) switch (whence)
{ {
@ -120,8 +115,7 @@ seek (cookie, pos, whence)
} }
static int static int
free_info (cookie) free_info (void *cookie)
void *cookie;
{ {
#if 0 #if 0
struct memstream_info *info = (struct memstream_info *) cookie; struct memstream_info *info = (struct memstream_info *) cookie;

View File

@ -302,7 +302,7 @@ extern char *tmpnam_r __P ((char *__s));
#endif #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 /* 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 if it is not NULL. The directory to put this file in is searched for
as follows: First the environment variable "TMPDIR" is checked. as follows: First the environment variable "TMPDIR" is checked.

View File

@ -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. */ cause ld.so to gain an init function, which is not a cool thing. */
void void
_dl_start () _dl_start (void)
{ {
abort (); abort ();
} }

View File

@ -27,7 +27,7 @@ Cambridge, MA 02139, USA. */
#include <assert.h> #include <assert.h>
#include <string.h> #include <string.h>
#include <hurd/ioctl.h> #include <hurd/ioctl.h>
#include <mach/mig_support.h>
#define typesize(type) (1 << (type)) #define typesize(type) (1 << (type))

View 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)

View File

@ -117,16 +117,23 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
return -1; return -1;
/* Send them all io_select request messages. */ /* Send them all io_select request messages. */
if (firstfd == -1)
/* But not if there were no ports to deal with at all. */
portset = __mach_reply_port ();
else
{
err = 0; err = 0;
got = 0; got = 0;
portset = MACH_PORT_NULL; portset = MACH_PORT_NULL;
for (i = firstfd; i <= lastfd; ++i) for (i = firstfd; i <= lastfd; ++i)
if (d[i].type) if (d[i].type)
{ {
int type = d[i].type; int type = d[i].type;
d[i].reply_port = __mach_reply_port (); d[i].reply_port = __mach_reply_port ();
err = __io_select (d[i].io_port, d[i].reply_port, err = __io_select (d[i].io_port, d[i].reply_port,
/* Poll only when there's a single descriptor. */ /* Poll only if there's a single descriptor. */
(firstfd == lastfd) ? to : 0, (firstfd == lastfd) ? to : 0,
&type); &type);
switch (err) switch (err)
@ -135,9 +142,9 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
/* No immediate response. This is normal. */ /* No immediate response. This is normal. */
err = 0; err = 0;
if (firstfd == lastfd) if (firstfd == lastfd)
/* When there's a single descriptor, we don't need a portset, /* When there's a single descriptor, we don't need a
so just pretend we have one, but really use the single reply portset, so just pretend we have one, but really
port. */ use the single reply port. */
portset = d[i].reply_port; portset = d[i].reply_port;
else if (got == 0) else if (got == 0)
/* We've got multiple reply ports, so we need a port set to /* We've got multiple reply ports, so we need a port set to
@ -157,9 +164,10 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
break; break;
default: default:
/* No other error should happen. Callers of select don't /* No other error should happen. Callers of select
expect to see errors, so we simulate readiness of the erring don't expect to see errors, so we simulate
object and the next call hopefully will get the error again. */ readiness of the erring object and the next call
hopefully will get the error again. */
type = SELECT_ALL; type = SELECT_ALL;
/* FALLTHROUGH */ /* FALLTHROUGH */
@ -177,6 +185,7 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
} }
_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. */ /* Now wait for reply messages. */
if (!err && got == 0) if (!err && got == 0)
@ -234,7 +243,7 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
(msg.success.result & SELECT_ALL) == 0) (msg.success.result & SELECT_ALL) == 0)
{ {
/* Error or bogus reply. Simulate readiness. */ /* Error or bogus reply. Simulate readiness. */
__mach_msg_destroy (&msg); __mach_msg_destroy (&msg.head);
msg.success.result = SELECT_ALL; msg.success.result = SELECT_ALL;
} }
@ -242,8 +251,10 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
readiness. */ readiness. */
{ {
int had = got; int had = got;
if (firstfd != -1)
for (i = firstfd; i <= lastfd; ++i) for (i = firstfd; i <= lastfd; ++i)
if (d[i].type && d[i].reply_port == msg.head.msgh_local_port) if (d[i].type
&& d[i].reply_port == msg.head.msgh_local_port)
{ {
d[i].type &= msg.success.result; d[i].type &= msg.success.result;
d[i].type |= SELECT_RETURNED; d[i].type |= SELECT_RETURNED;
@ -280,10 +291,11 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
err = 0; err = 0;
} }
if (firstfd != -1)
for (i = firstfd; i <= lastfd; ++i) for (i = firstfd; i <= lastfd; ++i)
if (d[i].type) if (d[i].type)
__mach_port_destroy (__mach_task_self (), d[i].reply_port); __mach_port_destroy (__mach_task_self (), d[i].reply_port);
if (firstfd != lastfd && portset != MACH_PORT_NULL) if (firstfd == -1 || (firstfd != lastfd && portset != MACH_PORT_NULL))
/* Destroy PORTSET, but only if it's not actually the reply port for a /* 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; single descriptor (in which case it's destroyed in the previous loop;
not doing it here is just a bit more efficient). */ not doing it here is just a bit more efficient). */
@ -298,6 +310,7 @@ DEFUN(__select, (nfds, readfds, writefds, exceptfds, timeout),
/* Set the user bitarrays. We only ever have to clear bits, as all desired /* Set the user bitarrays. We only ever have to clear bits, as all desired
ones are initially set. */ ones are initially set. */
if (firstfd != -1)
for (i = firstfd; i <= lastfd; ++i) for (i = firstfd; i <= lastfd; ++i)
{ {
int type = d[i].type; int type = d[i].type;

View File

@ -106,8 +106,20 @@ struct stat
protection bits for unknown users. */ protection bits for unknown users. */
#define S_IUNKSHIFT 12 #define S_IUNKSHIFT 12
/* All the unused bits. */ /* Read only bits: */
#define S_ISPARE (~(S_IFMT|S_INOCACHE|S_IUNKNOWN|07777))
/* 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 #endif
/* Default file creation mask (umask). */ /* Default file creation mask (umask). */

View File

@ -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. 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
@ -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, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -27,9 +26,11 @@ Cambridge, MA 02139, USA. */
The buffers are filled in the order specified. The buffers are filled in the order specified.
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
int ssize_t
DEFUN(readv, (fd, vector, count), readv (fd, vector, count)
int fd AND CONST struct iovec *vector AND size_t count) int fd;
const struct iovec *vector;
size_t count;
{ {
char *buffer; char *buffer;
size_t bytes; size_t bytes;

View File

@ -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. 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
@ -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, not, write to the Free Software Foundation, Inc., 675 Mass Ave,
Cambridge, MA 02139, USA. */ Cambridge, MA 02139, USA. */
#include <ansidecl.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
@ -27,9 +26,11 @@ Cambridge, MA 02139, USA. */
The data is written in the order specified. The data is written in the order specified.
Operates just like `write' (see <unistd.h>) except that the data Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */ are taken from VECTOR instead of a contiguous buffer. */
int ssize_t
DEFUN(writev, (fd, vector, count), writev (fd, vector, count)
int fd AND CONST struct iovec *vector AND size_t count) int fd;
const struct iovec *vector;
size_t count;
{ {
char *buffer; char *buffer;
register char *bp; register char *bp;