/*
本文为
UNIX环境高级编程(第3版) [美]W.Richard Stevens Stephen A.Rago著,戚正伟 张亚英 尤正元译
——北京:人民邮电出版社,2014.6
中自定义头文件<apue.h>.
附:书中实例的源码可以从www.apuebook.com获得。
*/
/*
*Our own header, to be included before all standard system headers.
*/
#ifndef _APUE_H
#define _APUE_H
#define_POSIX_C_SOURCE 200809L
#ifdefined(SOLARIS) /* Solaris 10 */
#define_XOPEN_SOURCE 600
#else
#define_XOPEN_SOURCE 700
#endif
#include<sys/types.h> /* some systems still require this */
#include<sys/stat.h>
#include<sys/termios.h> /* for winsize */
#ifdefined(MACOS) || !defined(TIOCGWINSZ)
#include<sys/ioctl.h>
#endif
#include<stdio.h> /* for convenience */
#include<stdlib.h> /* for convenience */
#include<stddef.h> /* for offsetof */
#include<string.h> /* for convenience */
#include<unistd.h> /* for convenience */
#include<signal.h> /* for SIG_ERR */
#define MAXLINE 4096 /*max line length */
/*
*Default file access permissions for new files.
*/
#define FILE_MODE (S_IRUSR| S_IWUSR | S_IRGRP | S_IROTH)
/*
*Default permissions for new directories.
*/
#define DIR_MODE (FILE_MODE| S_IXUSR | S_IXGRP | S_IXOTH)
typedef void Sigfunc(int); /*for signal handlers */
#define min(a,b) ((a)< (b) ? (a) : (b))
#define max(a,b) ((a)> (b) ? (a) : (b))
/*
*Prototypes for our own functions.
*/
char *path_alloc(size_t*); /* {Prog pathalloc} */
longopen_max(void); /* {Prog openmax} */
intset_cloexec(int); /* {Prog setfd} */
voidclr_fl(int, int);
voidset_fl(int, int); /* {Prog setfl} */
voidpr_exit(int); /* {Prog prexit} */
voidpr_mask(const char *); /* {Prog prmask} */
Sigfunc *signal_intr(int,Sigfunc *); /* {Prog signal_intr_function} */
voiddaemonize(const char *); /* {Prog daemoninit} */
voidsleep_us(unsigned int); /* {Ex sleepus} */
ssize_treadn(int, void *, size_t); /* {Prog readn_writen} */
ssize_twriten(int, const void *, size_t); /* {Prog readn_writen} */
intfd_pipe(int *); /* {Prog sock_fdpipe} */
intrecv_fd(int, ssize_t (*func)(int,
const void *, size_t)); /* {Prog recvfd_sockets} */
intsend_fd(int, int); /* {Prog sendfd_sockets} */
intsend_err(int, int,
const char *); /* {Prog senderr} */
intserv_listen(const char *); /* {Prog servlisten_sockets} */
intserv_accept(int, uid_t *); /* {Prog servaccept_sockets} */
intcli_conn(const char *); /* {Prog cliconn_sockets} */
intbuf_args(char *, int (*func)(int,
char **)); /* {Prog bufargs} */
inttty_cbreak(int); /* {Prog raw} */
inttty_raw(int); /* {Prog raw} */
inttty_reset(int); /* {Prog raw} */
voidtty_atexit(void); /* {Prog raw} */
structtermios *tty_termios(void); /* {Prog raw} */
intptym_open(char *, int); /* {Prog ptyopen} */
intptys_open(char *); /* {Prog ptyopen} */
#ifdef TIOCGWINSZ
pid_tpty_fork(int *, char *, int, const struct termios *,
const struct winsize *); /* {Prog ptyfork} */
#endif
int lock_reg(int,int, int, off_t, int, off_t); /* {Prog lockreg} */
#define read_lock(fd,offset, whence, len) \
lock_reg((fd),F_SETLK, F_RDLCK, (offset), (whence), (len))
#define readw_lock(fd,offset, whence, len) \
lock_reg((fd),F_SETLKW, F_RDLCK, (offset), (whence), (len))
#define write_lock(fd,offset, whence, len) \
lock_reg((fd),F_SETLK, F_WRLCK, (offset), (whence), (len))
#define writew_lock(fd,offset, whence, len) \
lock_reg((fd),F_SETLKW, F_WRLCK, (offset), (whence), (len))
#define un_lock(fd,offset, whence, len) \
lock_reg((fd),F_SETLK, F_UNLCK, (offset), (whence), (len))
pid_t lock_test(int,int, off_t, int, off_t); /* {Prog locktest} */
#define is_read_lockable(fd,offset, whence, len) \
(lock_test((fd),F_RDLCK, (offset), (whence), (len)) == 0)
#define is_write_lockable(fd,offset, whence, len) \
(lock_test((fd),F_WRLCK, (offset), (whence), (len)) == 0)
void err_msg(constchar *, ...); /* {App misc_source} */
void err_dump(constchar *, ...) __attribute__((noreturn));
void err_quit(constchar *, ...) __attribute__((noreturn));
void err_cont(int,const char *, ...);
void err_exit(int,const char *, ...) __attribute__((noreturn));
void err_ret(constchar *, ...);
void err_sys(constchar *, ...) __attribute__((noreturn));
void log_msg(constchar *, ...); /* {App misc_source} */
void log_open(constchar *, int, int);
void log_quit(constchar *, ...) __attribute__((noreturn));
void log_ret(constchar *, ...);
void log_sys(constchar *, ...) __attribute__((noreturn));
void log_exit(int,const char *, ...) __attribute__((noreturn));
void TELL_WAIT(void); /*parent/child from {Sec race_conditions} */
void TELL_PARENT(pid_t);
void TELL_CHILD(pid_t);
void WAIT_PARENT(void);
void WAIT_CHILD(void);
#endif /*_APUE_H */