|
|
1.1 root 1: /*
2: * static char ID_rdpagc[] = "@(#) readpage.c: 1.2 11/10/82";
3: */
4:
5: readpage(itemid, framenbr)
6: int framenbr;
7: ITEMID itemid;
8: {
9:
10: register int index;
11: register HEADER *gframe;
12: int spacenbr, bytesread;
13: char file_name[NAMELENG];
14: long offset, pagenbr;
15:
16: pagenbr = XTRCTPN(itemid);
17: spacenbr = XTRCTSP(itemid);
18:
19: gframe = &global_frames[spacenbr];
20:
21: offset = 0L;
22: for( index = 0; index < gframe->numbfiles; index++ ) {
23: if( pagenbr < (offset + gframe->filesize[index]) )
24: break;
25: offset += gframe->filesize[index];
26: }
27: if( index == gframe->numbfiles )
28: return( fatal("attempt to read page outside of address space") );
29:
30: offset = pagenbr - offset;
31:
32: if( gframe->filedes[index] == NOTMADE )
33: return( fatal("attempt to read from nonexistant file") );
34:
35: if( gframe->filedes[index] == CLOSED ) {
36: sprintf(file_name, "%s/%s%d", direct_names[spacenbr], TEMPLATE, index);
37: if( (gframe->filedes[index] = open(file_name,RW)) < 0 )
38: return( fatal("unable to open SDP file for read") );
39: }
40:
41: if( lseek(gframe->filedes[index], offset*PAGESIZE, 0) < 0 )
42: return( fatal("lseek failure on SDP file") );
43:
44: SDP_read++;
45: if( dflag > 15 )
46: fprintf( stderr, " r%02d ", framenbr );
47:
48: if( (bytesread =
49: read(gframe->filedes[index], manager[framenbr].frame_pntr, PAGESIZE)) < 0 )
50: return( fatal("read feilure on SDP file") );
51:
52: manager[framenbr].page_id = itemid;
53:
54: partusage[manager[framenbr].partition]++;
55: #if DPARTRESET == -1
56: partusage[num_partitions]++;
57: #else
58: if( ++partusage[num_partitions] >= partreset )
59: repartition();
60: #endif
61:
62: return( bytesread );
63: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.