11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#ifndef _UNISTD_H_ 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define _UNISTD_H_ 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <stddef.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/cdefs.h> 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/types.h> 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/select.h> 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/sysconf.h> 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <pathconf.h> 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__BEGIN_DECLS 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Standard file descriptor numbers. */ 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define STDIN_FILENO 0 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define STDOUT_FILENO 1 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define STDERR_FILENO 2 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Values for whence in fseek and lseek */ 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SEEK_SET 0 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SEEK_CUR 1 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define SEEK_END 2 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 5058d9e280d459225aa8dc4533e883182b08215f7dElliott Hughesextern char** environ; 5158d9e280d459225aa8dc4533e883182b08215f7dElliott Hughes 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern __noreturn void _exit(int); 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t fork(void); 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t vfork(void); 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t getpid(void); 57b27a840f4b520bfa095db99b0a2e5205634b0003Elliott Hughesextern pid_t gettid(void) __pure2; 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t getpgid(pid_t); 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setpgid(pid_t, pid_t); 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t getppid(void); 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t getpgrp(void); 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setpgrp(void); 631ad10a566e042676c95a0bdbf3cbc48e99ddafb2Irina Tirdeaextern pid_t getsid(pid_t); 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t setsid(void); 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execv(const char *, char * const *); 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execvp(const char *, char * const *); 680133944b09d1c0a35041f7a41eb6bfb660144f4fElliott Hughesextern int execvpe(const char *, char * const *, char * const *); 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execve(const char *, char * const *, char * const *); 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execl(const char *, const char *, ...); 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execlp(const char *, const char *, ...); 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int execle(const char *, const char *, ...); 73b083bb57f5cae6b1fa3fd756a2720a3de806da2bDavid 'Digit' Turner 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int nice(int); 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setuid(uid_t); 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern uid_t getuid(void); 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int seteuid(uid_t); 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern uid_t geteuid(void); 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setgid(gid_t); 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern gid_t getgid(void); 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setegid(gid_t); 831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern gid_t getegid(void); 841dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int getgroups(int, gid_t *); 851dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setgroups(size_t, const gid_t *); 861dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setreuid(uid_t, uid_t); 871dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setregid(gid_t, gid_t); 881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setresuid(uid_t, uid_t, uid_t); 891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int setresgid(gid_t, gid_t, gid_t); 901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); 911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); 921dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern char* getlogin(void); 93fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Crossextern char* getusershell(void); 94fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Crossextern void setusershell(void); 95fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Crossextern void endusershell(void); 96fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Cross 971dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 981dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 991dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* Macros for access() */ 1001dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define R_OK 4 /* Read */ 1011dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define W_OK 2 /* Write */ 1021dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define X_OK 1 /* Execute */ 1031dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#define F_OK 0 /* Existence */ 1041dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 105f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int access(const char*, int); 106f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int faccessat(int, const char*, int, int); 107f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int link(const char*, const char*); 108f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int linkat(int, const char*, int, const char*, int); 109f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int unlink(const char*); 110f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int unlinkat(int, const char*, int); 1111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int chdir(const char *); 1121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int fchdir(int); 1131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int rmdir(const char *); 1141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int pipe(int *); 115cac7b9d6ec1a09814bc028e2f768db732f018891Elliott Hughes#ifdef _GNU_SOURCE 116275cd48511daabe4591caa49c3ad0df34a6889ffDavid 'Digit' Turnerextern int pipe2(int *, int); 117275cd48511daabe4591caa49c3ad0df34a6889ffDavid 'Digit' Turner#endif 1181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int chroot(const char *); 119f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int symlink(const char*, const char*); 120f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int symlinkat(const char*, int, const char*); 121f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern ssize_t readlink(const char*, char*, size_t); 122f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern ssize_t readlinkat(int, const char*, char*, size_t); 1231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int chown(const char *, uid_t, gid_t); 1241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int fchown(int, uid_t, gid_t); 125f8fcfbc85a3ce3e195626b90736d3a484331494bElliott Hughesextern int fchownat(int, const char*, uid_t, gid_t, int); 1261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int lchown(const char *, uid_t, gid_t); 127da3019b55305ce51b1b483d8727641e791ce0941David 'Digit' Turnerextern int truncate(const char *, off_t); 128b4f7616fd618875768b8fffc122b58bdb84a9969Elliott Hughesextern int truncate64(const char *, off64_t); 1291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern char *getcwd(char *, size_t); 1301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sync(void); 1321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int close(int); 1341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern off_t lseek(int, off_t, int); 13563673645c4da1cf97938d5018d7d373837563174Dima Zavinextern off64_t lseek64(int, off64_t, int); 1361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern ssize_t read(int, void *, size_t); 1381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern ssize_t write(int, const void *, size_t); 1391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern ssize_t pread(int, void *, size_t, off_t); 14072e64e08697cc2b3d66397c8b6d34965dd2a7338Kenny Rootextern ssize_t pread64(int, void *, size_t, off64_t); 1412304a0bf86f224efdd67e38f34c97f35c5cf3c56Jeff Hamiltonextern ssize_t pwrite(int, const void *, size_t, off_t); 14272e64e08697cc2b3d66397c8b6d34965dd2a7338Kenny Rootextern ssize_t pwrite64(int, const void *, size_t, off64_t); 1431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int dup(int); 1451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int dup2(int, int); 146cac7b9d6ec1a09814bc028e2f768db732f018891Elliott Hughes#ifdef _GNU_SOURCE 147cac7b9d6ec1a09814bc028e2f768db732f018891Elliott Hughesextern int dup3(int, int, int); 148cac7b9d6ec1a09814bc028e2f768db732f018891Elliott Hughes#endif 1491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int fcntl(int, int, ...); 1501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int ioctl(int, int, ...); 1511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int flock(int, int); 1521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int fsync(int); 1531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int fdatasync(int); 1541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int ftruncate(int, off_t); 15595d751feacdb58d3fbc36f3f21a895a3ec2f065bDavid 'Digit' Turnerextern int ftruncate64(int, off64_t); 1561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int pause(void); 1581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern unsigned int alarm(unsigned int); 1591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern unsigned int sleep(unsigned int); 160ab61eb366ac48addf2bca6093a34455193f5c8dfElliott Hughesextern int usleep(useconds_t); 1611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int gethostname(char *, size_t); 1631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern void *__brk(void *); 1651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int brk(void *); 1661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern void *sbrk(ptrdiff_t); 1671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int getopt(int, char * const *, const char *); 1691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern char *optarg; 1701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int optind, opterr, optopt; 1711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int isatty(int); 1732ea0a58e01c1ed6db1da9dd0314ee053f5a32026Elliott Hughesextern char* ttyname(int) __warnattr("ttyname is not thread-safe; use ttyname_r instead"); 174fc10b24accd082fb33c8f92ff8b92481c22fe3dcColin Crossextern int ttyname_r(int, char*, size_t); 1751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int acct(const char* filepath); 1771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1789ae59c02ca68da5bb45152c85c4cab6fd6f7aba2Bernhard Rosenkraenzerint getpagesize(void); 1791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int sysconf(int name); 1811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int daemon(int, int); 1831dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 184a6ecba4d233d7b769a05ee81ae908c9105352624Elliott Hughes#if defined(__arm__) || (defined(__mips__) && !defined(__LP64__)) 185a6ecba4d233d7b769a05ee81ae908c9105352624Elliott Hughesextern int cacheflush(long, long, long); 186a6ecba4d233d7b769a05ee81ae908c9105352624Elliott Hughes /* __attribute__((deprecated("use __builtin___clear_cache instead"))); */ 187a6ecba4d233d7b769a05ee81ae908c9105352624Elliott Hughes#endif 1881dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 1891dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern pid_t tcgetpgrp(int fd); 1901dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectextern int tcsetpgrp(int fd, pid_t _pid); 1911dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 192cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes/* Used to retry syscalls that can return EINTR. */ 193cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes#define TEMP_FAILURE_RETRY(exp) ({ \ 194a7821b7121933b361554b28a2f9455783a330591Dan Albert __typeof__(exp) _rc; \ 195cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes do { \ 196cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes _rc = (exp); \ 197cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes } while (_rc == -1 && errno == EINTR); \ 198cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes _rc; }) 199cf399f77b83b03cd83da784aa27ef1df71cca78dElliott Hughes 200b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich#if defined(__BIONIC_FORTIFY) 201b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevichextern ssize_t __read_chk(int, void*, size_t, size_t); 202b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich__errordecl(__read_dest_size_error, "read called with size bigger than destination"); 203b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich__errordecl(__read_count_toobig_error, "read called with count > SSIZE_MAX"); 204b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevichextern ssize_t __read_real(int, void*, size_t) 205b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich __asm__(__USER_LABEL_PREFIX__ "read"); 206b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 207b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich__BIONIC_FORTIFY_INLINE 208b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevichssize_t read(int fd, void* buf, size_t count) { 209b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich size_t bos = __bos0(buf); 210b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 211b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich#if !defined(__clang__) 212b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich if (__builtin_constant_p(count) && (count > SSIZE_MAX)) { 213b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich __read_count_toobig_error(); 214b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich } 215b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 216b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich if (bos == __BIONIC_FORTIFY_UNKNOWN_SIZE) { 217b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich return __read_real(fd, buf, count); 218b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich } 219b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 220b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich if (__builtin_constant_p(count) && (count > bos)) { 221b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich __read_dest_size_error(); 222b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich } 223b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 224b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich if (__builtin_constant_p(count) && (count <= bos)) { 225b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich return __read_real(fd, buf, count); 226b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich } 227b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich#endif 228b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 229b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich return __read_chk(fd, buf, count, bos); 230b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich} 231b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich#endif /* defined(__BIONIC_FORTIFY) */ 232b036b5ca36c1e12b075909b3eca6eab73ee611cfNick Kralevich 2331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project__END_DECLS 2341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 2351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#endif /* _UNISTD_H_ */ 236