mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-04-30 20:00:19 +02:00
Use Gnulib's full-write' and
full-read' modules.
This commit is contained in:
parent
aa7a939cbf
commit
9b36a80c79
12 changed files with 1011 additions and 48 deletions
109
lib/Makefile.am
109
lib/Makefile.am
|
@ -9,7 +9,7 @@
|
||||||
# the same distribution terms as the rest of that program.
|
# the same distribution terms as the rest of that program.
|
||||||
#
|
#
|
||||||
# Generated by gnulib-tool.
|
# Generated by gnulib-tool.
|
||||||
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl --libtool --macro-prefix=gl alloca autobuild count-one-bits extensions strcase strftime
|
# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl --libtool --macro-prefix=gl alloca autobuild count-one-bits extensions full-read full-write strcase strftime
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = 1.5 gnits
|
AUTOMAKE_OPTIONS = 1.5 gnits
|
||||||
|
|
||||||
|
@ -71,6 +71,18 @@ EXTRA_DIST += count-one-bits.h
|
||||||
|
|
||||||
## end gnulib module count-one-bits
|
## end gnulib module count-one-bits
|
||||||
|
|
||||||
|
## begin gnulib module full-read
|
||||||
|
|
||||||
|
libgnu_la_SOURCES += full-read.h full-read.c
|
||||||
|
|
||||||
|
## end gnulib module full-read
|
||||||
|
|
||||||
|
## begin gnulib module full-write
|
||||||
|
|
||||||
|
libgnu_la_SOURCES += full-write.h full-write.c
|
||||||
|
|
||||||
|
## end gnulib module full-write
|
||||||
|
|
||||||
## begin gnulib module link-warning
|
## begin gnulib module link-warning
|
||||||
|
|
||||||
LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h
|
LINK_WARNING_H=$(top_srcdir)/build-aux/link-warning.h
|
||||||
|
@ -79,6 +91,24 @@ EXTRA_DIST += $(top_srcdir)/build-aux/link-warning.h
|
||||||
|
|
||||||
## end gnulib module link-warning
|
## end gnulib module link-warning
|
||||||
|
|
||||||
|
## begin gnulib module safe-read
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += safe-read.c safe-read.h
|
||||||
|
|
||||||
|
EXTRA_libgnu_la_SOURCES += safe-read.c
|
||||||
|
|
||||||
|
## end gnulib module safe-read
|
||||||
|
|
||||||
|
## begin gnulib module safe-write
|
||||||
|
|
||||||
|
|
||||||
|
EXTRA_DIST += safe-write.c safe-write.h
|
||||||
|
|
||||||
|
EXTRA_libgnu_la_SOURCES += safe-write.c
|
||||||
|
|
||||||
|
## end gnulib module safe-write
|
||||||
|
|
||||||
## begin gnulib module stdbool
|
## begin gnulib module stdbool
|
||||||
|
|
||||||
BUILT_SOURCES += $(STDBOOL_H)
|
BUILT_SOURCES += $(STDBOOL_H)
|
||||||
|
@ -175,6 +205,74 @@ EXTRA_libgnu_la_SOURCES += time_r.c
|
||||||
|
|
||||||
## end gnulib module time_r
|
## end gnulib module time_r
|
||||||
|
|
||||||
|
## begin gnulib module unistd
|
||||||
|
|
||||||
|
BUILT_SOURCES += unistd.h
|
||||||
|
|
||||||
|
# We need the following in order to create an empty placeholder for
|
||||||
|
# <unistd.h> when the system doesn't have one.
|
||||||
|
unistd.h: unistd.in.h
|
||||||
|
rm -f $@-t $@
|
||||||
|
{ echo '/* DO NOT EDIT! GENERATED AUTOMATICALLY! */'; \
|
||||||
|
sed -e 's|@''HAVE_UNISTD_H''@|$(HAVE_UNISTD_H)|g' \
|
||||||
|
-e 's|@''INCLUDE_NEXT''@|$(INCLUDE_NEXT)|g' \
|
||||||
|
-e 's|@''PRAGMA_SYSTEM_HEADER''@|@PRAGMA_SYSTEM_HEADER@|g' \
|
||||||
|
-e 's|@''NEXT_UNISTD_H''@|$(NEXT_UNISTD_H)|g' \
|
||||||
|
-e 's|@''GNULIB_CHOWN''@|$(GNULIB_CHOWN)|g' \
|
||||||
|
-e 's|@''GNULIB_CLOSE''@|$(GNULIB_CLOSE)|g' \
|
||||||
|
-e 's|@''GNULIB_DUP2''@|$(GNULIB_DUP2)|g' \
|
||||||
|
-e 's|@''GNULIB_ENVIRON''@|$(GNULIB_ENVIRON)|g' \
|
||||||
|
-e 's|@''GNULIB_EUIDACCESS''@|$(GNULIB_EUIDACCESS)|g' \
|
||||||
|
-e 's|@''GNULIB_FCHDIR''@|$(GNULIB_FCHDIR)|g' \
|
||||||
|
-e 's|@''GNULIB_FSYNC''@|$(GNULIB_FSYNC)|g' \
|
||||||
|
-e 's|@''GNULIB_FTRUNCATE''@|$(GNULIB_FTRUNCATE)|g' \
|
||||||
|
-e 's|@''GNULIB_GETCWD''@|$(GNULIB_GETCWD)|g' \
|
||||||
|
-e 's|@''GNULIB_GETDOMAINNAME''@|$(GNULIB_GETDOMAINNAME)|g' \
|
||||||
|
-e 's|@''GNULIB_GETDTABLESIZE''@|$(GNULIB_GETDTABLESIZE)|g' \
|
||||||
|
-e 's|@''GNULIB_GETHOSTNAME''@|$(GNULIB_GETHOSTNAME)|g' \
|
||||||
|
-e 's|@''GNULIB_GETLOGIN_R''@|$(GNULIB_GETLOGIN_R)|g' \
|
||||||
|
-e 's|@''GNULIB_GETPAGESIZE''@|$(GNULIB_GETPAGESIZE)|g' \
|
||||||
|
-e 's|@''GNULIB_GETUSERSHELL''@|$(GNULIB_GETUSERSHELL)|g' \
|
||||||
|
-e 's|@''GNULIB_LCHOWN''@|$(GNULIB_LCHOWN)|g' \
|
||||||
|
-e 's|@''GNULIB_LSEEK''@|$(GNULIB_LSEEK)|g' \
|
||||||
|
-e 's|@''GNULIB_READLINK''@|$(GNULIB_READLINK)|g' \
|
||||||
|
-e 's|@''GNULIB_SLEEP''@|$(GNULIB_SLEEP)|g' \
|
||||||
|
-e 's|@''GNULIB_UNISTD_H_SIGPIPE''@|$(GNULIB_UNISTD_H_SIGPIPE)|g' \
|
||||||
|
-e 's|@''GNULIB_WRITE''@|$(GNULIB_WRITE)|g' \
|
||||||
|
-e 's|@''HAVE_DUP2''@|$(HAVE_DUP2)|g' \
|
||||||
|
-e 's|@''HAVE_EUIDACCESS''@|$(HAVE_EUIDACCESS)|g' \
|
||||||
|
-e 's|@''HAVE_FSYNC''@|$(HAVE_FSYNC)|g' \
|
||||||
|
-e 's|@''HAVE_FTRUNCATE''@|$(HAVE_FTRUNCATE)|g' \
|
||||||
|
-e 's|@''HAVE_GETDOMAINNAME''@|$(HAVE_GETDOMAINNAME)|g' \
|
||||||
|
-e 's|@''HAVE_GETDTABLESIZE''@|$(HAVE_GETDTABLESIZE)|g' \
|
||||||
|
-e 's|@''HAVE_GETHOSTNAME''@|$(HAVE_GETHOSTNAME)|g' \
|
||||||
|
-e 's|@''HAVE_GETPAGESIZE''@|$(HAVE_GETPAGESIZE)|g' \
|
||||||
|
-e 's|@''HAVE_GETUSERSHELL''@|$(HAVE_GETUSERSHELL)|g' \
|
||||||
|
-e 's|@''HAVE_READLINK''@|$(HAVE_READLINK)|g' \
|
||||||
|
-e 's|@''HAVE_SLEEP''@|$(HAVE_SLEEP)|g' \
|
||||||
|
-e 's|@''HAVE_DECL_ENVIRON''@|$(HAVE_DECL_ENVIRON)|g' \
|
||||||
|
-e 's|@''HAVE_DECL_GETLOGIN_R''@|$(HAVE_DECL_GETLOGIN_R)|g' \
|
||||||
|
-e 's|@''HAVE_OS_H''@|$(HAVE_OS_H)|g' \
|
||||||
|
-e 's|@''HAVE_SYS_PARAM_H''@|$(HAVE_SYS_PARAM_H)|g' \
|
||||||
|
-e 's|@''REPLACE_CHOWN''@|$(REPLACE_CHOWN)|g' \
|
||||||
|
-e 's|@''REPLACE_CLOSE''@|$(REPLACE_CLOSE)|g' \
|
||||||
|
-e 's|@''REPLACE_FCHDIR''@|$(REPLACE_FCHDIR)|g' \
|
||||||
|
-e 's|@''REPLACE_GETCWD''@|$(REPLACE_GETCWD)|g' \
|
||||||
|
-e 's|@''REPLACE_GETPAGESIZE''@|$(REPLACE_GETPAGESIZE)|g' \
|
||||||
|
-e 's|@''REPLACE_LCHOWN''@|$(REPLACE_LCHOWN)|g' \
|
||||||
|
-e 's|@''REPLACE_LSEEK''@|$(REPLACE_LSEEK)|g' \
|
||||||
|
-e 's|@''REPLACE_WRITE''@|$(REPLACE_WRITE)|g' \
|
||||||
|
-e 's|@''UNISTD_H_HAVE_WINSOCK2_H''@|$(UNISTD_H_HAVE_WINSOCK2_H)|g' \
|
||||||
|
-e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \
|
||||||
|
< $(srcdir)/unistd.in.h; \
|
||||||
|
} > $@-t
|
||||||
|
mv $@-t $@
|
||||||
|
MOSTLYCLEANFILES += unistd.h unistd.h-t
|
||||||
|
|
||||||
|
EXTRA_DIST += unistd.in.h
|
||||||
|
|
||||||
|
## end gnulib module unistd
|
||||||
|
|
||||||
## begin gnulib module verify
|
## begin gnulib module verify
|
||||||
|
|
||||||
libgnu_la_SOURCES += verify.h
|
libgnu_la_SOURCES += verify.h
|
||||||
|
@ -208,11 +306,14 @@ EXTRA_DIST += wchar.in.h
|
||||||
|
|
||||||
## end gnulib module wchar
|
## end gnulib module wchar
|
||||||
|
|
||||||
## begin gnulib module dummy
|
## begin gnulib module write
|
||||||
|
|
||||||
libgnu_la_SOURCES += dummy.c
|
|
||||||
|
|
||||||
## end gnulib module dummy
|
EXTRA_DIST += write.c
|
||||||
|
|
||||||
|
EXTRA_libgnu_la_SOURCES += write.c
|
||||||
|
|
||||||
|
## end gnulib module write
|
||||||
|
|
||||||
|
|
||||||
mostlyclean-local: mostlyclean-generic
|
mostlyclean-local: mostlyclean-generic
|
||||||
|
|
42
lib/dummy.c
42
lib/dummy.c
|
@ -1,42 +0,0 @@
|
||||||
/* A dummy file, to prevent empty libraries from breaking builds.
|
|
||||||
Copyright (C) 2004, 2007 Free Software Foundation, Inc.
|
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
|
||||||
it under the terms of the GNU Lesser General Public License as published by
|
|
||||||
the Free Software Foundation; either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
This program 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 Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public License
|
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
||||||
|
|
||||||
/* Some systems, reportedly OpenBSD and Mac OS X, refuse to create
|
|
||||||
libraries without any object files. You might get an error like:
|
|
||||||
|
|
||||||
> ar cru .libs/libgl.a
|
|
||||||
> ar: no archive members specified
|
|
||||||
|
|
||||||
Compiling this file, and adding its object file to the library, will
|
|
||||||
prevent the library from being empty. */
|
|
||||||
|
|
||||||
/* Some systems, such as Solaris with cc 5.0, refuse to work with libraries
|
|
||||||
that don't export any symbol. You might get an error like:
|
|
||||||
|
|
||||||
> cc ... libgnu.a
|
|
||||||
> ild: (bad file) garbled symbol table in archive ../gllib/libgnu.a
|
|
||||||
|
|
||||||
Compiling this file, and adding its object file to the library, will
|
|
||||||
prevent the library from exporting no symbols. */
|
|
||||||
|
|
||||||
#ifdef __sun
|
|
||||||
/* This declaration ensures that the library will export at least 1 symbol. */
|
|
||||||
int gl_dummy_symbol;
|
|
||||||
#else
|
|
||||||
/* This declaration is solely to ensure that after preprocessing
|
|
||||||
this file is never empty. */
|
|
||||||
typedef int dummy;
|
|
||||||
#endif
|
|
80
lib/full-write.c
Normal file
80
lib/full-write.c
Normal file
|
@ -0,0 +1,80 @@
|
||||||
|
/* An interface to read and write that retries (if necessary) until complete.
|
||||||
|
|
||||||
|
Copyright (C) 1993, 1994, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
|
||||||
|
2004, 2005, 2006 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifdef FULL_READ
|
||||||
|
# include "full-read.h"
|
||||||
|
#else
|
||||||
|
# include "full-write.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef FULL_READ
|
||||||
|
# include "safe-read.h"
|
||||||
|
# define safe_rw safe_read
|
||||||
|
# define full_rw full_read
|
||||||
|
# undef const
|
||||||
|
# define const /* empty */
|
||||||
|
#else
|
||||||
|
# include "safe-write.h"
|
||||||
|
# define safe_rw safe_write
|
||||||
|
# define full_rw full_write
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef FULL_READ
|
||||||
|
/* Set errno to zero upon EOF. */
|
||||||
|
# define ZERO_BYTE_TRANSFER_ERRNO 0
|
||||||
|
#else
|
||||||
|
/* Some buggy drivers return 0 when one tries to write beyond
|
||||||
|
a device's end. (Example: Linux 1.2.13 on /dev/fd0.)
|
||||||
|
Set errno to ENOSPC so they get a sensible diagnostic. */
|
||||||
|
# define ZERO_BYTE_TRANSFER_ERRNO ENOSPC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Write(read) COUNT bytes at BUF to(from) descriptor FD, retrying if
|
||||||
|
interrupted or if a partial write(read) occurs. Return the number
|
||||||
|
of bytes transferred.
|
||||||
|
When writing, set errno if fewer than COUNT bytes are written.
|
||||||
|
When reading, if fewer than COUNT bytes are read, you must examine
|
||||||
|
errno to distinguish failure from EOF (errno == 0). */
|
||||||
|
size_t
|
||||||
|
full_rw (int fd, const void *buf, size_t count)
|
||||||
|
{
|
||||||
|
size_t total = 0;
|
||||||
|
const char *ptr = (const char *) buf;
|
||||||
|
|
||||||
|
while (count > 0)
|
||||||
|
{
|
||||||
|
size_t n_rw = safe_rw (fd, ptr, count);
|
||||||
|
if (n_rw == (size_t) -1)
|
||||||
|
break;
|
||||||
|
if (n_rw == 0)
|
||||||
|
{
|
||||||
|
errno = ZERO_BYTE_TRANSFER_ERRNO;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
total += n_rw;
|
||||||
|
ptr += n_rw;
|
||||||
|
count -= n_rw;
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
34
lib/full-write.h
Normal file
34
lib/full-write.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* An interface to write() that writes all it is asked to write.
|
||||||
|
|
||||||
|
Copyright (C) 2002-2003 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/* Write COUNT bytes at BUF to descriptor FD, retrying if interrupted
|
||||||
|
or if partial writes occur. Return the number of bytes successfully
|
||||||
|
written, setting errno if that is less than COUNT. */
|
||||||
|
extern size_t full_write (int fd, const void *buf, size_t count);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
77
lib/safe-read.c
Normal file
77
lib/safe-read.c
Normal file
|
@ -0,0 +1,77 @@
|
||||||
|
/* An interface to read and write that retries after interrupts.
|
||||||
|
|
||||||
|
Copyright (C) 1993, 1994, 1998, 2002, 2003, 2004, 2005, 2006 Free
|
||||||
|
Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#ifdef SAFE_WRITE
|
||||||
|
# include "safe-write.h"
|
||||||
|
#else
|
||||||
|
# include "safe-read.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Get ssize_t. */
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#ifdef EINTR
|
||||||
|
# define IS_EINTR(x) ((x) == EINTR)
|
||||||
|
#else
|
||||||
|
# define IS_EINTR(x) 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#ifdef SAFE_WRITE
|
||||||
|
# define safe_rw safe_write
|
||||||
|
# define rw write
|
||||||
|
#else
|
||||||
|
# define safe_rw safe_read
|
||||||
|
# define rw read
|
||||||
|
# undef const
|
||||||
|
# define const /* empty */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Read(write) up to COUNT bytes at BUF from(to) descriptor FD, retrying if
|
||||||
|
interrupted. Return the actual number of bytes read(written), zero for EOF,
|
||||||
|
or SAFE_READ_ERROR(SAFE_WRITE_ERROR) upon error. */
|
||||||
|
size_t
|
||||||
|
safe_rw (int fd, void const *buf, size_t count)
|
||||||
|
{
|
||||||
|
/* Work around a bug in Tru64 5.1. Attempting to read more than
|
||||||
|
INT_MAX bytes fails with errno == EINVAL. See
|
||||||
|
<http://lists.gnu.org/archive/html/bug-gnu-utils/2002-04/msg00010.html>.
|
||||||
|
When decreasing COUNT, keep it block-aligned. */
|
||||||
|
enum { BUGGY_READ_MAXIMUM = INT_MAX & ~8191 };
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
ssize_t result = rw (fd, buf, count);
|
||||||
|
|
||||||
|
if (0 <= result)
|
||||||
|
return result;
|
||||||
|
else if (IS_EINTR (errno))
|
||||||
|
continue;
|
||||||
|
else if (errno == EINVAL && BUGGY_READ_MAXIMUM < count)
|
||||||
|
count = BUGGY_READ_MAXIMUM;
|
||||||
|
else
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
34
lib/safe-read.h
Normal file
34
lib/safe-read.h
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
/* An interface to read() that retries after interrupts.
|
||||||
|
Copyright (C) 2002, 2006 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define SAFE_READ_ERROR ((size_t) -1)
|
||||||
|
|
||||||
|
/* Read up to COUNT bytes at BUF from descriptor FD, retrying if interrupted.
|
||||||
|
Return the actual number of bytes read, zero for EOF, or SAFE_READ_ERROR
|
||||||
|
upon error. */
|
||||||
|
extern size_t safe_read (int fd, void *buf, size_t count);
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
18
lib/safe-write.c
Normal file
18
lib/safe-write.c
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
/* An interface to write that retries after interrupts.
|
||||||
|
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#define SAFE_WRITE
|
||||||
|
#include "safe-read.c"
|
24
lib/safe-write.h
Normal file
24
lib/safe-write.h
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
/* An interface to write() that retries after interrupts.
|
||||||
|
Copyright (C) 2002 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
#define SAFE_WRITE_ERROR ((size_t) -1)
|
||||||
|
|
||||||
|
/* Write up to COUNT bytes at BUF to descriptor FD, retrying if interrupted.
|
||||||
|
Return the actual number of bytes written, zero for EOF, or SAFE_WRITE_ERROR
|
||||||
|
upon error. */
|
||||||
|
extern size_t safe_write (int fd, const void *buf, size_t count);
|
553
lib/unistd.in.h
Normal file
553
lib/unistd.in.h
Normal file
|
@ -0,0 +1,553 @@
|
||||||
|
/* Substitute for and wrapper around <unistd.h>.
|
||||||
|
Copyright (C) 2003-2008 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 2, or (at your option)
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
|
||||||
|
|
||||||
|
#ifndef _GL_UNISTD_H
|
||||||
|
|
||||||
|
#if __GNUC__ >= 3
|
||||||
|
@PRAGMA_SYSTEM_HEADER@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The include_next requires a split double-inclusion guard. */
|
||||||
|
#if @HAVE_UNISTD_H@
|
||||||
|
# @INCLUDE_NEXT@ @NEXT_UNISTD_H@
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _GL_UNISTD_H
|
||||||
|
#define _GL_UNISTD_H
|
||||||
|
|
||||||
|
/* mingw doesn't define the SEEK_* macros in <unistd.h>. */
|
||||||
|
#if !(defined SEEK_CUR && defined SEEK_END && defined SEEK_SET)
|
||||||
|
# include <stdio.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* mingw fails to declare _exit in <unistd.h>. */
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#if @GNULIB_WRITE@ && @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@
|
||||||
|
/* Get ssize_t. */
|
||||||
|
# include <sys/types.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if @GNULIB_GETHOSTNAME@
|
||||||
|
/* Get all possible declarations of gethostname(). */
|
||||||
|
# if @UNISTD_H_HAVE_WINSOCK2_H@
|
||||||
|
# include <winsock2.h>
|
||||||
|
# if !defined _GL_SYS_SOCKET_H
|
||||||
|
# undef socket
|
||||||
|
# define socket socket_used_without_including_sys_socket_h
|
||||||
|
# undef connect
|
||||||
|
# define connect connect_used_without_including_sys_socket_h
|
||||||
|
# undef accept
|
||||||
|
# define accept accept_used_without_including_sys_socket_h
|
||||||
|
# undef bind
|
||||||
|
# define bind bind_used_without_including_sys_socket_h
|
||||||
|
# undef getpeername
|
||||||
|
# define getpeername getpeername_used_without_including_sys_socket_h
|
||||||
|
# undef getsockname
|
||||||
|
# define getsockname getsockname_used_without_including_sys_socket_h
|
||||||
|
# undef getsockopt
|
||||||
|
# define getsockopt getsockopt_used_without_including_sys_socket_h
|
||||||
|
# undef listen
|
||||||
|
# define listen listen_used_without_including_sys_socket_h
|
||||||
|
# undef recv
|
||||||
|
# define recv recv_used_without_including_sys_socket_h
|
||||||
|
# undef send
|
||||||
|
# define send send_used_without_including_sys_socket_h
|
||||||
|
# undef recvfrom
|
||||||
|
# define recvfrom recvfrom_used_without_including_sys_socket_h
|
||||||
|
# undef sendto
|
||||||
|
# define sendto sendto_used_without_including_sys_socket_h
|
||||||
|
# undef setsockopt
|
||||||
|
# define setsockopt setsockopt_used_without_including_sys_socket_h
|
||||||
|
# undef shutdown
|
||||||
|
# define shutdown shutdown_used_without_including_sys_socket_h
|
||||||
|
# endif
|
||||||
|
# if !defined _GL_SYS_SELECT_H
|
||||||
|
# undef select
|
||||||
|
# define select select_used_without_including_sys_select_h
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* The definition of GL_LINK_WARNING is copied here. */
|
||||||
|
|
||||||
|
|
||||||
|
/* Declare overridden functions. */
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_CHOWN@
|
||||||
|
# if @REPLACE_CHOWN@
|
||||||
|
# ifndef REPLACE_CHOWN
|
||||||
|
# define REPLACE_CHOWN 1
|
||||||
|
# endif
|
||||||
|
# if REPLACE_CHOWN
|
||||||
|
/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
|
||||||
|
to GID (if GID is not -1). Follow symbolic links.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/chown.html>. */
|
||||||
|
# define chown rpl_chown
|
||||||
|
extern int chown (const char *file, uid_t uid, gid_t gid);
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef chown
|
||||||
|
# define chown(f,u,g) \
|
||||||
|
(GL_LINK_WARNING ("chown fails to follow symlinks on some systems and " \
|
||||||
|
"doesn't treat a uid or gid of -1 on some systems - " \
|
||||||
|
"use gnulib module chown for portability"), \
|
||||||
|
chown (f, u, g))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_CLOSE@
|
||||||
|
# if @UNISTD_H_HAVE_WINSOCK2_H@
|
||||||
|
/* Need a gnulib internal function. */
|
||||||
|
# define HAVE__GL_CLOSE_FD_MAYBE_SOCKET 1
|
||||||
|
# endif
|
||||||
|
# if @REPLACE_CLOSE@
|
||||||
|
/* Automatically included by modules that need a replacement for close. */
|
||||||
|
# undef close
|
||||||
|
# define close rpl_close
|
||||||
|
extern int close (int);
|
||||||
|
# endif
|
||||||
|
#elif @UNISTD_H_HAVE_WINSOCK2_H@
|
||||||
|
# undef close
|
||||||
|
# define close close_used_without_requesting_gnulib_module_close
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef close
|
||||||
|
# define close(f) \
|
||||||
|
(GL_LINK_WARNING ("close does not portably work on sockets - " \
|
||||||
|
"use gnulib module close for portability"), \
|
||||||
|
close (f))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_DUP2@
|
||||||
|
# if !@HAVE_DUP2@
|
||||||
|
/* Copy the file descriptor OLDFD into file descriptor NEWFD. Do nothing if
|
||||||
|
NEWFD = OLDFD, otherwise close NEWFD first if it is open.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/dup2.html>. */
|
||||||
|
extern int dup2 (int oldfd, int newfd);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef dup2
|
||||||
|
# define dup2(o,n) \
|
||||||
|
(GL_LINK_WARNING ("dup2 is unportable - " \
|
||||||
|
"use gnulib module dup2 for portability"), \
|
||||||
|
dup2 (o, n))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_ENVIRON@
|
||||||
|
# if !@HAVE_DECL_ENVIRON@
|
||||||
|
/* Set of environment variables and values. An array of strings of the form
|
||||||
|
"VARIABLE=VALUE", terminated with a NULL. */
|
||||||
|
# if defined __APPLE__ && defined __MACH__
|
||||||
|
# include <crt_externs.h>
|
||||||
|
# define environ (*_NSGetEnviron ())
|
||||||
|
# else
|
||||||
|
extern char **environ;
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef environ
|
||||||
|
# define environ \
|
||||||
|
(GL_LINK_WARNING ("environ is unportable - " \
|
||||||
|
"use gnulib module environ for portability"), \
|
||||||
|
environ)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_EUIDACCESS@
|
||||||
|
# if !@HAVE_EUIDACCESS@
|
||||||
|
/* Like access(), except that is uses the effective user id and group id of
|
||||||
|
the current process. */
|
||||||
|
extern int euidaccess (const char *filename, int mode);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef euidaccess
|
||||||
|
# define euidaccess(f,m) \
|
||||||
|
(GL_LINK_WARNING ("euidaccess is unportable - " \
|
||||||
|
"use gnulib module euidaccess for portability"), \
|
||||||
|
euidaccess (f, m))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_FCHDIR@
|
||||||
|
# if @REPLACE_FCHDIR@
|
||||||
|
|
||||||
|
/* Change the process' current working directory to the directory on which
|
||||||
|
the given file descriptor is open.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/fchdir.html>. */
|
||||||
|
extern int fchdir (int /*fd*/);
|
||||||
|
|
||||||
|
# define dup rpl_dup
|
||||||
|
extern int dup (int);
|
||||||
|
# define dup2 rpl_dup2
|
||||||
|
extern int dup2 (int, int);
|
||||||
|
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef fchdir
|
||||||
|
# define fchdir(f) \
|
||||||
|
(GL_LINK_WARNING ("fchdir is unportable - " \
|
||||||
|
"use gnulib module fchdir for portability"), \
|
||||||
|
fchdir (f))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_FSYNC@
|
||||||
|
/* Synchronize changes to a file.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/fsync.html>. */
|
||||||
|
# if !@HAVE_FSYNC@
|
||||||
|
extern int fsync (int fd);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef fsync
|
||||||
|
# define fsync(fd) \
|
||||||
|
(GL_LINK_WARNING ("fsync is unportable - " \
|
||||||
|
"use gnulib module fsync for portability"), \
|
||||||
|
fsync (fd))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_FTRUNCATE@
|
||||||
|
# if !@HAVE_FTRUNCATE@
|
||||||
|
/* Change the size of the file to which FD is opened to become equal to LENGTH.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/ftruncate.html>. */
|
||||||
|
extern int ftruncate (int fd, off_t length);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef ftruncate
|
||||||
|
# define ftruncate(f,l) \
|
||||||
|
(GL_LINK_WARNING ("ftruncate is unportable - " \
|
||||||
|
"use gnulib module ftruncate for portability"), \
|
||||||
|
ftruncate (f, l))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETCWD@
|
||||||
|
/* Include the headers that might declare getcwd so that they will not
|
||||||
|
cause confusion if included after this file. */
|
||||||
|
# include <stdlib.h>
|
||||||
|
# if @REPLACE_GETCWD@
|
||||||
|
/* Get the name of the current working directory, and put it in SIZE bytes
|
||||||
|
of BUF.
|
||||||
|
Return BUF if successful, or NULL if the directory couldn't be determined
|
||||||
|
or SIZE was too small.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/getcwd.html>.
|
||||||
|
Additionally, the gnulib module 'getcwd' guarantees the following GNU
|
||||||
|
extension: If BUF is NULL, an array is allocated with 'malloc'; the array
|
||||||
|
is SIZE bytes long, unless SIZE == 0, in which case it is as big as
|
||||||
|
necessary. */
|
||||||
|
# define getcwd rpl_getcwd
|
||||||
|
extern char * getcwd (char *buf, size_t size);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getcwd
|
||||||
|
# define getcwd(b,s) \
|
||||||
|
(GL_LINK_WARNING ("getcwd is unportable - " \
|
||||||
|
"use gnulib module getcwd for portability"), \
|
||||||
|
getcwd (b, s))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETDOMAINNAME@
|
||||||
|
/* Return the NIS domain name of the machine.
|
||||||
|
WARNING! The NIS domain name is unrelated to the fully qualified host name
|
||||||
|
of the machine. It is also unrelated to email addresses.
|
||||||
|
WARNING! The NIS domain name is usually the empty string or "(none)" when
|
||||||
|
not using NIS.
|
||||||
|
|
||||||
|
Put up to LEN bytes of the NIS domain name into NAME.
|
||||||
|
Null terminate it if the name is shorter than LEN.
|
||||||
|
If the NIS domain name is longer than LEN, set errno = EINVAL and return -1.
|
||||||
|
Return 0 if successful, otherwise set errno and return -1. */
|
||||||
|
# if !@HAVE_GETDOMAINNAME@
|
||||||
|
extern int getdomainname(char *name, size_t len);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getdomainname
|
||||||
|
# define getdomainname(n,l) \
|
||||||
|
(GL_LINK_WARNING ("getdomainname is unportable - " \
|
||||||
|
"use gnulib module getdomainname for portability"), \
|
||||||
|
getdomainname (n, l))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETDTABLESIZE@
|
||||||
|
# if !@HAVE_GETDTABLESIZE@
|
||||||
|
/* Return the maximum number of file descriptors in the current process. */
|
||||||
|
extern int getdtablesize (void);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getdtablesize
|
||||||
|
# define getdtablesize() \
|
||||||
|
(GL_LINK_WARNING ("getdtablesize is unportable - " \
|
||||||
|
"use gnulib module getdtablesize for portability"), \
|
||||||
|
getdtablesize ())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETHOSTNAME@
|
||||||
|
/* Return the standard host name of the machine.
|
||||||
|
WARNING! The host name may or may not be fully qualified.
|
||||||
|
|
||||||
|
Put up to LEN bytes of the host name into NAME.
|
||||||
|
Null terminate it if the name is shorter than LEN.
|
||||||
|
If the host name is longer than LEN, set errno = EINVAL and return -1.
|
||||||
|
Return 0 if successful, otherwise set errno and return -1. */
|
||||||
|
# if @UNISTD_H_HAVE_WINSOCK2_H@
|
||||||
|
# undef gethostname
|
||||||
|
# define gethostname rpl_gethostname
|
||||||
|
# endif
|
||||||
|
# if @UNISTD_H_HAVE_WINSOCK2_H@ || !@HAVE_GETHOSTNAME@
|
||||||
|
extern int gethostname(char *name, size_t len);
|
||||||
|
# endif
|
||||||
|
#elif @UNISTD_H_HAVE_WINSOCK2_H@
|
||||||
|
# undef gethostname
|
||||||
|
# define gethostname gethostname_used_without_requesting_gnulib_module_gethostname
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef gethostname
|
||||||
|
# define gethostname(n,l) \
|
||||||
|
(GL_LINK_WARNING ("gethostname is unportable - " \
|
||||||
|
"use gnulib module gethostname for portability"), \
|
||||||
|
gethostname (n, l))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETLOGIN_R@
|
||||||
|
/* Copies the user's login name to NAME.
|
||||||
|
The array pointed to by NAME has room for SIZE bytes.
|
||||||
|
|
||||||
|
Returns 0 if successful. Upon error, an error number is returned, or -1 in
|
||||||
|
the case that the login name cannot be found but no specific error is
|
||||||
|
provided (this case is hopefully rare but is left open by the POSIX spec).
|
||||||
|
|
||||||
|
See <http://www.opengroup.org/susv3xsh/getlogin.html>.
|
||||||
|
*/
|
||||||
|
# if !@HAVE_DECL_GETLOGIN_R@
|
||||||
|
# include <stddef.h>
|
||||||
|
extern int getlogin_r (char *name, size_t size);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getlogin_r
|
||||||
|
# define getlogin_r(n,s) \
|
||||||
|
(GL_LINK_WARNING ("getlogin_r is unportable - " \
|
||||||
|
"use gnulib module getlogin_r for portability"), \
|
||||||
|
getlogin_r (n, s))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETPAGESIZE@
|
||||||
|
# if @REPLACE_GETPAGESIZE@
|
||||||
|
# define getpagesize rpl_getpagesize
|
||||||
|
extern int getpagesize (void);
|
||||||
|
# elif !@HAVE_GETPAGESIZE@
|
||||||
|
/* This is for POSIX systems. */
|
||||||
|
# if !defined getpagesize && defined _SC_PAGESIZE
|
||||||
|
# if ! (defined __VMS && __VMS_VER < 70000000)
|
||||||
|
# define getpagesize() sysconf (_SC_PAGESIZE)
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
/* This is for older VMS. */
|
||||||
|
# if !defined getpagesize && defined __VMS
|
||||||
|
# ifdef __ALPHA
|
||||||
|
# define getpagesize() 8192
|
||||||
|
# else
|
||||||
|
# define getpagesize() 512
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
/* This is for BeOS. */
|
||||||
|
# if !defined getpagesize && @HAVE_OS_H@
|
||||||
|
# include <OS.h>
|
||||||
|
# if defined B_PAGE_SIZE
|
||||||
|
# define getpagesize() B_PAGE_SIZE
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
/* This is for AmigaOS4.0. */
|
||||||
|
# if !defined getpagesize && defined __amigaos4__
|
||||||
|
# define getpagesize() 2048
|
||||||
|
# endif
|
||||||
|
/* This is for older Unix systems. */
|
||||||
|
# if !defined getpagesize && @HAVE_SYS_PARAM_H@
|
||||||
|
# include <sys/param.h>
|
||||||
|
# ifdef EXEC_PAGESIZE
|
||||||
|
# define getpagesize() EXEC_PAGESIZE
|
||||||
|
# else
|
||||||
|
# ifdef NBPG
|
||||||
|
# ifndef CLSIZE
|
||||||
|
# define CLSIZE 1
|
||||||
|
# endif
|
||||||
|
# define getpagesize() (NBPG * CLSIZE)
|
||||||
|
# else
|
||||||
|
# ifdef NBPC
|
||||||
|
# define getpagesize() NBPC
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getpagesize
|
||||||
|
# define getpagesize() \
|
||||||
|
(GL_LINK_WARNING ("getpagesize is unportable - " \
|
||||||
|
"use gnulib module getpagesize for portability"), \
|
||||||
|
getpagesize ())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_GETUSERSHELL@
|
||||||
|
# if !@HAVE_GETUSERSHELL@
|
||||||
|
/* Return the next valid login shell on the system, or NULL when the end of
|
||||||
|
the list has been reached. */
|
||||||
|
extern char *getusershell (void);
|
||||||
|
/* Rewind to pointer that is advanced at each getusershell() call. */
|
||||||
|
extern void setusershell (void);
|
||||||
|
/* Free the pointer that is advanced at each getusershell() call and
|
||||||
|
associated resources. */
|
||||||
|
extern void endusershell (void);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef getusershell
|
||||||
|
# define getusershell() \
|
||||||
|
(GL_LINK_WARNING ("getusershell is unportable - " \
|
||||||
|
"use gnulib module getusershell for portability"), \
|
||||||
|
getusershell ())
|
||||||
|
# undef setusershell
|
||||||
|
# define setusershell() \
|
||||||
|
(GL_LINK_WARNING ("setusershell is unportable - " \
|
||||||
|
"use gnulib module getusershell for portability"), \
|
||||||
|
setusershell ())
|
||||||
|
# undef endusershell
|
||||||
|
# define endusershell() \
|
||||||
|
(GL_LINK_WARNING ("endusershell is unportable - " \
|
||||||
|
"use gnulib module getusershell for portability"), \
|
||||||
|
endusershell ())
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_LCHOWN@
|
||||||
|
# if @REPLACE_LCHOWN@
|
||||||
|
/* Change the owner of FILE to UID (if UID is not -1) and the group of FILE
|
||||||
|
to GID (if GID is not -1). Do not follow symbolic links.
|
||||||
|
Return 0 if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/lchown.html>. */
|
||||||
|
# define lchown rpl_lchown
|
||||||
|
extern int lchown (char const *file, uid_t owner, gid_t group);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef lchown
|
||||||
|
# define lchown(f,u,g) \
|
||||||
|
(GL_LINK_WARNING ("lchown is unportable to pre-POSIX.1-2001 " \
|
||||||
|
"systems - use gnulib module lchown for portability"), \
|
||||||
|
lchown (f, u, g))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_LSEEK@
|
||||||
|
# if @REPLACE_LSEEK@
|
||||||
|
/* Set the offset of FD relative to SEEK_SET, SEEK_CUR, or SEEK_END.
|
||||||
|
Return the new offset if successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/lseek.html>. */
|
||||||
|
# define lseek rpl_lseek
|
||||||
|
extern off_t lseek (int fd, off_t offset, int whence);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef lseek
|
||||||
|
# define lseek(f,o,w) \
|
||||||
|
(GL_LINK_WARNING ("lseek does not fail with ESPIPE on pipes on some " \
|
||||||
|
"systems - use gnulib module lseek for portability"), \
|
||||||
|
lseek (f, o, w))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_READLINK@
|
||||||
|
/* Read the contents of the symbolic link FILE and place the first BUFSIZE
|
||||||
|
bytes of it into BUF. Return the number of bytes placed into BUF if
|
||||||
|
successful, otherwise -1 and errno set.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/readlink.html>. */
|
||||||
|
# if !@HAVE_READLINK@
|
||||||
|
# include <stddef.h>
|
||||||
|
extern int readlink (const char *file, char *buf, size_t bufsize);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef readlink
|
||||||
|
# define readlink(f,b,s) \
|
||||||
|
(GL_LINK_WARNING ("readlink is unportable - " \
|
||||||
|
"use gnulib module readlink for portability"), \
|
||||||
|
readlink (f, b, s))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_SLEEP@
|
||||||
|
/* Pause the execution of the current thread for N seconds.
|
||||||
|
Returns the number of seconds left to sleep.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/sleep.html>. */
|
||||||
|
# if !@HAVE_SLEEP@
|
||||||
|
extern unsigned int sleep (unsigned int n);
|
||||||
|
# endif
|
||||||
|
#elif defined GNULIB_POSIXCHECK
|
||||||
|
# undef sleep
|
||||||
|
# define sleep(n) \
|
||||||
|
(GL_LINK_WARNING ("sleep is unportable - " \
|
||||||
|
"use gnulib module sleep for portability"), \
|
||||||
|
sleep (n))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#if @GNULIB_WRITE@ && @REPLACE_WRITE@ && @GNULIB_UNISTD_H_SIGPIPE@
|
||||||
|
/* Write up to COUNT bytes starting at BUF to file descriptor FD.
|
||||||
|
See the POSIX:2001 specification
|
||||||
|
<http://www.opengroup.org/susv3xsh/write.html>. */
|
||||||
|
# undef write
|
||||||
|
# define write rpl_write
|
||||||
|
extern ssize_t write (int fd, const void *buf, size_t count);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef FCHDIR_REPLACEMENT
|
||||||
|
/* gnulib internal function. */
|
||||||
|
extern void _gl_unregister_fd (int fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* _GL_UNISTD_H */
|
||||||
|
#endif /* _GL_UNISTD_H */
|
62
lib/write.c
Normal file
62
lib/write.c
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/* POSIX compatible write() function.
|
||||||
|
Copyright (C) 2008 Free Software Foundation, Inc.
|
||||||
|
Written by Bruno Haible <bruno@clisp.org>, 2008.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program 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 Lesser General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License
|
||||||
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||||
|
|
||||||
|
#include <config.h>
|
||||||
|
|
||||||
|
/* Specification. */
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
/* Replace this function only if module 'sigpipe' is requested. */
|
||||||
|
#if GNULIB_SIGPIPE
|
||||||
|
|
||||||
|
/* On native Windows platforms, SIGPIPE does not exist. When write() is
|
||||||
|
called on a pipe with no readers, WriteFile() fails with error
|
||||||
|
GetLastError() = ERROR_NO_DATA, and write() in consequence fails with
|
||||||
|
error EINVAL. */
|
||||||
|
|
||||||
|
# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
|
||||||
|
|
||||||
|
# include <errno.h>
|
||||||
|
# include <signal.h>
|
||||||
|
# include <io.h>
|
||||||
|
|
||||||
|
# define WIN32_LEAN_AND_MEAN /* avoid including junk */
|
||||||
|
# include <windows.h>
|
||||||
|
|
||||||
|
ssize_t
|
||||||
|
rpl_write (int fd, const void *buf, size_t count)
|
||||||
|
#undef write
|
||||||
|
{
|
||||||
|
ssize_t ret = write (fd, buf, count);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
if (GetLastError () == ERROR_NO_DATA
|
||||||
|
&& GetFileType (_get_osfhandle (fd)) == FILE_TYPE_PIPE)
|
||||||
|
{
|
||||||
|
/* Try to raise signal SIGPIPE. */
|
||||||
|
raise (SIGPIPE);
|
||||||
|
/* If it is currently blocked or ignored, change errno from EINVAL
|
||||||
|
to EPIPE. */
|
||||||
|
errno = EPIPE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
|
#endif
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
|
|
||||||
# Specification in the form of a command-line invocation:
|
# Specification in the form of a command-line invocation:
|
||||||
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl --libtool --macro-prefix=gl alloca autobuild count-one-bits extensions strcase strftime
|
# gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --lgpl --libtool --macro-prefix=gl alloca autobuild count-one-bits extensions full-read full-write strcase strftime
|
||||||
|
|
||||||
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
# Specification in the form of a few gnulib-tool.m4 macro invocations:
|
||||||
gl_LOCAL_DIR([])
|
gl_LOCAL_DIR([])
|
||||||
|
@ -24,6 +24,8 @@ gl_MODULES([
|
||||||
autobuild
|
autobuild
|
||||||
count-one-bits
|
count-one-bits
|
||||||
extensions
|
extensions
|
||||||
|
full-read
|
||||||
|
full-write
|
||||||
strcase
|
strcase
|
||||||
strftime
|
strftime
|
||||||
])
|
])
|
||||||
|
|
|
@ -49,13 +49,19 @@ AC_SUBST([LTALLOCA])
|
||||||
gl_FUNC_ALLOCA
|
gl_FUNC_ALLOCA
|
||||||
gl_COUNT_ONE_BITS
|
gl_COUNT_ONE_BITS
|
||||||
gl_INLINE
|
gl_INLINE
|
||||||
|
gl_SAFE_READ
|
||||||
|
gl_SAFE_WRITE
|
||||||
|
gt_TYPE_SSIZE_T
|
||||||
AM_STDBOOL_H
|
AM_STDBOOL_H
|
||||||
gl_STRCASE
|
gl_STRCASE
|
||||||
gl_FUNC_GNU_STRFTIME
|
gl_FUNC_GNU_STRFTIME
|
||||||
gl_HEADER_STRINGS_H
|
gl_HEADER_STRINGS_H
|
||||||
gl_HEADER_TIME_H
|
gl_HEADER_TIME_H
|
||||||
gl_TIME_R
|
gl_TIME_R
|
||||||
|
gl_UNISTD_H
|
||||||
gl_WCHAR_H
|
gl_WCHAR_H
|
||||||
|
gl_FUNC_WRITE
|
||||||
|
gl_UNISTD_MODULE_INDICATOR([write])
|
||||||
m4_ifval(gl_LIBSOURCES_LIST, [
|
m4_ifval(gl_LIBSOURCES_LIST, [
|
||||||
m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
|
m4_syscmd([test ! -d ]m4_defn([gl_LIBSOURCES_DIR])[ ||
|
||||||
for gl_file in ]gl_LIBSOURCES_LIST[ ; do
|
for gl_file in ]gl_LIBSOURCES_LIST[ ; do
|
||||||
|
@ -188,7 +194,14 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/alloca.c
|
lib/alloca.c
|
||||||
lib/alloca.in.h
|
lib/alloca.in.h
|
||||||
lib/count-one-bits.h
|
lib/count-one-bits.h
|
||||||
lib/dummy.c
|
lib/full-read.c
|
||||||
|
lib/full-read.h
|
||||||
|
lib/full-write.c
|
||||||
|
lib/full-write.h
|
||||||
|
lib/safe-read.c
|
||||||
|
lib/safe-read.h
|
||||||
|
lib/safe-write.c
|
||||||
|
lib/safe-write.h
|
||||||
lib/stdbool.in.h
|
lib/stdbool.in.h
|
||||||
lib/strcasecmp.c
|
lib/strcasecmp.c
|
||||||
lib/strftime.c
|
lib/strftime.c
|
||||||
|
@ -197,8 +210,10 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
lib/strncasecmp.c
|
lib/strncasecmp.c
|
||||||
lib/time.in.h
|
lib/time.in.h
|
||||||
lib/time_r.c
|
lib/time_r.c
|
||||||
|
lib/unistd.in.h
|
||||||
lib/verify.h
|
lib/verify.h
|
||||||
lib/wchar.in.h
|
lib/wchar.in.h
|
||||||
|
lib/write.c
|
||||||
m4/alloca.m4
|
m4/alloca.m4
|
||||||
m4/autobuild.m4
|
m4/autobuild.m4
|
||||||
m4/count-one-bits.m4
|
m4/count-one-bits.m4
|
||||||
|
@ -207,6 +222,9 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/include_next.m4
|
m4/include_next.m4
|
||||||
m4/inline.m4
|
m4/inline.m4
|
||||||
m4/mbstate_t.m4
|
m4/mbstate_t.m4
|
||||||
|
m4/safe-read.m4
|
||||||
|
m4/safe-write.m4
|
||||||
|
m4/ssize_t.m4
|
||||||
m4/stdbool.m4
|
m4/stdbool.m4
|
||||||
m4/strcase.m4
|
m4/strcase.m4
|
||||||
m4/strftime.m4
|
m4/strftime.m4
|
||||||
|
@ -214,6 +232,8 @@ AC_DEFUN([gl_FILE_LIST], [
|
||||||
m4/time_h.m4
|
m4/time_h.m4
|
||||||
m4/time_r.m4
|
m4/time_r.m4
|
||||||
m4/tm_gmtoff.m4
|
m4/tm_gmtoff.m4
|
||||||
|
m4/unistd_h.m4
|
||||||
m4/wchar.m4
|
m4/wchar.m4
|
||||||
m4/wint_t.m4
|
m4/wint_t.m4
|
||||||
|
m4/write.m4
|
||||||
])
|
])
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue