|
|
1.1 root 1: /*
2: * static char ID_wrtfrmc[] = "@(#) writeframe.c: 1.1 1/8/82";
3: */
4:
5: writeframe(framenbr)
6: int framenbr;
7: {
8:
9: register int index;
10: register HEADER *gframe;
11: int byteswritten, spacenbr, fdes;
12: char file_name[NAMELENG];
13: long offset;
14: long pagenbr;
15:
16: spacenbr = XTRCTSP(manager[framenbr].page_id);
17: pagenbr = XTRCTPN(manager[framenbr].page_id);
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: if( gframe->numbfiles == MAXFILES )
29: return( fatal("address space too large") );
30: else
31: gframe->filedes[++gframe->numbfiles] = NOTMADE;
32:
33: offset = pagenbr - offset;
34:
35: sprintf(file_name, "%s/%s%d", direct_names[spacenbr], TEMPLATE, index);
36:
37: if( gframe->filedes[index] == NOTMADE ) {
38: if( (fdes = creat(file_name,MODE) ) < 0 )
39: return( fatal("create of new SDP file failed") );
40: if( close(fdes) == SYSERR )
41: return( fatal("close of new SDP file failed") );
42: gframe->filedes[index] = CLOSED;
43: }
44:
45: if( gframe->filedes[index] == CLOSED )
46: if( (gframe->filedes[index] = open(file_name, RW)) < 0 )
47: return( fatal("open of new SDP file failed") );
48:
49: if( lseek(gframe->filedes[index], offset*PAGESIZE, 0) < 0 )
50: return( fatal("lseek on SDP file failed") );
51:
52: SDP_write++;
53: if( dflag > 15 )
54: fprintf( stderr, " w%02d ", framenbr );
55:
56: if( (byteswritten =
57: write(gframe->filedes[index], manager[framenbr].frame_pntr, PAGESIZE)) < 0 )
58: return( fatal("write failed to SDP file") );
59:
60: partusage[manager[framenbr].partition]++;
61: partusage[num_partitions]++;
62:
63: return( byteswritten );
64: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.