Merge "Start documenting libc."

This commit is contained in:
Elliott Hughes 2018-08-24 17:16:53 +00:00 committed by Gerrit Code Review
commit 4b9379c889
43 changed files with 1303 additions and 277 deletions

View file

@ -26,12 +26,21 @@
* SUCH DAMAGE.
*/
#ifndef _ALLOCA_H
#define _ALLOCA_H
#pragma once
/**
* @file alloca.h
* @brief Allocate space on the stack.
*/
#include <sys/cdefs.h>
/**
* [alloca(3)](http://man7.org/linux/man-pages/man3/alloca.3.html) allocates space on the stack.
*
* New code should not use alloca because it cannot report failure.
* Use regular heap allocation instead.
*
* @return a pointer to the space on success, but has undefined behavior on failure.
*/
#define alloca(size) __builtin_alloca(size)
#endif /* _ALLOCA_H */

View file

@ -178,6 +178,8 @@ typedef struct {
* Opens the given library. The `__filename` and `__flags` arguments are
* the same as for [dlopen(3)](http://man7.org/linux/man-pages/man3/dlopen.3.html),
* with the Android-specific flags supplied via the `flags` member of `__info`.
*
* Available since API level 21.
*/
void* android_dlopen_ext(const char* __filename, int __flags, const android_dlextinfo* __info)
__INTRODUCED_IN(21);

View file

@ -1,6 +1,3 @@
/* $OpenBSD: ar.h,v 1.3 2003/06/02 19:34:12 millert Exp $ */
/* $NetBSD: ar.h,v 1.4 1994/10/26 00:55:43 cgd Exp $ */
/*-
* Copyright (c) 1991, 1993
* The Regents of the University of California. All rights reserved.
@ -40,29 +37,36 @@
* @(#)ar.h 8.2 (Berkeley) 1/21/94
*/
#ifndef _AR_H_
#define _AR_H_
#pragma once
/**
* @file ar.h
* @brief Constants for reading/writing `.a` files.
*/
#include <sys/cdefs.h>
/* Pre-4BSD archives had these magic numbers in them. */
#define OARMAG1 0177555
#define OARMAG2 0177545
/** The magic at the beginning of a `.a` file. */
#define ARMAG "!<arch>\n"
/** The length of the magic at the beginning of a `.a` file. */
#define SARMAG 8
#define ARMAG "!<arch>\n" /* ar "magic number" */
#define SARMAG 8 /* strlen(ARMAG); */
#define AR_EFMT1 "#1/" /* extended format #1 */
/** The contents of every `ar_hdr::ar_fmag` field.*/
#define ARFMAG "`\n"
struct ar_hdr {
char ar_name[16]; /* name */
char ar_date[12]; /* modification time */
char ar_uid[6]; /* user id */
char ar_gid[6]; /* group id */
char ar_mode[8]; /* octal file permissions */
char ar_size[10]; /* size in bytes */
#define ARFMAG "`\n"
char ar_fmag[2]; /* consistency check */
/* Name. */
char ar_name[16];
/* Modification time. */
char ar_date[12];
/** User id. */
char ar_uid[6];
/** Group id. */
char ar_gid[6];
/** Octal file permissions. */
char ar_mode[8];
/** Size in bytes. */
char ar_size[10];
/** Consistency check. Always contains `ARFMAG`. */
char ar_fmag[2];
};
#endif /* !_AR_H_ */

View file

@ -32,7 +32,10 @@
* SUCH DAMAGE.
*/
/*
/**
* @file assert.h
* @brief Assertions.
*
* There's no include guard in this file because <assert.h> may usefully be
* included multiple times, with and without NDEBUG defined.
*/
@ -42,6 +45,7 @@
#undef assert
#undef __assert_no_op
/** Internal implementation detail. Do not use. */
#define __assert_no_op __BIONIC_CAST(static_cast, void, 0)
#ifdef NDEBUG
@ -50,6 +54,12 @@
# if defined(__cplusplus) || __STDC_VERSION__ >= 199901L
# define assert(e) ((e) ? __assert_no_op : __assert2(__FILE__, __LINE__, __PRETTY_FUNCTION__, #e))
# else
/**
* assert() aborts the program after logging an error message, if the
* expression evaluates to false.
*
* On Android, the error goes to both stderr and logcat.
*/
# define assert(e) ((e) ? __assert_no_op : __assert(__FILE__, __LINE__, #e))
# endif
#endif
@ -60,6 +70,17 @@
#endif
__BEGIN_DECLS
/**
* __assert() is called by assert() on failure. Most users want assert()
* instead, but this can be useful for reporting other failures.
*/
void __assert(const char* __file, int __line, const char* __msg) __noreturn;
/**
* __assert2() is called by assert() on failure. Most users want assert()
* instead, but this can be useful for reporting other failures.
*/
void __assert2(const char* __file, int __line, const char* __function, const char* __msg) __noreturn;
__END_DECLS

View file

@ -26,14 +26,30 @@
* SUCH DAMAGE.
*/
#ifndef _BYTESWAP_H_
#define _BYTESWAP_H_
#pragma once
/**
* @file byteswap.h
* @brief Byte-swapping macros.
*/
#include <sys/cdefs.h>
#include <sys/endian.h>
/**
* [bswap_16(3)](http://man7.org/linux/man-pages/man3/bswap_16.3.html) swaps the bytes in a
* 16-bit value.
*/
#define bswap_16(x) __swap16(x)
#define bswap_32(x) __swap32(x)
#define bswap_64(x) __swap64(x)
#endif /* _BYTESWAP_H_ */
/**
* [bswap_32(3)](http://man7.org/linux/man-pages/man3/bswap_32.3.html) swaps the bytes in a
* 32-bit value.
*/
#define bswap_32(x) __swap32(x)
/**
* [bswap_64(3)](http://man7.org/linux/man-pages/man3/bswap_64.3.html) swaps the bytes in a
* 64-bit value.
*/
#define bswap_64(x) __swap64(x)

View file

@ -26,32 +26,55 @@
* SUCH DAMAGE.
*/
#ifndef _CPIO_H_
#define _CPIO_H_
#pragma once
/**
* @file cpio.h
* @brief Constants for reading/writing cpio files.
*/
#include <sys/cdefs.h>
/** Readable by user mode field bit. */
#define C_IRUSR 0000400
/** Writable by user mode field bit. */
#define C_IWUSR 0000200
/** Executable by user mode field bit. */
#define C_IXUSR 0000100
/** Readable by group mode field bit. */
#define C_IRGRP 0000040
/** Writable by group mode field bit. */
#define C_IWGRP 0000020
/** Executable by group mode field bit. */
#define C_IXGRP 0000010
/** Readable by other mode field bit. */
#define C_IROTH 0000004
/** Writable by other mode field bit. */
#define C_IWOTH 0000002
/** Executable by other mode field bit. */
#define C_IXOTH 0000001
/** Set-UID mode field bit. */
#define C_ISUID 0004000
/** Set-GID mode field bit. */
#define C_ISGID 0002000
/** Directory restricted deletion mode field bit. */
#define C_ISVTX 0001000
/** Directory mode field type. */
#define C_ISDIR 0040000
/** FIFO mode field type. */
#define C_ISFIFO 0010000
/** Regular file mode field type. */
#define C_ISREG 0100000
/** Block special file mode field type. */
#define C_ISBLK 0060000
/** Character special file mode field type. */
#define C_ISCHR 0020000
/** Reserved. */
#define C_ISCTG 0110000
/** Symbolic link mode field type. */
#define C_ISLNK 0120000
/** Socket mode field type. */
#define C_ISSOCK 0140000
/** cpio file magic. */
#define MAGIC "070707"
#endif /* _CPIO_H_ */

View file

@ -1 +1,10 @@
#pragma once
/*
* @file endian.h
* @brief Historical alternative to `<sys/endian.h>`.
*
* New code should use `<sys/endian.h>` directly.
*/
#include <sys/endian.h>

View file

@ -1,6 +1,3 @@
/* $OpenBSD: err.h,v 1.10 2006/01/06 18:53:04 millert Exp $ */
/* $NetBSD: err.h,v 1.11 1994/10/26 00:55:52 cgd Exp $ */
/*-
* Copyright (c) 1993
* The Regents of the University of California. All rights reserved.
@ -32,8 +29,12 @@
* @(#)err.h 8.1 (Berkeley) 6/2/93
*/
#ifndef _ERR_H_
#define _ERR_H_
#pragma once
/**
* @file err.h
* @brief BSD error reporting functions. See `<error.h>` for the GNU equivalent.
*/
#include <stdarg.h>
#include <sys/cdefs.h>
@ -41,15 +42,76 @@
__BEGIN_DECLS
/**
* [err(3)](http://man7.org/linux/man-pages/man3/err.3.html) outputs the program name,
* the printf()-like formatted message, and the result of strerror() if `errno` is non-zero.
*
* Calls exit() with `__status`.
*
* New code should consider error() in `<error.h>`.
*/
__noreturn void err(int __status, const char* __fmt, ...) __printflike(2, 3);
/**
* [verr(3)](http://man7.org/linux/man-pages/man3/verr.3.html) outputs the program name,
* the vprintf()-like formatted message, and the result of strerror() if `errno` is non-zero.
*
* Calls exit() with `__status`.
*
* New code should consider error() in `<error.h>`.
*/
__noreturn void verr(int __status, const char* __fmt, va_list __args) __printflike(2, 0);
/**
* [errx(3)](http://man7.org/linux/man-pages/man3/errx.3.html) outputs the program name, and
* the printf()-like formatted message.
*
* Calls exit() with `__status`.
*
* New code should consider error() in `<error.h>`.
*/
__noreturn void errx(int __status, const char* __fmt, ...) __printflike(2, 3);
/**
* [verrx(3)](http://man7.org/linux/man-pages/man3/err.3.html) outputs the program name, and
* the vprintf()-like formatted message.
*
* Calls exit() with `__status`.
*
* New code should consider error() in `<error.h>`.
*/
__noreturn void verrx(int __status, const char* __fmt, va_list __args) __printflike(2, 0);
/**
* [warn(3)](http://man7.org/linux/man-pages/man3/warn.3.html) outputs the program name,
* the printf()-like formatted message, and the result of strerror() if `errno` is non-zero.
*
* New code should consider error() in `<error.h>`.
*/
void warn(const char* __fmt, ...) __printflike(1, 2);
/**
* [vwarn(3)](http://man7.org/linux/man-pages/man3/vwarn.3.html) outputs the program name,
* the vprintf()-like formatted message, and the result of strerror() if `errno` is non-zero.
*
* New code should consider error() in `<error.h>`.
*/
void vwarn(const char* __fmt, va_list __args) __printflike(1, 0);
/**
* [warnx(3)](http://man7.org/linux/man-pages/man3/warnx.3.html) outputs the program name, and
* the printf()-like formatted message.
*
* New code should consider error() in `<error.h>`.
*/
void warnx(const char* __fmt, ...) __printflike(1, 2);
/**
* [vwarnx(3)](http://man7.org/linux/man-pages/man3/warn.3.html) outputs the program name, and
* the vprintf()-like formatted message.
*
* New code should consider error() in `<error.h>`.
*/
void vwarnx(const char* __fmt, va_list __args) __printflike(1, 0);
__END_DECLS
#endif /* !_ERR_H_ */

View file

@ -26,24 +26,37 @@
* SUCH DAMAGE.
*/
#ifndef _ERRNO_H
#define _ERRNO_H
#pragma once
/**
* @file errno.h
* @brief Standard C error handling.
*/
#include <sys/cdefs.h>
#include <linux/errno.h>
__BEGIN_DECLS
/* On Linux, ENOTSUP and EOPNOTSUPP are the same despite POSIX saying they should be distinct. */
#ifndef ENOTSUP
/** On Linux, ENOTSUP and EOPNOTSUPP are the same despite POSIX saying they should be distinct. */
#define ENOTSUP EOPNOTSUPP
#endif
/**
* Returns the address of the calling thread's `errno` storage.
* Non-portable and should not be used directly. Use `errno` instead.
*
* @private
*/
int* __errno(void) __attribute_const__;
/**
* [errno(3)](http://man7.org/linux/man-pages/man3/errno.3.html) is the last error on the calling
* thread.
*/
#define errno (*__errno())
__END_DECLS
#include <android/legacy_errno_inlines.h>
#endif /* _ERRNO_H */

View file

@ -26,21 +26,60 @@
* SUCH DAMAGE.
*/
#ifndef _ERROR_H
#define _ERROR_H 1
#pragma once
/**
* @file error.h
* @brief GNU error reporting functions.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
/**
* [error_print_progname(3)](http://man7.org/linux/man-pages/man3/error_print_progname.3.html) is
* a function pointer that, if non-null, is called by error() instead of prefixing errors with the
* program name.
*
* Available since API level 23.
*/
extern void (*error_print_progname)(void) __INTRODUCED_IN(23);
/**
* [error_message_count(3)](http://man7.org/linux/man-pages/man3/error_message_count.3.html) is
* a global count of the number of calls to error() and error_at_line().
*
* Available since API level 23.
*/
extern unsigned int error_message_count __INTRODUCED_IN(23);
/**
* [error_one_per_line(3)](http://man7.org/linux/man-pages/man3/error_one_per_line.3.html) is
* a global flag that if non-zero disables printing multiple errors with the same filename and
* line number.
*
* Available since API level 23.
*/
extern int error_one_per_line __INTRODUCED_IN(23);
/**
* [error(3)](http://man7.org/linux/man-pages/man3/error.3.html) formats the given printf()-like
* error message, preceded by the program name. Calls exit if `__status` is non-zero, and appends
* the result of strerror() if `__errno` is non-zero.
*
* Available since API level 23.
*/
void error(int __status, int __errno, const char* __fmt, ...) __printflike(3, 4) __INTRODUCED_IN(23);
void error_at_line(int __status, int __errno, const char* __filename, unsigned int __line_number, const char* __fmt, ...)
__printflike(5, 6) __INTRODUCED_IN(23);
/**
* [error_at_line(3)](http://man7.org/linux/man-pages/man3/error_at_line.3.html) formats the given
* printf()-like error message, preceded by the program name and the given filename and line number.
* Calls exit if `__status` is non-zero, and appends the result of strerror() if `__errno` is
* non-zero.
*
* Available since API level 23.
*/
void error_at_line(int __status, int __errno, const char* __filename, unsigned int __line_number, const char* __fmt, ...) __printflike(5, 6) __INTRODUCED_IN(23);
__END_DECLS
#endif

View file

@ -26,10 +26,11 @@
* SUCH DAMAGE.
*/
#ifndef _FEATURES_H_
#define _FEATURES_H_
#pragma once
/**
* @file features.h
* @brief Synonym for `<sys/cdefs.h>` for source compatibility with glibc.
*/
/* Our <features.h> macro fun is all in <sys/cdefs.h>. */
#include <sys/cdefs.h>
#endif /* _FEATURES_H_ */

View file

@ -26,27 +26,45 @@
* SUCH DAMAGE.
*/
#ifndef _FNMATCH_H
#define _FNMATCH_H
#pragma once
/**
* @file fnmatch.h
* @brief Filename matching.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
#define FNM_NOMATCH 1 /* Match failed. */
#define FNM_NOSYS 2 /* Function not supported (unused). */
/** Returned by fnmatch() if matching failed. */
#define FNM_NOMATCH 1
#define FNM_NOESCAPE 0x01 /* Disable backslash escaping. */
#define FNM_PATHNAME 0x02 /* Slash must be matched by slash. */
#define FNM_PERIOD 0x04 /* Period must be matched by period. */
#define FNM_LEADING_DIR 0x08 /* Ignore /<tail> after Imatch. */
#define FNM_CASEFOLD 0x10 /* Case insensitive search. */
/** Returned by fnmatch() if the function is not supported. This is never returned on Android. */
#define FNM_NOSYS 2
/** fnmatch() flag to disable backslash escaping. */
#define FNM_NOESCAPE 0x01
/** fnmatch() flag to ensure that slashes must be matched by slashes. */
#define FNM_PATHNAME 0x02
/** fnmatch() flag to ensure that periods must be matched by periods. */
#define FNM_PERIOD 0x04
/** fnmatch() flag to ignore /... after a match. */
#define FNM_LEADING_DIR 0x08
/** fnmatch() flag for a case-insensitive search. */
#define FNM_CASEFOLD 0x10
/** Synonym for `FNM_CASEFOLD`: case-insensitive search. */
#define FNM_IGNORECASE FNM_CASEFOLD
/** Synonym for `FNM_PATHNAME`: slashes must be matched by slashes. */
#define FNM_FILE_NAME FNM_PATHNAME
int fnmatch(const char* __pattern, const char* __string, int __flags);
/**
* [fnmatch(3)](http://man7.org/linux/man-pages/man3/fnmatch.3.html) matches `__string` against
* the shell wildcard `__pattern`.
*
* Returns 0 on success, and returns `FNM_NOMATCH` on failure.
*/
int fnmatch(const char* _Nonnull __pattern, const char* _Nonnull __string, int __flags);
__END_DECLS
#endif

View file

@ -26,21 +26,58 @@
* SUCH DAMAGE.
*/
#ifndef _ICONV_H_
#define _ICONV_H_
#pragma once
/**
* @file iconv.h
* @brief Character encoding conversion.
*/
#include <sys/cdefs.h>
#include <sys/types.h>
__BEGIN_DECLS
/* If we just use void* in the typedef, the compiler exposes that in error messages. */
struct __iconv_t;
/**
* The `iconv_t` type that represents an instance of a converter.
*/
typedef struct __iconv_t* iconv_t;
/**
* [iconv_open(3)](http://man7.org/linux/man-pages/man3/iconv_open.3.html) allocates a new converter
* from `__src_encoding` to `__dst_encoding`.
*
* Returns a new `iconv_t` on success and returns `((iconv_t) -1)` and sets `errno` on failure.
*
* Available since API level 28.
*/
iconv_t iconv_open(const char* __src_encoding, const char* __dst_encoding) __INTRODUCED_IN(28);
/**
* [iconv(3)](http://man7.org/linux/man-pages/man3/iconv.3.html) converts characters from one
* encoding to another.
*
* Android supports the `utf8`, `ascii`, `usascii`, `utf16be`, `utf16le`, `utf32be`, `utf32le`,
* and `wchart` encodings. Android also supports the GNU `//IGNORE` and `//TRANSLIT` extensions.
*
* Returns the number of characters converted on success and returns `((size_t) -1)` and
* sets `errno` on failure.
*
* Available since API level 28.
*/
size_t iconv(iconv_t __converter, char** __src_buf, size_t* __src_bytes_left, char** __dst_buf, size_t* __dst_bytes_left) __INTRODUCED_IN(28);
/**
* [iconv_close(3)](http://man7.org/linux/man-pages/man3/iconv_close.3.html) deallocates a converter
* returned by iconv_open().
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*
* Available since API level 28.
*/
int iconv_close(iconv_t __converter) __INTRODUCED_IN(28);
__END_DECLS
#endif

View file

@ -26,8 +26,12 @@
* SUCH DAMAGE.
*/
#ifndef _IFADDRS_H_
#define _IFADDRS_H_
#pragma once
/**
* @file ifaddrs.h
* @brief Access to network interface addresses.
*/
#include <sys/cdefs.h>
#include <netinet/in.h>
@ -35,25 +39,55 @@
__BEGIN_DECLS
/**
* Returned by getifaddrs() and freed by freeifaddrs().
*/
struct ifaddrs {
/** Pointer to the next element in the linked list. */
struct ifaddrs* ifa_next;
/** Interface name. */
char* ifa_name;
/** Interface flags (like `SIOCGIFFLAGS`). */
unsigned int ifa_flags;
/** Interface address. */
struct sockaddr* ifa_addr;
/** Interface netmask. */
struct sockaddr* ifa_netmask;
union {
/** Interface broadcast address (if IFF_BROADCAST is set). */
struct sockaddr* ifu_broadaddr;
/** Interface destination address (if IFF_POINTOPOINT is set). */
struct sockaddr* ifu_dstaddr;
} ifa_ifu;
/** Unused. */
void* ifa_data;
};
/** Synonym for `ifa_ifu.ifu_broadaddr` in `struct ifaddrs`. */
#define ifa_broadaddr ifa_ifu.ifu_broadaddr
/** Synonym for `ifa_ifu.ifu_dstaddr` in `struct ifaddrs`. */
#define ifa_dstaddr ifa_ifu.ifu_dstaddr
void freeifaddrs(struct ifaddrs* __ptr) __INTRODUCED_IN(24);
/**
* [getifaddrs(3)](http://man7.org/linux/man-pages/man3/getifaddrs.3.html) creates a linked list
* of `struct ifaddrs`. The list must be freed by freeifaddrs().
*
* Returns 0 and stores the list in `*__list_ptr` on success,
* and returns -1 and sets `errno` on failure.
*
* Available since API level 24.
*/
int getifaddrs(struct ifaddrs** __list_ptr) __INTRODUCED_IN(24);
__END_DECLS
/**
* [freeifaddrs(3)](http://man7.org/linux/man-pages/man3/freeifaddrs.3.html) frees a linked list
* of `struct ifaddrs` returned by getifaddrs().
*
* Available since API level 24.
*/
void freeifaddrs(struct ifaddrs* __ptr) __INTRODUCED_IN(24);
#endif
__END_DECLS

View file

@ -1,2 +1,10 @@
/* This is a BSD synonym for <utmp.h> that's also provided by glibc. */
#pragma once
/**
* @file lastlog.h
* @brief Historical alternative to `<utmp.h>`.
*
* New code should use `<utmp.h>` directly.
*/
#include <utmp.h>

View file

@ -26,34 +26,52 @@
* SUCH DAMAGE.
*/
#ifndef _LIBGEN_H
#define _LIBGEN_H
#pragma once
/**
* @file libgen.h
* @brief POSIX basename() and dirname().
*
* This file contains the POSIX basename() and dirname(). See `<string.h>` for the GNU basename().
*/
#include <sys/cdefs.h>
#include <sys/types.h>
__BEGIN_DECLS
/*
* Including <string.h> will get you the GNU basename, unless <libgen.h> is
* included, either before or after including <string.h>.
/**
* [basename(3)](http://man7.org/linux/man-pages/man3/basename.3.html)
* returns the final component of the given path.
*
* Note that this has the wrong argument cv-qualifiers, but doesn't modify its
* input and uses thread-local storage for the result if necessary.
* See `<string.h>` for the GNU basename(). Including `<libgen.h>`,
* either before or after including <string.h>, will override the GNU variant.
*
* Note that Android's cv-qualifiers differ from POSIX; Android's implementation doesn't
* modify its input and uses thread-local storage for the result if necessary.
*/
char* __posix_basename(const char* __path) __RENAME(basename);
/**
* This macro ensures that callers get the POSIX basename() if they include this header,
* no matter what order `<libgen.h>` and `<string.h>` are included in.
*/
#define basename __posix_basename
/* This has the wrong argument cv-qualifiers, but doesn't modify its input and uses thread-local storage for the result if necessary. */
/**
* [dirname(3)](http://man7.org/linux/man-pages/man3/dirname.3.html)
* returns all but the final component of the given path.
*
* Note that Android's cv-qualifiers differ from POSIX; Android's implementation doesn't
* modify its input and uses thread-local storage for the result if necessary.
*/
char* dirname(const char* __path);
#if !defined(__LP64__)
/* These non-standard functions are not needed on Android; basename and dirname use thread-local storage. */
/** Deprecated. Use dirname() instead. */
int dirname_r(const char* __path, char* __buf, size_t __n);
/** Deprecated. Use basename() instead. */
int basename_r(const char* __path, char* __buf, size_t __n);
#endif
__END_DECLS
#endif

View file

@ -14,8 +14,16 @@
* limitations under the License.
*/
#ifndef LIBC_INCLUDE_MALLOC_H_
#define LIBC_INCLUDE_MALLOC_H_
#pragma once
/**
* @file malloc.h
* @brief Heap memory allocation.
*
* [Debugging Native Memory Use](https://source.android.com/devices/tech/debug/native-memory)
* is the canonical source for documentation on Android's heap debugging
* features.
*/
#include <sys/cdefs.h>
#include <stddef.h>
@ -30,35 +38,96 @@ __BEGIN_DECLS
#define __BIONIC_ALLOC_SIZE(...) __attribute__((__alloc_size__(__VA_ARGS__)))
#endif
/**
* [malloc(3)](http://man7.org/linux/man-pages/man3/malloc.3.html) allocates
* memory on the heap.
*
* Returns a pointer to the allocated memory on success and returns a null
* pointer and sets `errno` on failure.
*/
void* malloc(size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(1) __wur;
/**
* [calloc(3)](http://man7.org/linux/man-pages/man3/calloc.3.html) allocates
* and clears memory on the heap.
*
* Returns a pointer to the allocated memory on success and returns a null
* pointer and sets `errno` on failure.
*/
void* calloc(size_t __item_count, size_t __item_size) __mallocfunc __BIONIC_ALLOC_SIZE(1,2) __wur;
/**
* [realloc(3)](http://man7.org/linux/man-pages/man3/realloc.3.html) resizes
* allocated memory on the heap.
*
* Returns a pointer (which may be different from `__ptr`) to the resized
* memory on success and returns a null pointer and sets `errno` on failure.
*/
void* realloc(void* __ptr, size_t __byte_count) __BIONIC_ALLOC_SIZE(2) __wur;
/**
* [free(3)](http://man7.org/linux/man-pages/man3/free.3.html) deallocates
* memory on the heap.
*/
void free(void* __ptr);
/**
* [memalign(3)](http://man7.org/linux/man-pages/man3/memalign.3.html) allocates
* memory on the heap with the required alignment.
*
* Returns a pointer to the allocated memory on success and returns a null
* pointer and sets `errno` on failure.
*
* See also posix_memalign().
*/
void* memalign(size_t __alignment, size_t __byte_count) __mallocfunc __BIONIC_ALLOC_SIZE(2) __wur;
/**
* [malloc_usable_size(3)](http://man7.org/linux/man-pages/man3/malloc_usable_size.3.html)
* returns the actual size of the given heap block.
*
* Available since API level 17.
*/
size_t malloc_usable_size(const void* __ptr) __INTRODUCED_IN(17);
#ifndef STRUCT_MALLINFO_DECLARED
#define STRUCT_MALLINFO_DECLARED 1
struct mallinfo {
size_t arena; /* Total number of non-mmapped bytes currently allocated from OS. */
size_t ordblks; /* Number of free chunks. */
size_t smblks; /* (Unused.) */
size_t hblks; /* (Unused.) */
size_t hblkhd; /* Total number of bytes in mmapped regions. */
size_t usmblks; /* Maximum total allocated space; greater than total if trimming has occurred. */
size_t fsmblks; /* (Unused.) */
size_t uordblks; /* Total allocated space (normal or mmapped.) */
size_t fordblks; /* Total free space. */
size_t keepcost; /* Upper bound on number of bytes releasable by malloc_trim. */
/** Total number of non-mmapped bytes currently allocated from OS. */
size_t arena;
/** Number of free chunks. */
size_t ordblks;
/** (Unused.) */
size_t smblks;
/** (Unused.) */
size_t hblks;
/** Total number of bytes in mmapped regions. */
size_t hblkhd;
/** Maximum total allocated space; greater than total if trimming has occurred. */
size_t usmblks;
/** (Unused.) */
size_t fsmblks;
/** Total allocated space (normal or mmapped.) */
size_t uordblks;
/** Total free space. */
size_t fordblks;
/** Upper bound on number of bytes releasable by a trim operation. */
size_t keepcost;
};
#endif /* STRUCT_MALLINFO_DECLARED */
#endif
/**
* [mallinfo(3)](http://man7.org/linux/man-pages/man3/mallinfo.3.html) returns
* information about the current state of the heap.
*/
struct mallinfo mallinfo(void);
/*
* XML structure for malloc_info(3) is in the following format:
/**
* [malloc_info(3)](http://man7.org/linux/man-pages/man3/malloc_info.3.html)
* writes information about the current state of the heap to the given stream.
*
* The XML structure for malloc_info() is as follows:
* ```
* <malloc version="jemalloc-1">
* <heap nr="INT">
* <allocated-large>INT</allocated-large>
@ -74,21 +143,67 @@ struct mallinfo mallinfo(void);
* </heap>
* <!-- more heaps -->
* </malloc>
* ```
*
* Available since API level 23.
*/
int malloc_info(int __must_be_zero, FILE* __fp) __INTRODUCED_IN(23);
/* mallopt options */
/** mallopt() option to set the decay time. Valid values are 0 and 1. */
#define M_DECAY_TIME -100
/**
* [mallopt(3)](http://man7.org/linux/man-pages/man3/mallopt.3.html) modifies
* heap behavior. Values of `__option` are the `M_` constants from this header.
*
* Returns 1 on success, 0 on error.
*
* Available since API level 26.
*/
int mallopt(int __option, int __value) __INTRODUCED_IN(26);
/*
* Memory Allocation Hooks
/**
* [__malloc_hook(3)](http://man7.org/linux/man-pages/man3/__malloc_hook.3.html)
* is called to implement malloc(). By default this points to the system's
* implementation.
*
* Available since API level 28.
*
* See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
*/
extern void* (*volatile __malloc_hook)(size_t, const void*) __INTRODUCED_IN(28);
extern void* (*volatile __realloc_hook)(void*, size_t, const void*) __INTRODUCED_IN(28);
extern void (*volatile __free_hook)(void*, const void*) __INTRODUCED_IN(28);
extern void* (*volatile __memalign_hook)(size_t, size_t, const void*) __INTRODUCED_IN(28);
extern void* (*volatile __malloc_hook)(size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
/**
* [__realloc_hook(3)](http://man7.org/linux/man-pages/man3/__realloc_hook.3.html)
* is called to implement realloc(). By default this points to the system's
* implementation.
*
* Available since API level 28.
*
* See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
*/
extern void* (*volatile __realloc_hook)(void* __ptr, size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
/**
* [__free_hook(3)](http://man7.org/linux/man-pages/man3/__free_hook.3.html)
* is called to implement free(). By default this points to the system's
* implementation.
*
* Available since API level 28.
*
* See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
*/
extern void (*volatile __free_hook)(void* __ptr, const void* __caller) __INTRODUCED_IN(28);
/**
* [__memalign_hook(3)](http://man7.org/linux/man-pages/man3/__memalign_hook.3.html)
* is called to implement memalign(). By default this points to the system's
* implementation.
*
* Available since API level 28.
*
* See also: [extra documentation](https://android.googlesource.com/platform/bionic/+/master/libc/malloc_hooks/README.md)
*/
extern void* (*volatile __memalign_hook)(size_t __alignment, size_t __byte_count, const void* __caller) __INTRODUCED_IN(28);
__END_DECLS
#endif /* LIBC_INCLUDE_MALLOC_H_ */

View file

@ -1 +1,10 @@
#pragma once
/**
* @file memory.h
* @brief Historical alternative to `<string.h>`.
*
* New code should use `<string.h>` directly.
*/
#include <string.h>

View file

@ -26,23 +26,59 @@
* SUCH DAMAGE.
*/
#ifndef _NL_TYPES_H_
#define _NL_TYPES_H_
#pragma once
/**
* @file nl_types.h
* @brief Message catalogs.
*
* Android offers a dummy implementation of these functions to ease porting of historical software.
*/
#include <sys/cdefs.h>
__BEGIN_DECLS
/**
* catopen() flag to use the current locale.
*/
#define NL_CAT_LOCALE 1
/**
* catgets() default set number.
*/
#define NL_SETD 1
/** Message catalog type. */
typedef void* nl_catd;
/** The type of the constants in `<langinfo.h>`, used by nl_langinfo(). */
typedef int nl_item;
/**
* [catopen(3)](http://man7.org/linux/man-pages/man3/catopen.3.html) opens a message catalog.
*
* On Android, this always returns failure: `((nl_catd) -1)`.
*
* Available since API level 28.
*/
nl_catd catopen(const char* __name, int __flag) __INTRODUCED_IN(26);
/**
* [catgets(3)](http://man7.org/linux/man-pages/man3/catgets.3.html) translates the given message
* using the given message catalog.
*
* On Android, this always returns `__msg`.
*
* Available since API level 28.
*/
char* catgets(nl_catd __catalog, int __set_number, int __msg_number, const char* __msg) __INTRODUCED_IN(26);
/**
* [catclose(3)](http://man7.org/linux/man-pages/man3/catclose.3.html) closes a message catalog.
*
* On Android, this always returns -1 with `errno` set to `EBADF`.
*/
int catclose(nl_catd __catalog) __INTRODUCED_IN(26);
__END_DECLS
#endif

View file

@ -29,20 +29,37 @@
* @(#)paths.h 8.1 (Berkeley) 6/2/93
*/
#ifndef _PATHS_H_
#define _PATHS_H_
#pragma once
/**
* @file paths.h
* @brief Default paths.
*/
#include <sys/cdefs.h>
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/system/bin/sh"
/** Path to the default system shell. Historically the 'B' was to specify the Bourne shell. */
#define _PATH_BSHELL "/system/bin/sh"
#endif
#define _PATH_CONSOLE "/dev/console"
#define _PATH_DEFPATH "/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin"
#define _PATH_DEV "/dev/"
#define _PATH_DEVNULL "/dev/null"
#define _PATH_KLOG "/proc/kmsg"
#define _PATH_MOUNTED "/proc/mounts"
#define _PATH_TTY "/dev/tty"
#endif /* !_PATHS_H_ */
/** Path to the system console. */
#define _PATH_CONSOLE "/dev/console"
/** Default shell search path. */
#define _PATH_DEFPATH "/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbin"
/** Path to the directory containing device files. */
#define _PATH_DEV "/dev/"
/** Path to `/dev/null`. */
#define _PATH_DEVNULL "/dev/null"
/** Path to the kernel log. */
#define _PATH_KLOG "/proc/kmsg"
/** Path to `/proc/mounts` for setmntent(). */
#define _PATH_MOUNTED "/proc/mounts"
/** Path to the calling process' tty. */
#define _PATH_TTY "/dev/tty"

View file

@ -26,8 +26,12 @@
* SUCH DAMAGE.
*/
#ifndef _POLL_H_
#define _POLL_H_
#pragma once
/**
* @file poll.h
* @brief Wait for events on a set of file descriptors.
*/
#include <sys/cdefs.h>
#include <linux/poll.h>
@ -36,16 +40,38 @@
__BEGIN_DECLS
/** The type of a file descriptor count, used by poll() and ppoll(). */
typedef unsigned int nfds_t;
int poll(struct pollfd* __fds, nfds_t __count, int __timeout_ms);
int ppoll(struct pollfd* __fds, nfds_t __count, const struct timespec* __timeout, const sigset_t* __mask) __INTRODUCED_IN(21);
int ppoll64(struct pollfd* __fds, nfds_t __count, const struct timespec* __timeout, const sigset64_t* __mask) __INTRODUCED_IN(28);
/**
* [poll(3)](http://man7.org/linux/man-pages/man3/poll.3.html) waits on a set of file descriptors.
*
* Returns the number of ready file descriptors on success, 0 for timeout,
* and returns -1 and sets `errno` on failure.
*/
int poll(struct pollfd* _Nonnull __fds, nfds_t __count, int __timeout_ms);
/**
* [ppoll(3)](http://man7.org/linux/man-pages/man3/ppoll.3.html) waits on a set of file descriptors
* or a signal. Set `__timeout` to null for no timeout. Set `__mask` to null to not set the signal
* mask.
*
* Returns the number of ready file descriptors on success, 0 for timeout,
* and returns -1 and sets `errno` on failure.
*
* Available since API level 28.
*/
int ppoll(struct pollfd* _Nonnull __fds, nfds_t __count, const struct timespec* _Nullable __timeout, const sigset_t* _Nullable __mask) __INTRODUCED_IN(21);
/**
* Like ppoll() but allows setting a signal mask with RT signals even from a 32-bit process.
*/
int ppoll64(struct pollfd* _Nonnull __fds, nfds_t __count, const struct timespec* _Nullable __timeout, const sigset64_t* _Nullable __mask) __INTRODUCED_IN(28);
#if defined(__BIONIC_INCLUDE_FORTIFY_HEADERS)
#define _POLL_H_
#include <bits/fortify/poll.h>
#undef _POLL_H_
#endif
__END_DECLS
#endif

View file

@ -26,8 +26,12 @@
* SUCH DAMAGE.
*/
#ifndef _PTY_H
#define _PTY_H
#pragma once
/**
* @file pty.h
* @brief Pseudoterminal functions.
*/
#include <sys/cdefs.h>
@ -36,9 +40,25 @@
__BEGIN_DECLS
int openpty(int* __master_fd, int* __slave_fd, char* __slave_name, const struct termios* __termios_ptr, const struct winsize* __winsize_ptr) __INTRODUCED_IN(23);
int forkpty(int* __master_fd, char* __slave_name, const struct termios* __termios_ptr, const struct winsize* __winsize_ptr) __INTRODUCED_IN(23);
/**
* [openpty(3)](http://man7.org/linux/man-pages/man3/openpty.3.html) finds
* a free pseudoterminal and configures it with the given terminal and window
* size settings.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*
* Available since API level 23.
*/
int openpty(int* _Nonnull __master_fd, int* _Nonnull __slave_fd, char* _Nullable __slave_name, const struct termios* _Nullable __termios_ptr, const struct winsize* _Nullable __winsize_ptr) __INTRODUCED_IN(23);
/**
* [forkpty(3)](http://man7.org/linux/man-pages/man3/forkpty.3.html) creates
* a new process connected to a pseudoterminal from openpty().
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*
* Available since API level 23.
*/
int forkpty(int* _Nonnull __master_fd, char* _Nullable __slave_name, const struct termios* _Nullable __termios_ptr, const struct winsize* _Nullable __winsize_ptr) __INTRODUCED_IN(23);
__END_DECLS
#endif

View file

@ -26,32 +26,113 @@
* SUCH DAMAGE.
*/
#ifndef _STDIO_EXT_H
#define _STDIO_EXT_H
#pragma once
/**
* @file stdio_ext.h
* @brief Extra standard I/O functionality. See also `<stdio.h>`.
*/
#include <sys/cdefs.h>
#include <stdio.h>
__BEGIN_DECLS
/**
* [__fbufsize(3)](http://man7.org/linux/man-pages/man3/__fbufsize.3.html) returns the size of
* the stream's buffer.
*
* Available since API level 23.
*/
size_t __fbufsize(FILE* __fp) __INTRODUCED_IN(23);
/**
* [__freadable(3)](http://man7.org/linux/man-pages/man3/__freadable.3.html) returns non-zero if
* the stream allows reading, 0 otherwise.
*
* Available since API level 23.
*/
int __freadable(FILE* __fp) __INTRODUCED_IN(23);
/**
* [__freading(3)](http://man7.org/linux/man-pages/man3/__freading.3.html) returns non-zero if
* the stream's last operation was a read, 0 otherwise.
*
* Available since API level 28.
*/
int __freading(FILE* __fp) __INTRODUCED_IN(28);
/**
* [__fwritable(3)](http://man7.org/linux/man-pages/man3/__fwritable.3.html) returns non-zero if
* the stream allows writing, 0 otherwise.
*
* Available since API level 23.
*/
int __fwritable(FILE* __fp) __INTRODUCED_IN(23);
/**
* [__fwriting(3)](http://man7.org/linux/man-pages/man3/__fwriting.3.html) returns non-zero if
* the stream's last operation was a write, 0 otherwise.
*
* Available since API level 28.
*/
int __fwriting(FILE* __fp) __INTRODUCED_IN(28);
/**
* [__flbf(3)](http://man7.org/linux/man-pages/man3/__flbf.3.html) returns non-zero if
* the stream is line-buffered, 0 otherwise.
*
* Available since API level 23.
*/
int __flbf(FILE* __fp) __INTRODUCED_IN(23);
/**
* [__fpurge(3)](http://man7.org/linux/man-pages/man3/__fpurge.3.html) discards the contents of
* the stream's buffer.
*
* Available since API level 23.
*/
void __fpurge(FILE* __fp) __INTRODUCED_IN(23);
/**
* [__fpending(3)](http://man7.org/linux/man-pages/man3/__fpending.3.html) returns the number of
* bytes in the output buffer.
*
* Available since API level 23.
*/
size_t __fpending(FILE* __fp) __INTRODUCED_IN(23);
/**
* [_flushlbf(3)](http://man7.org/linux/man-pages/man3/_flushlbf.3.html) flushes all
* line-buffered streams.
*
* Available since API level 23.
*/
void _flushlbf(void) __INTRODUCED_IN(23);
/**
* `__fseterr` sets the
* stream's error flag (as tested by ferror() and cleared by fclearerr()).
*
* Available since API level 28.
*/
void __fseterr(FILE* __fp) __INTRODUCED_IN(28);
/** __fsetlocking() constant to query locking type. */
#define FSETLOCKING_QUERY 0
/** __fsetlocking() constant to set locking to be maintained by stdio. */
#define FSETLOCKING_INTERNAL 1
/** __fsetlocking() constant to set locking to be maintained by the caller. */
#define FSETLOCKING_BYCALLER 2
/**
* [__fsetlocking(3)](http://man7.org/linux/man-pages/man3/__fsetlocking.3.html) sets the
* stream's locking mode to one of the `FSETLOCKING_` types.
*
* Returns the current locking style, `FSETLOCKING_INTERNAL` or `FSETLOCKING_BYCALLER`.
*
* Available since API level 23.
*/
int __fsetlocking(FILE* __fp, int __type) __INTRODUCED_IN(23);
__END_DECLS
#endif /* _STDIO_EXT_H */

View file

@ -36,8 +36,12 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _STRINGS_H_
#define _STRINGS_H_
#pragma once
/**
* @file strings.h
* @brief Extra string functions.
*/
#include <sys/types.h>
#include <sys/cdefs.h>
@ -46,20 +50,28 @@
#include <bits/strcasecmp.h>
__BEGIN_DECLS
#if defined(__BIONIC_FORTIFY)
/** Deprecated. Use memmove() instead. */
#define bcopy(b1, b2, len) (void)(__builtin___memmove_chk((b2), (b1), (len), __bos0(b2)))
/** Deprecated. Use memset() instead. */
#define bzero(b, len) (void)(__builtin___memset_chk((b), '\0', (len), __bos0(b)))
#else
/** Deprecated. Use memmove() instead. */
#define bcopy(b1, b2, len) (void)(__builtin_memmove((b2), (b1), (len)))
/** Deprecated. Use memset() instead. */
#define bzero(b, len) (void)(__builtin_memset((b), '\0', (len)))
#endif
#if !defined(__i386__) || __ANDROID_API__ >= __ANDROID_API_J_MR2__
/**
* [ffs(3)](http://man7.org/linux/man-pages/man3/ffs.3.html) finds the first set bit in `__i`.
*
* Returns 0 if no bit is set, or the index of the lowest set bit (counting from 1) otherwise.
*/
int ffs(int __i) __INTRODUCED_IN_X86(18);
#endif
__END_DECLS
#include <android/legacy_strings_inlines.h>
#endif

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/errno.h
* @brief Historical synonym for `<errno.h>`.
*
* New code should use `<errno.h>` directly.
*/
#include <errno.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/fcntl.h
* @brief Historical synonym for `<fcntl.h>`.
*
* New code should use `<fcntl.h>` directly.
*/
#include <fcntl.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/limits.h
* @brief Historical synonym for `<limits.h>`.
*
* New code should use `<limits.h>` directly.
*/
#include <limits.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/poll.h
* @brief Historical synonym for `<poll.h>`.
*
* New code should use `<poll.h>` directly.
*/
#include <poll.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/signal.h
* @brief Historical synonym for `<signal.h>`.
*
* New code should use `<signal.h>` directly.
*/
#include <signal.h>

View file

@ -1,6 +1,14 @@
/*
#pragma once
/**
* @file sys/sysconf.h
* @brief Historical synonym for `<sysconf.h>`.
*
* This file used to contain the declarations of sysconf and its associated constants.
* No standard mentions a <sys/sysconf.h>, but there are enough users in vendor (and potential ones
* in the NDK) to warrant not breaking source compatibility.
* No standard mentions a `<sys/sysconf.h>`, but there are enough users in vendor (and
* potential NDK users) to warrant not breaking source compatibility.
*
* New code should use `<sysconf.h>` directly.
*/
#include <bits/sysconf.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/syslog.h
* @brief Historical synonym for `<syslog.h>`.
*
* New code should use `<syslog.h>` directly.
*/
#include <syslog.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file sys/unistd.h
* @brief Historical synonym for `<unistd.h>`.
*
* New code should use `<unistd.h>` directly.
*/
#include <unistd.h>

View file

@ -1 +1,10 @@
#pragma once
/**
* @file syscall.h
* @brief Historical alternative to `<sys/syscall.h>`.
*
* New code should use `<sys/syscall.h>` directly.
*/
#include <sys/syscall.h>

View file

@ -32,90 +32,134 @@
* @(#)sysexits.h 4.8 (Berkeley) 4/3/91
*/
#ifndef _SYSEXITS_H_
#define _SYSEXITS_H_
#pragma once
/**
* @file sysexits.h
* @brief Exit status codes for system programs.
*
* This include file attempts to categorize possible error
* exit statuses for system programs such as sendmail.
*/
#include <sys/cdefs.h>
/*
* SYSEXITS.H -- Exit status codes for system programs.
*
* This include file attempts to categorize possible error
* exit statuses for system programs, notably delivermail
* and the Berkeley network.
*
* Error numbers begin at EX__BASE to reduce the possibility of
* clashing with other exit statuses that random programs may
* already return. The meaning of the codes is approximately
* as follows:
*
* EX_USAGE -- The command was used incorrectly, e.g., with
* the wrong number of arguments, a bad flag, a bad
* syntax in a parameter, or whatever.
* EX_DATAERR -- The input data was incorrect in some way.
* This should only be used for user's data & not
* system files.
* EX_NOINPUT -- An input file (not a system file) did not
* exist or was not readable. This could also include
* errors like "No message" to a mailer (if it cared
* to catch it).
* EX_NOUSER -- The user specified did not exist. This might
* be used for mail addresses or remote logins.
* EX_NOHOST -- The host specified did not exist. This is used
* in mail addresses or network requests.
* EX_UNAVAILABLE -- A service is unavailable. This can occur
* if a support program or file does not exist. This
* can also be used as a catchall message when something
* you wanted to do doesn't work, but you don't know
* why.
* EX_SOFTWARE -- An internal software error has been detected.
* This should be limited to non-operating system related
* errors as possible.
* EX_OSERR -- An operating system error has been detected.
* This is intended to be used for such things as "cannot
* fork", "cannot create pipe", or the like. It includes
* things like getuid returning a user that does not
* exist in the passwd file.
* EX_OSFILE -- Some system file (e.g., /etc/passwd, /var/run/utmp,
* etc.) does not exist, cannot be opened, or has some
* sort of error (e.g., syntax error).
* EX_CANTCREAT -- A (user specified) output file cannot be
* created.
* EX_IOERR -- An error occurred while doing I/O on some file.
* EX_TEMPFAIL -- temporary failure, indicating something that
* is not really an error. In sendmail, this means
* that a mailer (e.g.) could not create a connection,
* and the request should be reattempted later.
* EX_PROTOCOL -- the remote system returned something that
* was "not possible" during a protocol exchange.
* EX_NOPERM -- You did not have sufficient permission to
* perform the operation. This is not intended for
* file system problems, which should use EX_NOINPUT or
* EX_CANTCREAT, but rather for higher level permissions.
* EX_CONFIG -- Something was found in an unconfigured or
* misconfigured state.
/** Successful termination. */
#define EX_OK 0
/**
* Base value for error messages.
* Error numbers begin at `EX__BASE` to reduce the possibility of
* clashing with other exit statuses that random programs may
* already return.
*/
#define EX__BASE 64
#define EX_OK 0 /* successful termination */
/**
* Command line usage error.
* The command was used incorrectly, such as the wrong number of
* arguments, a bad flag, or bad syntax for a parameter.
*/
#define EX_USAGE 64
#define EX__BASE 64 /* base value for error messages */
/**
* Data format error.
* The input data was incorrect in some way.
* This should only be used for user's data and not for system files.
*/
#define EX_DATAERR 65
#define EX_USAGE 64 /* command line usage error */
#define EX_DATAERR 65 /* data format error */
#define EX_NOINPUT 66 /* cannot open input */
#define EX_NOUSER 67 /* addressee unknown */
#define EX_NOHOST 68 /* host name unknown */
#define EX_UNAVAILABLE 69 /* service unavailable */
#define EX_SOFTWARE 70 /* internal software error */
#define EX_OSERR 71 /* system error (e.g., can't fork) */
#define EX_OSFILE 72 /* critical OS file missing */
#define EX_CANTCREAT 73 /* can't create (user) output file */
#define EX_IOERR 74 /* input/output error */
#define EX_TEMPFAIL 75 /* temp failure; user is invited to retry */
#define EX_PROTOCOL 76 /* remote error in protocol */
#define EX_NOPERM 77 /* permission denied */
#define EX_CONFIG 78 /* configuration error */
/**
* Cannot open input.
* An input file (not a system file) did not exist or was not readable.
* This could also include errors like "No message" to a mailer (if it cared
* to catch it).
*/
#define EX_NOINPUT 66
#define EX__MAX 78 /* maximum listed value */
/**
* The specified user did not exist.
* This might be used for mail addresses or remote logins.
*/
#define EX_NOUSER 67
#endif /* !_SYSEXITS_H_ */
/**
* The specified host did not exist.
* This is used in mail addresses or network requests.
*/
#define EX_NOHOST 68
/**
* A service is unavailable.
* This can occur if a support program or file does not exist.
* This can also be used as a catchall message when something
* you wanted to do doesn't work, but you don't know why.
*/
#define EX_UNAVAILABLE 69
/**
* An internal software error has been detected.
* This should be limited to non-operating system related errors.
*/
#define EX_SOFTWARE 70
/**
* An operating system error has been detected.
* This is intended to be used for such things as "cannot
* fork", "cannot create pipe", or the like. It includes
* things like getuid returning a user that does not
* exist in the passwd file.
*/
#define EX_OSERR 71
/**
* Critical OS file error.
* A system file (such as /etc/passwd) does not exist, cannot be opened,
* or has some other problem (such as a syntax error).
*/
#define EX_OSFILE 72
/**
* Can't create (user) output file.
* A (user specified) output file cannot be created.
*/
#define EX_CANTCREAT 73
/**
* Input/output error.
* An error occurred while doing I/O on some file.
*/
#define EX_IOERR 74
/**
* Temporary failure; user is invited to retry.
* A temporary failure, indicating something that
* is not really an error. In sendmail, this might mean
* that a mailer could not create a connection,
* and the request should be reattempted later.
*/
#define EX_TEMPFAIL 75
/**
* Remote error in protocol.
* The remote system returned something that
* was "not possible" during a protocol exchange.
*/
#define EX_PROTOCOL 76
/**
* Permission denied.
* You did not have sufficient permission to perform the operation.
* This is not intended for file system problems, which should use EX_NOINPUT or
* EX_CANTCREAT, but rather for higher level permissions.
*/
#define EX_NOPERM 77
/**
* Configuration error.
* Something was found in an unconfigured or misconfigured state.
*/
#define EX_CONFIG 78
/** Maximum listed value. */
#define EX__MAX 78

View file

@ -26,8 +26,7 @@
* SUCH DAMAGE.
*/
#ifndef _SYSLOG_H
#define _SYSLOG_H
#pragma once
#include <stdio.h>
#include <sys/cdefs.h>
@ -35,63 +34,128 @@
__BEGIN_DECLS
/* Priorities are translated to Android log priorities as shown. */
#define LOG_EMERG 0 /* ERROR */
#define LOG_ALERT 1 /* ERROR */
#define LOG_CRIT 2 /* ERROR */
#define LOG_ERR 3 /* ERROR */
#define LOG_WARNING 4 /* WARN */
#define LOG_NOTICE 5 /* INFO */
#define LOG_INFO 6 /* INFO */
#define LOG_DEBUG 7 /* DEBUG */
/** Corresponds to the Android ERROR log priority. */
#define LOG_EMERG 0
/** Corresponds to the Android ERROR log priority. */
#define LOG_ALERT 1
/** Corresponds to the Android ERROR log priority. */
#define LOG_CRIT 2
/** Corresponds to the Android ERROR log priority. */
#define LOG_ERR 3
/** Corresponds to the Android WARN log priority. */
#define LOG_WARNING 4
/** Corresponds to the Android INFO log priority. */
#define LOG_NOTICE 5
/** Corresponds to the Android INFO log priority. */
#define LOG_INFO 6
/** Corresponds to the Android DEBUG log priority. */
#define LOG_DEBUG 7
#define LOG_PRIMASK 7
#define LOG_PRI(x) ((x) & LOG_PRIMASK)
#define LOG_MAKEPRI(fac, pri) ((fac) | (pri))
/* Facilities are currently ignored on Android. */
/** Currently ignored on Android. */
#define LOG_KERN (0<<3)
/** Currently ignored on Android. */
#define LOG_USER (1<<3)
/** Currently ignored on Android. */
#define LOG_MAIL (2<<3)
/** Currently ignored on Android. */
#define LOG_DAEMON (3<<3)
/** Currently ignored on Android. */
#define LOG_AUTH (4<<3)
/** Currently ignored on Android. */
#define LOG_SYSLOG (5<<3)
/** Currently ignored on Android. */
#define LOG_LPR (6<<3)
/** Currently ignored on Android. */
#define LOG_NEWS (7<<3)
/** Currently ignored on Android. */
#define LOG_UUCP (8<<3)
/** Currently ignored on Android. */
#define LOG_CRON (9<<3)
/** Currently ignored on Android. */
#define LOG_AUTHPRIV (10<<3)
/** Currently ignored on Android. */
#define LOG_FTP (11<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL0 (16<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL1 (17<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL2 (18<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL3 (19<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL4 (20<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL5 (21<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL6 (22<<3)
/** Currently ignored on Android. */
#define LOG_LOCAL7 (23<<3)
#define LOG_NFACILITIES 24
#define LOG_FACMASK 0x3f8
#define LOG_FAC(x) (((x) >> 3) & (LOG_FACMASK >> 3))
/**
* Converts a log priority into a mask enabling that single priority,
* for use with setlogmask().
*/
#define LOG_MASK(pri) (1 << (pri))
/**
* Converts a log priority into a mask enabling that priority and all lower
* priorities, for use with setlogmask().
*/
#define LOG_UPTO(pri) ((1 << ((pri)+1)) - 1)
/* openlog(3) flags are currently ignored on Android. */
/** openlog() options are currently ignored on Android. */
#define LOG_PID 0x01
/** openlog() options are currently ignored on Android. */
#define LOG_CONS 0x02
/** openlog() options are currently ignored on Android. */
#define LOG_ODELAY 0x04
/** openlog() options are currently ignored on Android. */
#define LOG_NDELAY 0x08
/** openlog() options are currently ignored on Android. */
#define LOG_NOWAIT 0x10
/** openlog() options are currently ignored on Android. */
#define LOG_PERROR 0x20
/**
* [closelog(3)](http://man7.org/linux/man-pages/man3/closelog.3.html) does
* nothing on Android.
*/
void closelog(void);
/**
* [openlog(3)](http://man7.org/linux/man-pages/man3/openlog.3.html) sets
* the log tag to `__prefix`. On Android, the other two arguments are ignored.
*/
void openlog(const char* __prefix, int __option, int __facility);
/**
* [setlogmask(3)](http://man7.org/linux/man-pages/man3/setlogmask.3.html)
* sets which log priorities will actually be logged. See `LOG_MASK` and
* `LOG_UPTO`.
*/
int setlogmask(int __mask);
/**
* [syslog(3)](http://man7.org/linux/man-pages/man3/syslog.3.html) formats
* the printf()-like message and logs it with the given priority, unless
* suppressed by setlogmask(). On Android, the output goes to logcat.
*/
void syslog(int __priority, const char* __fmt, ...) __printflike(2, 3);
/**
* [vsyslog(3)](http://man7.org/linux/man-pages/man3/vsyslog.3.html) formats
* the vprintf()-like message and logs it with the given priority, unless
* suppressed by setlogmask(). On Android, the output goes to logcat.
*/
void vsyslog(int __priority, const char* __fmt, va_list __args) __printflike(2, 0);
__END_DECLS
#endif /* _SYSLOG_H */

View file

@ -26,37 +26,64 @@
* SUCH DAMAGE.
*/
#ifndef _TAR_H_
#define _TAR_H_
#pragma once
/**
* @file tar.h
* @brief Constants for reading/writing `.tar` files.
*/
#include <sys/cdefs.h>
/** `.tar` file magic. (Includes the NUL.) */
#define TMAGIC "ustar"
/** `.tar` file magic length in bytes. */
#define TMAGLEN 6
/** `.tar` file version. (Does not include the NUL.) */
#define TVERSION "00"
/** `.tar` file version length in bytes. */
#define TVERSLEN 2
/** Regular file type flag. */
#define REGTYPE '0'
/** Alternate regular file type flag. */
#define AREGTYPE '\0'
/** Link type flag. */
#define LNKTYPE '1'
/** Symbolic link type flag. */
#define SYMTYPE '2'
/** Character special file type flag. */
#define CHRTYPE '3'
/** Block special file type flag. */
#define BLKTYPE '4'
/** Directory type flag. */
#define DIRTYPE '5'
/** FIFO special file type flag. */
#define FIFOTYPE '6'
/** Reserved type flag. */
#define CONTTYPE '7'
/** Set-UID mode field bit. */
#define TSUID 04000
/** Set-GID mode field bit. */
#define TSGID 02000
/** Directory restricted deletion mode field bit. */
#define TSVTX 01000
/** Readable by user mode field bit. */
#define TUREAD 00400
/** Writable by user mode field bit. */
#define TUWRITE 00200
/** Executable by user mode field bit. */
#define TUEXEC 00100
/** Readable by group mode field bit. */
#define TGREAD 00040
/** Writable by group mode field bit. */
#define TGWRITE 00020
/** Executable by group mode field bit. */
#define TGEXEC 00010
/** Readable by other mode field bit. */
#define TOREAD 00004
/** Writable by other mode field bit. */
#define TOWRITE 00002
/** Executable by other mode field bit. */
#define TOEXEC 00001
#endif /* _TAR_H_ */

View file

@ -1 +1,10 @@
#pragma once
/**
* @file termio.h
* @brief Historical alternative to `<termios.h>`.
*
* New code should use `<termios.h>` directly.
*/
#include <termios.h>

View file

@ -25,8 +25,13 @@
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#ifndef _TERMIOS_H_
#define _TERMIOS_H_
#pragma once
/**
* @file termios.h
* @brief General terminal interfaces.
*/
#include <sys/cdefs.h>
#include <sys/ioctl.h>
@ -36,24 +41,112 @@
__BEGIN_DECLS
#if __ANDROID_API__ >= __ANDROID_API_L__
// Implemented as static inlines before 21.
// This file is implemented as static inlines before API level 21.
/**
* [cfgetispeed(3)](http://man7.org/linux/man-pages/man3/cfgetispeed.3.html)
* returns the terminal input baud rate.
*/
speed_t cfgetispeed(const struct termios* __t) __INTRODUCED_IN(21);
/**
* [cfgetospeed(3)](http://man7.org/linux/man-pages/man3/cfgetospeed.3.html)
* returns the terminal output baud rate.
*/
speed_t cfgetospeed(const struct termios* __t) __INTRODUCED_IN(21);
/**
* [cfmakeraw(3)](http://man7.org/linux/man-pages/man3/cfmakeraw.3.html)
* configures the terminal for "raw" mode.
*/
void cfmakeraw(struct termios* __t) __INTRODUCED_IN(21);
/**
* [cfsetspeed(3)](http://man7.org/linux/man-pages/man3/cfsetspeed.3.html)
* sets the terminal input and output baud rate.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int cfsetspeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [cfsetispeed(3)](http://man7.org/linux/man-pages/man3/cfsetispeed.3.html)
* sets the terminal input baud rate.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int cfsetispeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [cfsetospeed(3)](http://man7.org/linux/man-pages/man3/cfsetospeed.3.html)
* sets the terminal output baud rate.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int cfsetospeed(struct termios* __t, speed_t __speed) __INTRODUCED_IN(21);
/**
* [tcdrain(3)](http://man7.org/linux/man-pages/man3/tcdrain.3.html)
* waits until all output has been written.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcdrain(int __fd) __INTRODUCED_IN(21);
/**
* [tcflow(3)](http://man7.org/linux/man-pages/man3/tcflow.3.html)
* suspends (`TCOOFF`) or resumes (`TCOON`) output, or transmits a
* stop (`TCIOFF`) or start (`TCION`) to suspend or resume input.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcflow(int __fd, int __action) __INTRODUCED_IN(21);
/**
* [tcflush(3)](http://man7.org/linux/man-pages/man3/tcflush.3.html)
* discards pending input (`TCIFLUSH`), output (`TCOFLUSH`), or
* both (`TCIOFLUSH`). (In `<stdio.h>` terminology, this is a purge rather
* than a flush.)
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcflush(int __fd, int __queue) __INTRODUCED_IN(21);
/**
* [tcgetattr(3)](http://man7.org/linux/man-pages/man3/tcgetattr.3.html)
* reads the configuration of the given terminal.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcgetattr(int __fd, struct termios* __t) __INTRODUCED_IN(21);
/**
* [tcgetsid(3)](http://man7.org/linux/man-pages/man3/tcgetsid.3.html)
* returns the session id corresponding to the given fd.
*
* Returns a non-negative session id on success and
* returns -1 and sets `errno` on failure.
*/
pid_t tcgetsid(int __fd) __INTRODUCED_IN(21);
/**
* [tcsendbreak(3)](http://man7.org/linux/man-pages/man3/tcsendbreak.3.html)
* sends a break.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcsendbreak(int __fd, int __duration) __INTRODUCED_IN(21);
/**
* [tcsetattr(3)](http://man7.org/linux/man-pages/man3/tcsetattr.3.html)
* writes the configuration of the given terminal.
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int tcsetattr(int __fd, int __optional_actions, const struct termios* __t) __INTRODUCED_IN(21);
#endif
__END_DECLS
#include <android/legacy_termios_inlines.h>
#endif

View file

@ -26,8 +26,12 @@
* SUCH DAMAGE.
*/
#ifndef _UCHAR_H_
#define _UCHAR_H_
#pragma once
/**
* @file uchar.h
* @brief Unicode functions.
*/
#include <stddef.h>
#include <sys/cdefs.h>
@ -36,18 +40,54 @@
__BEGIN_DECLS
#if !defined(__cplusplus)
/** The UTF-16 character type. */
typedef __CHAR16_TYPE__ char16_t;
/** The UTF-32 character type. */
typedef __CHAR32_TYPE__ char32_t;
#endif
/** On Android, char16_t is UTF-16. */
#define __STD_UTF_16__ 1
/** On Android, char32_t is UTF-32. */
#define __STD_UTF_32__ 1
size_t c16rtomb(char* __buf, char16_t __ch16, mbstate_t* __ps) __INTRODUCED_IN(21);
size_t c32rtomb(char* __buf, char32_t __ch32, mbstate_t* __ps) __INTRODUCED_IN(21);
size_t mbrtoc16(char16_t* __ch16, const char* __s, size_t __n, mbstate_t* __ps) __INTRODUCED_IN(21);
size_t mbrtoc32(char32_t* __ch32, const char* __s, size_t __n, mbstate_t* __ps) __INTRODUCED_IN(21);
/**
* [c16rtomb(3)](http://man7.org/linux/man-pages/man3/c16rtomb.3.html) converts a single UTF-16
* character to UTF-8.
*
* Returns the number of bytes written to `__buf` on success, and returns -1 and sets `errno`
* on failure.
*
* Available since API level 21.
*/
size_t c16rtomb(char* _Nullable __buf, char16_t __ch16, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
/**
* [c32rtomb(3)](http://man7.org/linux/man-pages/man3/c32rtomb.3.html) converts a single UTF-32
* character to UTF-8.
*
* Returns the number of bytes written to `__buf` on success, and returns -1 and sets `errno`
* on failure.
*
* Available since API level 21.
*/
size_t c32rtomb(char* _Nullable __buf, char32_t __ch32, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
/**
* [mbrtoc16(3)](http://man7.org/linux/man-pages/man3/mbrtoc16.3.html) converts the next UTF-8
* sequence to a UTF-16 code point.
*
* Available since API level 21.
*/
size_t mbrtoc16(char16_t* _Nullable __ch16, const char* _Nullable __s, size_t __n, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
/**
* [mbrtoc32(3)](http://man7.org/linux/man-pages/man3/mbrtoc32.3.html) converts the next UTF-8
* sequence to a UTF-32 code point.
*
* Available since API level 21.
*/
size_t mbrtoc32(char32_t* _Nullable __ch32, const char* _Nullable __s, size_t __n, mbstate_t* _Nullable __ps) __INTRODUCED_IN(21);
__END_DECLS
#endif

View file

@ -1 +1,10 @@
#pragma once
/**
* @file ucontext.h
* @brief Historical alternative to `<sys/ucontext.h>`.
*
* New code should use `<sys/ucontext.h>` directly.
*/
#include <sys/ucontext.h>

View file

@ -26,8 +26,12 @@
* SUCH DAMAGE.
*/
#ifndef _UTIME_H_
#define _UTIME_H_
#pragma once
/**
* @file utime.h
* @brief Historical access/modification time functionality.
*/
#include <sys/cdefs.h>
#include <sys/types.h>
@ -35,8 +39,14 @@
__BEGIN_DECLS
int utime(const char* __filename, const struct utimbuf* __times);
/**
* [utime(2)](http://man7.org/linux/man-pages/man2/utime.2.html) changes the access and
* modification time of `__filename`. If `__times` is null, the current time is used.
*
* New code should prefer utimensat().
*
* Returns 0 on success and returns -1 and sets `errno` on failure.
*/
int utime(const char* _Nonnull __filename, const struct utimbuf* _Nullable __times);
__END_DECLS
#endif

View file

@ -1 +1,10 @@
#pragma once
/**
* @file wait.h
* @brief Historical alternative to `<sys/wait.h>`.
*
* New code should use `<sys/wait.h>` directly.
*/
#include <sys/wait.h>

View file

@ -26,13 +26,24 @@
* SUCH DAMAGE.
*/
#ifndef _XLOCALE_H_
#define _XLOCALE_H_
#pragma once
/**
* @file xlocale.h
* @brief `locale_t` definition.
*
* Most users will want `<locale.h>` instead. `<xlocale.h>` is used by the C
* library itself to export the `locale_t` type without exporting the
* `<locale.h>` functions in other headers that export locale-sensitive
* functions (such as `<string.h>`).
*/
#include <sys/cdefs.h>
/* If we just use void* here, GCC exposes that in error messages. */
/* If we just use void* in the typedef, the compiler exposes that in error messages. */
struct __locale_t;
typedef struct __locale_t* locale_t;
#endif /* _XLOCALE_H_ */
/**
* The `locale_t` type that represents a locale.
*/
typedef struct __locale_t* locale_t;