|
|
1.1 ! root 1: static char ID[] = "@(#) readpage.c: 1.1 3/16/82"; ! 2: #include <stdio.h> ! 3: #include "sdp.h" ! 4: #include "define3.h" ! 5: ! 6: #ifdef SHORT ! 7: #define RP01 "RP01 " ! 8: #define RP02 "RP02 " ! 9: #define RP03 "RP03 " ! 10: #define RP04 "RP04 " ! 11: #define RP05 "RP05 " ! 12: #define RP06 "RP06 " ! 13: #define RP07 "RP07 " ! 14: #else ! 15: #define RP01 "RP01 -- attempt to read id beyond maximum allottment\n%lo\t%lo\n",id,sp->maxpage ! 16: #define RP02 "RP02 -- attempt to read beyond file configuration\n%d\t%d\n",i,sp->numbfile ! 17: #define RP03 "RP03 -- fail to build file name\n%s%d\n",sp->head_name,i ! 18: #define RP04 "RP04 -- error return from open\n%s\n",file_name ! 19: #define RP05 "RP05 -- fail to seek\n%s\n",file_name ! 20: #define RP06 "RP06 -- fail to read\n%s\n",file_name ! 21: #define RP07 "RP07 -- unexpected number of bytes read\n%d\n",byterd ! 22: #endif ! 23: ! 24: extern struct LIBFILE *Glib_file ; ! 25: extern char *BUILDNAME() ; ! 26: extern FATAL() ; ! 27: ! 28: int /* SUCCESS or ERROR */ ! 29: readpage(sp,id,frame) ! 30: register struct SPACE *sp ; ! 31: register ITEMID id ; ! 32: int frame; ! 33: { ! 34: struct MANAGER *manager ; ! 35: register int i ; ! 36: register long floor ; ! 37: register int byterd ; ! 38: long offset ; ! 39: char *file_name ; ! 40: ! 41: if(id >= sp->maxpage) ! 42: ERR_RET(RP01,ERROR) ! 43: ! 44: id -= id % (sp->environ)->frame_size ; ! 45: ! 46: for(floor=i=0; id >= (floor += sp->fileinfo[i].leng) ;) ! 47: if(++i == sp->numbfile) ! 48: ERR_RET(RP02,ERROR) ! 49: offset = id - (floor - sp->fileinfo[i].leng); ! 50: ! 51: switch(sp->fileinfo[i].desc) ! 52: { ! 53: case NOTMADE: ! 54: return(SUCCESS) ; ! 55: ! 56: case CLOSED: ! 57: if( (file_name = MBUILDNAME(sp->head_name,i)) == NULL ) ! 58: ERR_RET(RP03,ERROR) ! 59: if( (sp->fileinfo[i].desc = MOPEN(file_name,sp->perms)) == ERROR ) ! 60: ERR_RET(RP04,ERROR) ! 61: FREE(file_name) ; ! 62: break ; ! 63: ! 64: default: ! 65: break ; ! 66: } ! 67: ! 68: if(MSEEK(sp->fileinfo[i].desc,offset) == ERROR) ! 69: ERR_RET(RP05,ERROR) ! 70: ! 71: manager = (sp->environ)->manp ; ! 72: if( (byterd = MREAD(sp->fileinfo[i].desc,manager[frame].frame_pntr,(sp->environ)->frame_size)) == ERROR ) ! 73: ERR_RET(RP06,ERROR) ! 74: ! 75: if( (byterd > sp->environ->frame_size) || (byterd % sp->page_size != 0) ) ! 76: ERR_RET(RP07,ERROR) ! 77: ! 78: (sp->environ)->stats.faults++ ; ! 79: return(SUCCESS) ; ! 80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.