|
|
1.1 root 1: static char ID[] = "@(#) writeframe.c: 1.1 3/16/82";
2: #include <stdio.h>
3: #include "sdp.h"
4: #include "define3.h"
5:
6: #ifdef SHORT
7: #define WF01 "WF01 "
8: #define WF02 "WF02 "
9: #define WF03 "WF03 "
10: #define WF04 "WF04 "
11: #define WF05 "WF05 "
12: #define WF06 "WF06 "
13: #define WF07 "WF07 "
14: #else
15: #define WF01 "WF01 -- found id beyond file limit\n%lo\t%d\t%d\n",id,i,sp->numbfile
16: #define WF02 "WF02 -- fail to build file name for creation\n%s%d\n",sp->head_name,i
17: #define WF03 "WF03 -- fail to create file\n%s\n",file_name
18: #define WF04 "WF04 -- fail to build file name for opening\n%s%d\n",sp->head_name,i
19: #define WF05 "WF05 -- fail to open file\n%s\n",file_name
20: #define WF06 "WF06 -- fail to position file\n%d\n",fd
21: #define WF07 "WF07 -- fail to write\n%d\n",fd
22: #endif
23:
24: extern struct LIBFILE *Glib_file ;
25: extern char *BUILDNAME() ;
26: extern FATAL() ;
27: extern FREE() ;
28:
29: int /* SUCCESS or ERROR */
30: writeframe(sp,frame)
31: register struct SPACE *sp ;
32: int frame;
33: {
34: long offset ;
35: register long floor ;
36: register struct MANAGER *manager ;
37: register int i ;
38: int bytewt ;
39: ITEMID id ;
40: register FD fd ;
41: char *file_name ;
42:
43: manager = (sp->environ)->manp ;
44: id = manager[frame].page_id ;
45:
46: for(floor=i=0; id >= (floor += sp->fileinfo[i].leng); )
47: if(++i == sp->numbfile)
48: ERR_RET(WF01,ERROR)
49: offset = id - (floor - sp->fileinfo[i].leng) ;
50:
51: switch(sp->fileinfo[i].desc)
52: {
53: case NOTMADE:
54: if( (file_name = MBUILDNAME(sp->head_name,i)) == NULL )
55: ERR_RET(WF02,ERROR)
56: if(MCREATE(file_name,sp->mode) == ERROR)
57: ERR_RET(WF03,ERROR)
58: FREE(file_name) ;
59:
60: case CLOSED:
61: if( (file_name = MBUILDNAME(sp->head_name,i)) == NULL )
62: ERR_RET(WF04,ERROR)
63: if( (fd = sp->fileinfo[i].desc = MOPEN(file_name,sp->perms)) == ERROR )
64: ERR_RET(WF05,ERROR)
65: FREE(file_name) ;
66: break ;
67:
68: default:
69: fd = sp->fileinfo[i].desc ;
70: break ;
71: }
72: if(MSEEK(fd,offset) == ERROR)
73: ERR_RET(WF06,ERROR)
74:
75: if(sp->maxpage-id < sp->environ->frame_size)
76: bytewt = sp->maxpage-id ;
77: else
78: bytewt = sp->environ->frame_size ;
79:
80: if(MWRITE(fd,manager[frame].frame_pntr,bytewt) == ERROR )
81: ERR_RET(WF07,ERROR)
82: manager[frame].ref_chng = RNLY ;
83: (sp->environ)->stats.writes++ ;
84:
85: return(SUCCESS) ;
86: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.