/************************************************************************* ** File: dos.c ** contains AmigaDos directory functions ** ** Functions: ** cur_dir() - gets current directory lock and ascii path name ** reset_dir() - resets current directory to that which was current ** on program entry ** do_dir() - list files in current directory and free space on volume ** to local terminal ** do_cd() - change current directory ** *************************************************************************/ #include "term.h" extern UBYTE cd_nam[128]; struct FileLock *save_dir; cur_dir() { char cur_node[128], bld_node[128]; int first = 1; struct Process *me; struct FileInfoBlock *fib; BPTR cur_lock_ptr, new_lock_ptr; struct FileLock *cur_lock; BPTR cur_vol; cur_node[0] = bld_node[0] = '\0'; me = (struct Process *)FindTask(0); save_dir = (struct FileLock *)me->pr_CurrentDir; cur_lock_ptr = (BPTR)DupLock(me->pr_CurrentDir); cur_lock = (struct FileLock *)BADDR(cur_lock_ptr); cur_vol = cur_lock->fl_Volume; fib = (struct FileInfoBlock *)AllocMem(sizeof (*fib),MEMF_CLEAR); if (Examine(cur_lock_ptr,fib)) { strcpy(cur_node,fib->fib_FileName); } else { printf("Can\'t get file info for current - error %d\n", IoErr()); FreeMem(fib,sizeof(*fib)); Exit(20); } while (TRUE) { new_lock_ptr = ParentDir(cur_lock_ptr); if (cur_lock_ptr) UnLock(cur_lock_ptr); cur_lock_ptr = new_lock_ptr; cur_lock = (struct FileLock *)BADDR(cur_lock_ptr); if (cur_lock->fl_Volume != cur_vol) { strcat(cur_node,":"); break; } if (Examine(cur_lock_ptr,fib)) { if (!first) strcat(cur_node,"/"); strcat(cur_node,bld_node); strcpy(bld_node,cur_node); strcpy(cur_node,fib->fib_FileName); first = 0; if (!cur_lock_ptr) cur_vol = NULL; } else { printf("\nCan\'t get file info for parent - error %d\n", IoErr()); } } if (!cur_lock_ptr) UnLock(cur_lock_ptr); strcat(cur_node,bld_node); strcpy(cd_nam,cur_node); FreeMem(fib,sizeof(*fib)); } reset_dir() { struct FileLock *prev_dir; prev_dir = (struct FileLock *)CurrentDir(save_dir); if (prev_dir != save_dir){ /* reset cur dir */ UnLock(prev_dir); } } do_dir() { struct Process *me; struct FileInfoBlock *fib; struct FileLock *cur_lock; struct InfoData *dev_info; char dev_dat[40]; me = (struct Process *)FindTask(0); cur_lock = me->pr_CurrentDir; fib = (struct FileInfoBlock *)AllocMem(sizeof (*fib),MEMF_CLEAR); dev_info = (struct InfoData *)AllocMem(sizeof (*dev_info),MEMF_CLEAR); if (Info(cur_lock,dev_info)) sprintf(dev_dat,"\n%d Blocks Free\n", dev_info->id_NumBlocks - dev_info->id_NumBlocksUsed); else strcpy(dev_dat,"\nCouldn't get device info\n"); Examine(cur_lock,fib); while (ExNext(cur_lock,fib)) { emits(fib->fib_FileName); if (fib->fib_DirEntryType > 0) emit('/'); emit('\n'); } emits(dev_dat); FreeMem(fib,sizeof(*fib)); FreeMem(dev_info,sizeof(*dev_info)); return(0); } do_cd() { struct FileLock *old, *new; new = (struct FileLock *)Lock(cd_nam,ACCESS_READ); old = (struct FileLock *)CurrentDir(new); if (old != save_dir) UnLock(old); return(0); }