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