/* Copyright (c) 1993 Xerox Corporation. All rights reserved. */ /* $Id$ $Date$ * * PCR - I/O public interface * * This monster interface is a list of all the I/O related procs that need * to exist to support POSIX 1, together with a few PCR-specific * extensions. * * All procs may be called with signals enabled. */ #ifndef __PCR_IO_h #define __PCR_IO_h 1 #include #include #include #include #include #include /* * directory enumeration */ extern PCR_ERes PCR_IO_EnumDir( const char *dirName, PCR_ERes (*callbackProc)(const char *fileName, PCR_Any data), PCR_Any callbackData, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* Invoke callback proc for each file in named directory in arbitrary order. If callback proc ever returns a result r other than PCR_ERes_okay, the enumeration terminates returning r. */ /* * Working directory */ extern PCR_ERes PCR_IO_ChDir( const char *path, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_GetCWD( char **bufp, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_ApplyToCWD( PCR_ERes (*proc)(const char *path, PCR_Any data), PCR_Any data, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_MakeFullPathName( const char *path, char **bufp, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* * file and directory create/delete */ extern PCR_ERes PCR_IO_MkDir( const char *path, mode_t mode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_RmDir( const char *path, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Open( const char *path, int oflag, mode_t mode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_MkFIFO( const char *path, mode_t mode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Link( const char *path1, const char *path2, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Unlink( const char *path, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Rename( const char *old, const char *new, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern mode_t PCR_IO_UMask(mode_t mask); /* * Access control and other metadata */ extern PCR_ERes PCR_IO_Access( const char *path, int amode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_ChMod( const char *path, mode_t mode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_ChOwn( const char *path, uid_t owner, gid_t group, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_UTime( const char *path, struct utimbuf *p, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Stat( const char *path, struct PCR_stat *sbuf, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FStat( int fildes, struct PCR_stat *sbuf, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FPathConf( int fildes, int name, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_PathConf( const char *path, int name, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* * I/O operations */ extern PCR_ERes PCR_IO_Pipe( int fildes[2], const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Dup( int fildes, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Dup2( int fildes, int fildes2, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Close( int fildes, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Read( int fildes, char *buf, unsigned int nbyte, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Write( int fildes, char *buf, unsigned int nbyte, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_LSeek( int fildes, off_t offset, int whence, off_t *where, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FCntl( int fildes, int cmd, PCR_Any arg, int *ansp, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* * Wait for ready. */ typedef unsigned short PCR_IO_WaitReadyEvents; #define PCR_IO_WaitReadyEvents_none 0 #define PCR_IO_WaitReadyEvents_IN 0x01 #define PCR_IO_WaitReadyEvents_PRI 0x02 #define PCR_IO_WaitReadyEvents_OUT 0x04 #define PCR_IO_WaitReadyEvents_ERR 0x10 #define PCR_IO_WaitReadyEvents_HUP 0x20 extern PCR_ERes PCR_IO_WaitReady( int fildes, PCR_IO_WaitReadyEvents events, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* Analogous to System V Poll() call, but only one descriptor is allowed. On success, the result is the returned "revents" value. The result is only a hint, since a concurrent thread may change the descriptor's state. */ /* * Non-POSIX, best-effort (may return ENOSYS in some cases) ... */ extern PCR_ERes PCR_IO_Ctl( int fildes, int request, int param, void *buf, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Sync( const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FSync( int fildes, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FChMod( int fildes, mode_t mode, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FChOwn( int fildes, uid_t owner, gid_t group, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_Truncate( const char *path, off_t length, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_FTruncate( int fildes, off_t length, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_SymLink( const char *name1, const char *name2, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); extern PCR_ERes PCR_IO_ReadLink( const char *path, char *buf, int bufSize, const PCR_sigset_t *sigMask, PCR_Msec wakeup ); /* Success => path exists and is a symlink; EINVAL => path exists but is not a symlink. Store contents of link in *buf, append trailing null. Return actual length of link contents (not counting the trailing null), even if that exceeds bufSize. */ /* * Local/Global descriptor support */ extern /* readonly */ int PCR_IO_lfdLim; extern /* readonly */ int PCR_IO_gfdLim; extern /* readonly */ int PCR_IO_gfdStd[3]; extern PCR_Bool PCR_IO_FDIsValid(int fd); #define PCR_IO__FDIsValid(fd) (\ ((fd) >= 0) && ((fd) < PCR_IO_gfdLim) ) #define PCR_IO_FDIsValid PCR_IO__FDIsValid extern PCR_Bool PCR_IO_FDIsLocal(int fd); #define PCR_IO__FDIsLocal(fd) ((fd) < PCR_IO_lfdLim) #define PCR_IO_FDIsLocal(fd) PCR_IO__FDIsLocal(fd) extern PCR_Bool PCR_IO_FDIsValidLocal(int fd); #define PCR_IO__FDIsValidLocal(fd) (((fd) >= 0) && ((fd) < PCR_IO_lfdLim)) #define PCR_IO_FDIsValidLocal(fd) PCR_IO__FDIsValidLocal(fd) extern PCR_Bool PCR_IO_FDIsGlobal(int fd); #define PCR_IO__FDIsGlobal(fd) ((fd) >= PCR_IO_lfdLim) #define PCR_IO_FDIsGlobal(fd) PCR_IO__FDIsGlobal(fd) extern PCR_Bool PCR_IO_FDIsValidGlobal(int fd); #define PCR_IO__FDIsValidGlobal(fd) \ (((fd) >= PCR_IO_lfdLim) && ((fd) < PCR_IO_gfdLim)) #define PCR_IO_FDIsValidGlobal(fd) PCR_IO__FDIsValidGlobal(fd) extern PCR_ERes PCR_IO_GlobalFDFromFD(int fd); /* This bumps the reference count of the global fd. Thus, PCR_IO_Close(PCR_IO_GlobalFDFromFD(fd)) is a noop. */ #endif /* ! __PCR_IO_h */ /* $Log$ */