/* begincopyright Copyright (c) 1988 Xerox Corporation. All rights reserved. Use and copying of this software and preparation of derivative works based upon this software are permitted. Any distribution of this software or derivative works must comply with all applicable United States export control laws. This software is made available AS IS, and Xerox Corporation makes no warranty about the software, its performance or its conformity to any specification. Any person obtaining a copy of this software is requested to send their name and post office or electronic mail address to: PCR Coordinator Xerox PARC 3333 Coyote Hill Rd. Palo Alto, CA 94304 endcopyright */ /* * XR_UIO.h * * * Public definitions for Unix I/O interface * for Xerox Runtime threads package. * * Demers, December 13, 1990 11:56:59 am PST * * Nearly every procedure here is a clone of a Unix I/O system call. * See Section 2 of the UPM for documentation. */ #ifndef __XR_UIO_h #define __XR_UIO_h #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* * The macros XR_SYSCALL and XR_SYSCALLX below facilitate automatic * generation of assembly-language stubs for system call name * translation. * * Example: * * extern int * XR_SYSCALL(Read,read) * (/ * fildes, buf, nbytes * /); * * declares int proc XR_Read as a synonym for Unix read. * * WARNING: don't put spaces after the comma ... Sun's cpp is too stupid to * strip leading spaces from its arguments. */ #ifdef __STDC__ # define XR_SYSCALL(pcrName,unixName) XR_##pcrName # define XR_SYSCALLX(pcrName) XR_##pcrName #else # define XR_SYSCALL(pcrName,unixName) XR_/**/pcrName # define XR_SYSCALLX(pcrName) XR_/**/pcrName #endif /* * Descriptors */ typedef int XR_Fildes; #define XR_nullFildes ((XR_Fildes)(-1)) /* * * Non-Unix-like I/O * */ typedef unsigned XR_FDKind; # define XR_FD_KIND_STD ((XR_FDKind)(0)) /* file system, socket */ # define XR_FD_KIND_STREAM ((XR_FDKind)(1)) /* System V stream */ # define XR_FD_KIND_LAST ((XR_FDKind)(1)) typedef int XR_UIOBlocking; #define XR_UIO_BLOCKING_SOME_DATA 0 /* block until eof/eom or > 0 bytes delivered */ #define XR_UIO_BLOCKING_ALL_DATA 1 /* block until eof/eom or all requested data delivered */ #define XR_UIO_BLOCKING_NEVER 2 /* never block */ #define XR_UIO_BLOCKING_ERROR -1 extern int XR_SYSCALLX(SetGetBlocking) (XR_Fildes fildes, XR_UIOBlocking blocking); /* Set input blocking behavior of descriptor. */ extern XR_UIOBlocking XR_SYSCALLX(GetGetBlocking) (XR_Fildes fildes); /* Get input blocking behavior of descriptor, or (-1) on error. */ extern int XR_SYSCALLX(SetPutBlocking) (XR_Fildes fildes, XR_UIOBlocking blocking); /* Set output blocking behavior of descriptor. */ extern XR_UIOBlocking XR_SYSCALLX(GetPutBlocking) (XR_Fildes fildes); /* Get output blocking behavior of descriptor, or (-1) on error. */ #define XR_WAIT_FOREVER_MSEC 0x0 extern int XR_SYSCALLX(SetGetTimeout) (XR_Fildes fildes, unsigned timeoutMsec); /* Set get timeout of descriptors with this capability (e.g. TCP, UDP sockets). */ extern int XR_SYSCALLX(GetGetTimeout) (XR_Fildes fildes); /* Return get timeout of descriptor, or (-1) on error. */ extern int XR_SYSCALLX(SetPutTimeout) (XR_Fildes fildes, unsigned timeoutMsec); /* Set put timeout of descriptors with this capability (e.g. TCP sockets). */ extern int XR_SYSCALLX(GetPutTimeout) (XR_Fildes fildes); /* Return put timeout of descriptor, or (-1) on error. */ extern int XR_SYSCALLX(Open4) (char *name, unsigned flags, unsigned mode, XR_FDKind kind); extern int XR_SYSCALLX(OpenStd) (char *name, unsigned flags, unsigned mode); extern int XR_SYSCALLX(OpenStream) (char *name, unsigned flags, unsigned mode); /* Each of the above procs is a version of open. On success, the result is a descriptor that is of the (implicitly- or explicitly-) specified kind. On failure the result is -1, with errno set appropriately. A descriptor-kind error will cause errno to be set to ENOSTR. */ extern char * XR_SYSCALLX(ExpandPath) (char *path); /* Expand path to full path name by prepending PCR working directory if necessary. The result either is identical to the argument (equal pointers) or is heap-allocated. */ extern XR_FDKind XR_SYSCALLX(GetDescriptorKind) (XR_Fildes fildes); /* Result is kind of descriptor, or -1 on error. */ extern int XR_SYSCALLX(GetDTableSize1) (XR_FDKind kind); /* Get the number of descriptor slots of the specified kind. Note: XR_GetDTableSize() returns the sum of XR_GetDTableSize1(kind) for all valid kind values. */ extern int XR_SYSCALLX(GetNumberOfFreeFDs) (XR_FDKind kind); /* Get the number of available descriptor slots of the specified kind. */ extern int XR_SYSCALLX(Spawn)( const char *cmd, const char *stdin, const char *stdout, const char *stderr ); /* Result is completion status of child (possibly .EX_DATAERR, EX_OSERR, ...) or -1 on failure. */ extern int XR_SYSCALLX(CDSpawn)( const char *cmd, const char *wd, const char *stdin, const char *stdout, const char *stderr ); /* Result is completion status of child (possibly .EX_DATAERR, EX_OSERR, ...) or -1 on failure. */ extern XR_Fildes XR_SYSCALLX(PPOpen) (const char *cmd); /* Fork off a Unix(tm) process running cmd. Return a fildes connected to the cmd's stdin/stdout, or -1 on failure. NOTE: This should probably be eliminated in favor of PPPOpen, below. */ extern int XR_SYSCALLX(PPPOpen) (XR_Fildes fdp[2], bool separate, const char *cmd); /* Fork off a Unix(tm) process running cmd. Store file descriptors for command's stdout and stderr in fdp[0] and fdp[1], respectively. Return -1 on failure. */ extern XR_Fildes XR_SYSCALLX(RExec2)( struct sockaddr *host, unsigned port, char *user, char *passwd, char *cmd, char *errbuf, int errbufbytes ); /* Unix(tm) remote exec protocol. If host == NIL, use localhost. If host does not specify a port, and the port argument is nonzero, use it. If connection to remote host fails, return (-1) with code available using XR_GetErrno() Use the user and passwd arguments to authenticate to remote host. If authentication fails, return (-1) with errno == ENOEXEC and store error message in *errbuf. Execute cmd on remote host. If command initiation fails return (-1) with errno == ENOEXEC and store error message in *errbuf. If remote host does not know about the local host (i.e. first read from socket returns EOF), return (-1) with errno == ECONNREFUSED. If command initiation succeeds return fildes connected cmd's stdin/stdout. It is permissible to pass errbuf == NIL, in which case RExec2 behaves like RExec, below. */ extern XR_Fildes XR_SYSCALLX(RExec)( struct sockaddr *host, unsigned port, char *user, char *passwd, char *cmd ); /* Unix(tm) remote exec protocol. If host == NIL, use localhost. If host does not specify a port, and the port argument is nonzero, use it. Use the user and passwd arguments to authenticate to remote host. If that succeeds, execute cmd on remote host. Return a fildes connected to cmd's stdin/stdout, or -1 on failure. OBSOLESCENT: implemented by XR_RExec2(host, port, user, passwd, cmd, NIL) */ /* * * Unix-like descriptor I/O * */ extern int XR_SYSCALL(Access,access) (char *path, int mode); extern int XR_SYSCALL(ChMod,chmod) (char *name, int mode); extern int XR_SYSCALL(FChMod,fchmod) (XR_Fildes fildes, int mode); extern int XR_SYSCALL(Close,close) (XR_Fildes fildes); extern int XR_SYSCALL(FSync,fsync) (XR_Fildes fildes); extern int XR_SYSCALL(FCntl,fcntl) (XR_Fildes fildes, int cmd, int arg); extern int XR_SYSCALLX(FCntl4) (XR_Fildes fildes, int cmd, int arg, bool doInIOP); extern int XR_SYSCALL(GetDEnts,getdents) (XR_Fildes fildes, char *buf, int nbytes); extern int XR_SYSCALL(GetDTableSize,getdtablesize) (void); /* */ extern int XR_SYSCALL(GetRUsage,getrusage) (/* */); /* ???? */ extern int XR_SYSCALL(IOCtl,ioctl) (XR_Fildes d, int request, char *argp); extern int XR_SYSCALLX(IOCtl4) (XR_Fildes d, int request, char *argp, bool doInIOP); extern int XR_SYSCALL(Link,link) (char *name1, char *name2); extern int XR_SYSCALL(LSeek,lseek) (XR_Fildes fildes, int offset, int whence); extern int XR_SYSCALL(MkDir,mkdir) (char *name, int mode); extern int XR_SYSCALL(MkNod,mknod) (char *name, int mode, int dev); extern XR_Fildes XR_SYSCALL(Open,open) (char *name, unsigned flags, unsigned mode); extern int XR_SYSCALL(Read,read) (XR_Fildes fildes, char * buf, unsigned nBytes); extern int XR_SYSCALLX(ReadLong) (XR_Fildes fildes, char * buf, unsigned nBytes); extern int XR_SYSCALL(ReadV,readv) (XR_Fildes fildes, struct iovec * iov, int iovCnt); /* XR_Fildes fildes; .struct iovec * iov; int iovCnt; */ extern int XR_SYSCALL(ReadLink,readlink) (char *path, char *buf, int bufsiz); extern int XR_SYSCALL(Rename,rename) (char *from, char *to); extern int XR_SYSCALL(RmDir,rmdir) (char *name); extern int XR_SYSCALL(Stat,stat) (char *path, struct XR_stat *buf); extern int XR_SYSCALL(FStat,fstat) (XR_Fildes fildes, struct XR_stat *buf); /* struct .stat *buf; */ extern int XR_SYSCALL(LStat,lstat) (char *path, struct XR_stat *buf); /* TODO: (f)statfs unimplemented in SunOS 5.2! */ extern int XR_SYSCALL(StatFS,statfs) (char *path, /* struct statfs */ void *buf); /* struct .statfs *buf; */ extern int XR_SYSCALL(FStatFS,fstatfs) (XR_Fildes fildes, /* struct statfs */ void *buf); extern int XR_SYSCALL(SymLink,symlink) (char *name1, char *name2); extern int XR_SYSCALL(Sync,sync) (void); extern int XR_SYSCALL(Truncate,truncate) (char *path, unsigned length); extern int XR_SYSCALL(FTruncate,ftruncate) (XR_Fildes fildes, unsigned length); extern int XR_SYSCALL(Unlink,unlink) (char *path); extern int XR_SYSCALL(UTimes,utimes) (char *file, struct XR_timeval tvp[2]); extern int XR_SYSCALL(Write,write) (XR_Fildes fildes, char * buf, unsigned nBytes); extern int XR_SYSCALLX(WriteLong) (XR_Fildes fildes, char * buf, unsigned nBytes); extern int XR_SYSCALL(WriteV,writev) (XR_Fildes fildes, struct iovec * iov, int iovCnt); /* .struct iovec * iov; */ /* * * stream calls * */ extern int XR_SYSCALL(GetMsg,getmsg) (XR_Fildes fildes, struct strbuf *ctlptr, struct strbuf *dataptr, int *flags); /* struct .strbuf *ctlptr; struct .strbuf *dataptr; */ extern int XR_SYSCALL(PutMsg,putmsg) (XR_Fildes fildes, struct strbuf *ctlptr, struct strbuf *dataptr, int flags); extern int XR_SYSCALL(Poll,poll) (struct XR_pollfd *fds, unsigned nfds, int timeout); /* struct .pollfd *fds; Similar to poll, but ... - works on an arbitrary descriptor - nfds must be 1 - the file descriptor specified in fds[0] must be valid (not -1) */ /* * * socket calls * */ extern XR_Fildes XR_SYSCALL(Accept,accept) (XR_Fildes fildes, struct sockaddr *addr, int *addrlen); /* struct .sockaddr *addr; */ extern int XR_SYSCALL(Bind,bind) (XR_Fildes fildes, struct sockaddr *name, int namelen); extern int XR_SYSCALL(Connect,connect) (XR_Fildes fildes, struct sockaddr *name, int namelen); extern int XR_SYSCALL(GetPeerName,getpeername) (XR_Fildes fildes, struct sockaddr *name, int *namelen); extern int XR_SYSCALL(GetSockName,getsockname) (XR_Fildes fildes, struct sockaddr *name, int *namelen); extern int XR_SYSCALL(GetSockOpt,getsockopt) ( XR_Fildes fildes, int level, int optid, char *optval, int *optlen ); extern int XR_SYSCALL(SetSockOpt,setsockopt) ( XR_Fildes fildes, int level, int optid, char *optval, int optlen ); extern int XR_SYSCALL(Listen,listen) (XR_Fildes fildes, int backlog); extern int XR_SYSCALL(Recv,recv) (XR_Fildes fildes, char *buf, int len, unsigned flags); extern int XR_SYSCALL(RecvFrom,recvfrom) ( XR_Fildes fildes, char *buf, int len, unsigned flags, struct sockaddr *from, int *fromlen ); /* struct .sockaddr *from */ extern int XR_SYSCALL(Send,send) (XR_Fildes fildes, char *buf, int len, unsigned flags); extern int XR_SYSCALL(SendTo,sendto) ( XR_Fildes fildes, char *buf, int len, unsigned flags, struct sockaddr *to, int tolen ); extern int XR_SYSCALL(Shutdown,shutdown) (XR_Fildes fildes, unsigned how); extern XR_Fildes XR_SYSCALL(Socket,socket) (int af, int type, int protocol); /* * * Other Unix system calls * * ( ?? ?? These probably belong in a different file ?? ?? ) * */ extern int XR_SYSCALL(GetDomainName,getdomainname) (char *name, int nameLen); extern int XR_SYSCALL(GetGID,getgid) (void); extern int XR_SYSCALL(GetEGID,getegid) (void); extern int XR_SYSCALL(GetGroups,getgroups) (int gidSetLen, int *gidSet); extern int XR_SYSCALL(GetHostID,gethostid) (void); extern int XR_SYSCALL(GetHostName,gethostname) (char *name, int nameLen); extern int XR_SYSCALL(GetPageSize,getpagesize) (void); extern int XR_SYSCALL(GetPGrp,getpgrp) (int pid); extern int XR_SYSCALL(GetPID,getpid) (void); extern int XR_SYSCALL(GetPPID,getppid) (void); extern int XR_SYSCALL(GetTimeOfDay,gettimeofday) (struct XR_timeval *tp, struct XR_timezone *tzp); /* .struct timeval *tp; .struct timezone *tzp; */ extern int XR_SYSCALL(GetUID,getuid) (void); extern int XR_SYSCALL(GetEUID,geteuid) (void); extern int XR_SYSCALL(Kill,kill) (int pid, int sig); extern int XR_SYSCALL(KillPG,killpg) (int pgrp, int sig); extern int XR_SYSCALL(MInCore,mincore) (char *addr, int len, char *vec); extern int XR_SYSCALL(MMap,mmap) ( XR_Pointer addr, unsigned len, int prot, int flags, XR_Fildes fildes, unsigned off ); /* Like SunOS or BSD mmap(2) call. Restrictions: (flags & (MAP_SHARED|MAP_FIXED)) == (MAP_SHARED|MAP_FIXED). addr must be page-aligned. range [addr, addr+len) must lie beyond the heap segment limit (see XR_SetSegLimit in ThreadsSharedMem.h). Return addr on success, (-1) on failure. */ extern int XR_SYSCALL(MProtect,mprotect) (XR_Pointer addr, unsigned len, int prot); /* Like SunOS mprotect call. Restrictions: addr must be page-aligned. range [addr, addr+len) must lie outside heap segment. See ThreadsVirtualDirty.h for heap protection. Return 0 on success, (-1) on failure. */ extern int XR_SYSCALL(MSync,msync) (XR_Pointer addr, int len, int flags); extern int XR_SYSCALL(MUnmap,munmap) (XR_Pointer addr, unsigned len); /* Like SunOS or BSD munmap(2) call. Restriction: addr must be page-aligned. munmapped region must lie beyond heap segment limit AND MUST BE MAPPED. Return 0 on success. Panic on failure. DANGER! */ extern int XR_SYSCALL(Profil,profil) ( char *buf, int bufSize, int offset, int scale ); extern int XR_SYSCALL(ShmAt,shmat) (int id, XR_Pointer addr, int flags); extern int XR_SYSCALL(ShmCtl,shmctl) (int shmid, int cmd, struct XR_shmid_ds *buf); extern int XR_SYSCALL(ShmDt,shmdt) (XR_Pointer addr); extern int XR_SYSCALL(ShmGet,shmget) (int key, int size, int shmflag); extern void* XR_SYSCALL(VMReserve,vmreserve) (unsigned nbytes); #endif __XR_UIO_h