|
|
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.