예제 #1
0
파일: stat.c 프로젝트: JamesLinus/libnix
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;
}
예제 #2
0
파일: open.c 프로젝트: JamesLinus/libnix
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;
}
예제 #3
0
파일: open.c 프로젝트: JamesLinus/libnix
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;
}
예제 #4
0
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;
}
예제 #5
0
파일: chdir.c 프로젝트: wtxpwh/libnix
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;
}
예제 #6
0
파일: open.c 프로젝트: JamesLinus/libnix
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;
}
예제 #7
0
파일: open.c 프로젝트: JamesLinus/libnix
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;
}
예제 #8
0
__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;
}
예제 #9
0
파일: open.c 프로젝트: JamesLinus/libnix
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;
}