int stat(const char *name,struct stat *buf) { APTR oldwin,*wptr=&((struct Process *)FindTask(NULL))->pr_WindowPtr; struct FileInfoBlock *fib; BPTR lock; int ret=-1; #ifdef IXPATHS if((name=__amigapath(name))==NULL) return -1; #endif /* avoid possible dos-requesters ;-( */ oldwin=*wptr; *wptr=(APTR)ret; if((lock=Lock((STRPTR)name,SHARED_LOCK))!=0) { if((fib=(struct FileInfoBlock *)AllocDosObject(DOS_FIB,NULL))!=NULL) { if(Examine(lock,fib)!=DOSFALSE) ret=__stat(buf,fib); else __seterrno(); FreeDosObject(DOS_FIB,fib); } else __seterrno(); UnLock(lock); } else __seterrno(); *wptr=oldwin; return ret; }
ssize_t read(int d,void *buf,size_t nbytes) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r; __chkabort(); if((r=Read(sfd->lx_fh,buf,nbytes))!=EOF) return r; __seterrno(); } return EOF; }
off_t lseek(int d,off_t offset,int whence) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r,file=sfd->lx_fh; __chkabort(); if (Seek(file,offset,whence==SEEK_SET?OFFSET_BEGINNING: whence==SEEK_END?OFFSET_END:OFFSET_CURRENT)!=EOF) if ((r=Seek(file,0,OFFSET_CURRENT))!=EOF) return r; __seterrno(); } return EOF; }
int mkdir(const char *name, mode_t mode) { BPTR fl; int ret; if ((fl=CreateDir((STRPTR)name))) { UnLock(fl); ret=chmod(name,mode); } else { __seterrno(); ret=-1; } return ret; }
int chdir(const char *path) { BPTR fl; int ret; if ((fl=Lock((STRPTR)path,SHARED_LOCK))) { UnLock(CurrentDir(fl)); ret=0; } else { __seterrno(); ret=-1; } return ret; }
int close(int d) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { if (!(sfd->lx_inuse-=1)) { if (sfd->lx_pos=d,!sfd->lx_sys) { if (!Close(sfd->lx_fh)) { __seterrno(); return EOF; } } } else { stdfiledes[d] = 0; } } return 0; }
ssize_t write(int d,const void *buf,size_t nbytes) { StdFileDes *sfd = _lx_fhfromfd(d); if (sfd) { long r; __chkabort(); switch((sfd->lx_oflags&O_APPEND)!=0) { case 1: if(!sfd->lx_isatty&&(Seek(sfd->lx_fh,0,OFFSET_END)==EOF)) break; default: if((r=Write(sfd->lx_fh,(char *)buf,nbytes))!=EOF) return r; } __seterrno(); } return EOF; }
__END_DECLS int chmod(const char *name, mode_t mode) { int ret; if((name=__amigapath(name))==NULL) return -1; if ((ret=~(SetProtection((STRPTR)name,((mode&S_IRUSR?0:FIBF_READ)| (mode&S_IWUSR?0:FIBF_WRITE|FIBF_DELETE)| (mode&S_IXUSR?0:FIBF_EXECUTE)| (mode&S_IRGRP?FIBF_GRP_READ:0)| (mode&S_IWGRP?FIBF_GRP_WRITE|FIBF_GRP_DELETE:0)| (mode&S_IXGRP?FIBF_GRP_EXECUTE:0)| (mode&S_IROTH?FIBF_OTR_READ:0)| (mode&S_IWOTH?FIBF_OTR_WRITE|FIBF_OTR_DELETE:0)| (mode&S_IXOTH?FIBF_OTR_EXECUTE:0)))))) __seterrno(); return ret; }
int open(const char *path,int flags,...) { extern char *__amigapath(const char *path); StdFileDes *sfd; #ifdef IXPATHS if((path=__amigapath(path))==NULL) return -1; #endif if ((sfd=_allocfd())) { sfd->lx_sys=0; sfd->lx_oflags=flags; if ((sfd->lx_fh=Open((char *)path,flags&O_TRUNC?MODE_NEWFILE: flags&(O_WRONLY|O_RDWR)?MODE_READWRITE:MODE_OLDFILE))) { _setup_file(sfd); return sfd->lx_pos; } __seterrno(); sfd->lx_inuse = 0; } return -1; }