⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unpipc.h

📁 著名的UNIX网络编程卷1-连网的API-套接字与XTI第二版(中文版)的源代码
💻 H
字号:
/* include unpipch *//* Our own header.  Tabs are set for 4 spaces, not 8 */#ifndef	__unpipc_h#define	__unpipc_h#include	"../config.h"	/* configuration options for current OS */							/* "../config.h" is generated by configure *//* If anything changes in the following list of #includes, must change   ../aclocal.m4 and ../configure.in also, for configure's tests. */#include	<sys/types.h>	/* basic system data types */#include	<sys/time.h>	/* timeval{} for select() */#include	<time.h>		/* timespec{} for pselect() */#include	<errno.h>#include	<fcntl.h>		/* for nonblocking */#include	<limits.h>		/* PIPE_BUF */#include	<signal.h>#include	<stdio.h>#include	<stdlib.h>#include	<string.h>#include	<sys/stat.h>	/* for S_xxx file mode constants */#include	<unistd.h>#include	<sys/wait.h>#ifdef	HAVE_MQUEUE_H# include	<mqueue.h>		/* Posix message queues */#endif#ifdef	HAVE_SEMAPHORE_H# include	<semaphore.h>	/* Posix semaphores */#ifndef	SEM_FAILED#define	SEM_FAILED	((sem_t *)(-1))#endif#endif#ifdef	HAVE_SYS_MMAN_H# include	<sys/mman.h>	/* Posix shared memory */#endif#ifndef	MAP_FAILED#define	MAP_FAILED	((void *)(-1))#endif#ifdef	HAVE_SYS_IPC_H# include	<sys/ipc.h>		/* System V IPC */#endif#ifdef	HAVE_SYS_MSG_H# include	<sys/msg.h>		/* System V message queues */#endif#ifdef	HAVE_SYS_SEM_H#ifdef	__bsdi__#undef	HAVE_SYS_SEM_H		/* hack: BSDI's semctl() prototype is wrong */#else# include	<sys/sem.h>		/* System V semaphores */#endif#ifndef	HAVE_SEMUN_UNION/* $$.It semun$$ */union semun {				/* define union for semctl() */  int              val;  struct semid_ds *buf;  unsigned short  *array;};#endif#endif	/* HAVE_SYS_SEM_H */#ifdef	HAVE_SYS_SHM_H# include	<sys/shm.h>		/* System V shared memory */#endif#ifdef	HAVE_SYS_SELECT_H# include	<sys/select.h>	/* for convenience */#endif#ifdef	HAVE_POLL_H# include	<poll.h>		/* for convenience */#endif#ifdef	HAVE_STROPTS_H# include	<stropts.h>		/* for convenience */#endif#ifdef	HAVE_STRINGS_H# include	<strings.h>		/* for convenience */#endif/* Next three headers are normally needed for socket/file ioctl's: * <sys/ioctl.h>, <sys/filio.h>, and <sys/sockio.h>. */#ifdef	HAVE_SYS_IOCTL_H# include	<sys/ioctl.h>#endif#ifdef	HAVE_SYS_FILIO_H# include	<sys/filio.h>#endif#ifdef	HAVE_PTHREAD_H# include	<pthread.h>#endif#ifdef	HAVE_DOOR_H# include	<door.h>		/* Solaris doors API */#endif#ifdef	HAVE_RPC_RPC_H#ifdef _PSX4_NSPACE_H_TS	/* Digital Unix 4.0b hack, hack, hack */#undef	SUCCESS#endif# include	<rpc/rpc.h>		/* Sun RPC */#endif/* Define bzero() as a macro if it's not in standard C library. */#ifndef	HAVE_BZERO#define	bzero(ptr,n)		memset(ptr, 0, n)#endif/* Posix.1g requires that an #include of <poll.h> DefinE INFTIM, but many   systems still DefinE it in <sys/stropts.h>.  We don't want to include   all the streams stuff if it's not needed, so we just DefinE INFTIM here.   This is the standard value, but there's no guarantee it is -1. */#ifndef INFTIM#define INFTIM          (-1)    /* infinite poll timeout */#ifdef	HAVE_POLL_H#define	INFTIM_UNPH				/* tell unpxti.h we defined it */#endif#endif/* Miscellaneous constants */#ifndef	PATH_MAX			/* should be in <limits.h> */#define	PATH_MAX	1024	/* max # of characters in a pathname */#endif#define	MAX_PATH	1024/* $$.ix [MAX_PATH]~constant,~definition~of$$ */#define	MAXLINE		4096	/* max text line length *//* $$.ix [MAXLINE]~constant,~definition~of$$ *//* $$.ix [BUFFSIZE]~constant,~definition~of$$ */#define	BUFFSIZE	8192	/* buffer size for reads and writes */#define	FILE_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)					/* default permissions for new files *//* $$.ix [FILE_MODE]~constant,~definition~of$$ */#define	DIR_MODE	(FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH)					/* default permissions for new directories *//* $$.ix [DIR_MODE]~constant,~definition~of$$ */#define	SVMSG_MODE	(MSG_R | MSG_W | MSG_R>>3 | MSG_R>>6)					/* default permissions for new SV message queues *//* $$.ix [SVMSG_MODE]~constant,~definition~of$$ */#define	SVSEM_MODE	(SEM_R | SEM_A | SEM_R>>3 | SEM_R>>6)					/* default permissions for new SV semaphores *//* $$.ix [SVSEM_MODE]~constant,~definition~of$$ */#define	SVSHM_MODE	(SHM_R | SHM_W | SHM_R>>3 | SHM_R>>6)					/* default permissions for new SV shared memory *//* $$.ix [SVSHM_MODE]~constant,~definition~of$$ */typedef	void	Sigfunc(int);	/* for signal handlers */#ifdef	HAVE_SIGINFO_T_STRUCTtypedef	void	Sigfunc_rt(int, siginfo_t *, void *);#endif#define	min(a,b)	((a) < (b) ? (a) : (b))#define	max(a,b)	((a) > (b) ? (a) : (b))#ifndef	HAVE_TIMESPEC_STRUCTstruct timespec {  time_t	tv_sec;		/* seconds */  long		tv_nsec;	/* and nanoseconds */};/* $$.It timespec$$ *//* $$.Ib tv_sec$$ *//* $$.Ib tv_nsec$$ */#endif/* * In our wrappers for open(), mq_open(), and sem_open() we handle the * optional arguments using the va_XXX() macros.  But one of the optional * arguments is of type "mode_t" and this breaks under BSD/OS because it * uses a 16-bit integer for this datatype.  But when our wrapper function * is called, the compiler expands the 16-bit short integer to a 32-bit * integer.  This breaks our call to va_arg().  All we can do is the * following hack.  Other systems in addition to BSD/OS might have this * problem too ... */#ifdef	__bsdi__#define	va_mode_t	int#else#define	va_mode_t	mode_t#endif/* $$.ix [va_mode_t]~datatype,~definition~of$$ */		/* our record locking macros */#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)#define	is_read_lockable(fd, offset, whence, len) \			lock_test(fd, F_RDLCK, offset, whence, len)#define	is_write_lockable(fd, offset, whence, len) \			lock_test(fd, F_WRLCK, offset, whence, len)/* end unpipch */#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)#define	Is_read_lockable(fd, offset, whence, len) \			Lock_test(fd, F_RDLCK, offset, whence, len)#define	Is_write_lockable(fd, offset, whence, len) \			Lock_test(fd, F_WRLCK, offset, whence, len)			/* prototypes for our own library functions */void	 daemon_init(const char *, int);void	 daemon_inetd(const char *, int);char	*gf_time(void);int		 lock_reg(int, int, int, off_t, int, off_t);pid_t	 lock_test(int, int, off_t, int, off_t);void	*my_shm(size_t);char	*px_ipc_name(const char *);int		 readable_timeo(int, int);ssize_t	 readline(int, void *, size_t);ssize_t	 readn(int, void *, size_t);int		 set_concurrency(int);Sigfunc *signal_intr(int, Sigfunc *);int	 	 sleep_us(unsigned int);int		 start_time(void);double	 stop_time(void);int		 touch(void *, int);void	 tv_sub(struct timeval *, struct timeval *);int		 writable_timeo(int, int);ssize_t	 writen(int, const void *, size_t);#ifndef	HAVE_GETHOSTNAME_PROTOint		 gethostname(char *, int);#endif#ifndef	HAVE_ISFDTYPE_PROTOint		 isfdtype(int, int);#endif#ifndef	HAVE_PSELECT_PROTOint		 pselect(int, fd_set *, fd_set *, fd_set *,				 const struct timespec *, const sigset_t *);#endif#ifndef	HAVE_SNPRINTF_PROTOint		 snprintf(char *, size_t, const char *, ...);#endif			/* prototypes for our own library wrapper functions */char	*Gf_time(void);void	 Lock_reg(int, int, int, off_t, int, off_t);pid_t	 Lock_test(int, int, off_t, int, off_t);void	*My_shm(size_t);char	*Px_ipc_name(const char *);int		 Readable_timeo(int, int);ssize_t	 Readline(int, void *, size_t);ssize_t	 Readn(int, void *, size_t);void	 Set_concurrency(int);Sigfunc *Signal(int, Sigfunc *);Sigfunc *Signal_intr(int, Sigfunc *);#ifdef	HAVE_SIGINFO_T_STRUCTSigfunc_rt *Signal_rt(int, Sigfunc_rt *);Sigfunc_rt *Signal_rt_intr(int, Sigfunc_rt *);#endifvoid	 Sleep_us(unsigned int);void	 Start_time(void);double	 Stop_time(void);void	 Touch(void *, int);int		 Writable_timeo(int, int);void	 Writen(int, void *, size_t);			/* prototypes for our Unix wrapper functions */void	*Calloc(size_t, size_t);void	 Close(int);void	 Dup2(int, int);int		 Fcntl(int, int, void *);pid_t	 Fork(void);long	 Fpathconf(int, int);void	 Fstat(int, struct stat *);key_t	 Ftok(const char *, int);void	 Ftruncate(int, off_t);int		 Getopt(int, char *const *, const char *);void	 Gettimeofday(struct timeval *, void *);int		 Ioctl(int, int, void *);void	 Kill(pid_t, int);off_t	 Lseek(int, off_t, int);void	*Malloc(size_t);void	 Mkfifo(const char *, mode_t);void	 Mktemp(char *);void	*Mmap(void *, size_t, int, int, int, off_t);void	 Munmap(void *, size_t);int		 Open(const char *, int, ...);long	 Pathconf(const char *, int);void	 Pipe(int *fds);ssize_t	 Read(int, void *, size_t);int		 Select(int, fd_set *, fd_set *, fd_set *, struct timeval *);void	 Sigaddset(sigset_t *, int);void	 Sigdelset(sigset_t *, int);void	 Sigemptyset(sigset_t *);void	 Sigfillset(sigset_t *);int		 Sigismember(const sigset_t *, int);void	 Sigpending(sigset_t *);void	 Sigprocmask(int, const sigset_t *, sigset_t *);#ifdef	HAVE_SIGINFO_T_STRUCTvoid	 Sigqueue(pid_t, int, const union sigval);#endif#ifdef	HAVE_SIGWAITvoid	 Sigwait(const sigset_t *, int *);#endifvoid	 Stat(const char *, struct stat *);char	*Strdup(const char *);long	 Sysconf(int);void	 Sysctl(int *, u_int, void *, size_t *, void *, size_t);void	 Unlink(const char *);void	*Valloc(size_t);pid_t	 Wait(int *);pid_t	 Waitpid(pid_t, int *, int);void	 Write(int, void *, size_t);#ifdef	HAVE_MQUEUE_H			/* 4Posix message queues */mqd_t	 Mq_open(const char *, int, ...);void	 Mq_close(mqd_t);void	 Mq_unlink(const char *pathname);void	 Mq_send(mqd_t, const char *, size_t, unsigned int);ssize_t	 Mq_receive(mqd_t, char *, size_t, unsigned int *);void	 Mq_notify(mqd_t, const struct sigevent *);void	 Mq_getattr(mqd_t, struct mq_attr *);void	 Mq_setattr(mqd_t, const struct mq_attr *, struct mq_attr *);#endif	/* HAVE_MQUEUE_H */#ifdef	HAVE_SEMAPHORE_H			/* 4Posix semaphores */sem_t	*Sem_open(const char *, int, ...);void	 Sem_close(sem_t *);void	 Sem_unlink(const char *);void	 Sem_init(sem_t *, int, unsigned int);void	 Sem_destroy(sem_t *);void	 Sem_wait(sem_t *);int		 Sem_trywait(sem_t *);void	 Sem_post(sem_t *);void	 Sem_getvalue(sem_t *, int *);#endif	/* HAVE_SEMAPHORE_H *//* Note that <sys/mman.h> is defined on some systems that do not support * Posix shared memory (e.g., 4.4BSD), because this header predates Posix * and appears on any system that supports mmap().  Therefore we cannot * use this to determine whether the implementation supports Posix shared * memory or not.  We use our own HAVE_SHM_OPEN_PROTO symbol. */#ifdef	HAVE_SHM_OPEN_PROTO			/* 4Posix shared memory */int		 Shm_open(const char *, int, mode_t);void	 Shm_unlink(const char *);#endif#ifdef	HAVE_SYS_MSG_H			/* 4System V message queues */int		 Msgget(key_t key, int flag);void	 Msgctl(int, int, struct msqid_ds *);void	 Msgsnd(int, const void *, size_t, int);ssize_t	 Msgrcv(int, void *, size_t, int, int);#endif	/* HAVE_SYS_MSG_H */#ifdef	HAVE_SYS_SEM_H			/* 4System V semaphores */int		 Semget(key_t, int, int);int		 Semctl(int, int, int, ...);void	 Semop(int, struct sembuf *, size_t);#endif	/* HAVE_SYS_SEM_H */#ifdef	HAVE_SYS_SHM_H			/* 4System V shared memory */int		 Shmget(key_t, size_t, int);void	*Shmat(int, const void *, int);void	 Shmdt(const void *);void	 Shmctl(int, int, struct shmid_ds *);#endif	/* HAVE_SYS_SHM_H */			/* prototypes for our stdio wrapper functions */void	 Fclose(FILE *);FILE	*Fdopen(int, const char *);char	*Fgets(char *, int, FILE *);FILE	*Fopen(const char *, const char *);void	 Fputs(const char *, FILE *);FILE	*Popen(const char *, const char *);int		 Pclose(FILE *);#ifdef	HAVE_FATTACHvoid	 Fattach(int, const char *);#endif#ifdef	HAVE_POLLint		 Poll(struct pollfd *, unsigned long, int);#endifvoid	 err_dump(const char *, ...);void	 err_msg(const char *, ...);void	 err_quit(const char *, ...);void	 err_ret(const char *, ...);void	 err_sys(const char *, ...);			/* prototypes for our pthread wrapper functions */void	 Pthread_attr_init(pthread_attr_t *);void	 Pthread_attr_destroy(pthread_attr_t *);void	 Pthread_attr_setdetachstate(pthread_attr_t *, int);void	 Pthread_attr_setscope(pthread_attr_t *, int);void	 Pthread_create(pthread_t *, const pthread_attr_t *,					    void * (*)(void *), void *);void	 Pthread_join(pthread_t, void **);void	 Pthread_detach(pthread_t);void	 Pthread_kill(pthread_t, int);void	 Pthread_setcancelstate(int, int *);void	 Pthread_mutexattr_init(pthread_mutexattr_t *);void	 Pthread_mutexattr_destroy(pthread_mutexattr_t *);void	 Pthread_mutexattr_setpshared(pthread_mutexattr_t *, int);void	 Pthread_mutex_init(pthread_mutex_t *, pthread_mutexattr_t *);void	 Pthread_mutex_destroy(pthread_mutex_t *);void	 Pthread_mutex_lock(pthread_mutex_t *);void	 Pthread_mutex_unlock(pthread_mutex_t *);void	 Pthread_condattr_init(pthread_condattr_t *);void	 Pthread_condattr_destroy(pthread_condattr_t *);void	 Pthread_condattr_setpshared(pthread_condattr_t *, int);void	 Pthread_cond_broadcast(pthread_cond_t *);void	 Pthread_cond_signal(pthread_cond_t *);void	 Pthread_cond_wait(pthread_cond_t *, pthread_mutex_t *);void	 Pthread_cond_timedwait(pthread_cond_t *, pthread_mutex_t *,							    const struct timespec *);void	 Pthread_key_create(pthread_key_t *, void (*)(void *));void	 Pthread_setspecific(pthread_key_t, const void *);void	 Pthread_once(pthread_once_t *, void (*)(void));long	 pr_thread_id(pthread_t *);#ifdef	HAVE_DOOR_H			/* typedefs to simplify declarations */typedef	void  Door_server_proc(void *, char *, size_t, door_desc_t *, size_t);typedef	void  Door_create_proc(door_info_t *);			/* prototypes for our doors wrapper functions */void	 Door_bind(int);void	 Door_call(int, door_arg_t *);int		 Door_create(Door_server_proc *, void *, u_int);void	 Door_cred(door_cred_t *);void	 Door_info(int, door_info_t *);void	 Door_return(char *, size_t, door_desc_t *, size_t);void	 Door_revoke(int);void	 Door_unbind(void);Door_create_proc	*Door_server_create(Door_create_proc *);#endif	/* HAVE_DOOR_H */#ifdef	HAVE_RPC_RPC_HCLIENT	*Clnt_create(const char *, u_long, u_long, const char *);void	 Clnt_control(CLIENT *, u_int, char *);#endif#endif	/* __unpipc_h */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -