File:  [Research Unix] / researchv9 / jerq / sgs / libsdp / writeframe.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:22:00 2018 UTC (8 years, 3 months ago) by root
Branches: belllabs, MAIN
CVS tags: researchv9-SUN3_old, researchv9-SUN3, HEAD
researchv9-SUN3(old)

static char ID[] = "@(#) writeframe.c: 1.1 3/16/82";
#include <stdio.h>
#include "sdp.h"
#include "define3.h"

#ifdef SHORT
#define WF01	"WF01 "
#define WF02	"WF02 "
#define WF03	"WF03 "
#define WF04	"WF04 "
#define WF05	"WF05 "
#define WF06	"WF06 "
#define WF07	"WF07 "
#else
#define WF01	"WF01 -- found id beyond file limit\n%lo\t%d\t%d\n",id,i,sp->numbfile
#define WF02	"WF02 -- fail to build file name for creation\n%s%d\n",sp->head_name,i
#define WF03	"WF03 -- fail to create file\n%s\n",file_name
#define WF04	"WF04 -- fail to build file name for opening\n%s%d\n",sp->head_name,i
#define WF05	"WF05 -- fail to open file\n%s\n",file_name
#define WF06	"WF06 -- fail to position file\n%d\n",fd
#define WF07	"WF07 -- fail to write\n%d\n",fd
#endif

extern struct LIBFILE *Glib_file ;
extern char *BUILDNAME() ;
extern FATAL() ;
extern FREE() ;

int					/* SUCCESS or ERROR */
writeframe(sp,frame)
register struct SPACE	*sp ;
int			frame;
{
	long			offset ;
	register long		floor ;
	register struct MANAGER *manager ;
	register int		i ;
	int			bytewt ;
	ITEMID			id ;
	register FD		fd ;
	char			*file_name ;

	manager = (sp->environ)->manp ;
	id = manager[frame].page_id ;

	for(floor=i=0; id >= (floor += sp->fileinfo[i].leng); )
		if(++i == sp->numbfile)
			ERR_RET(WF01,ERROR)
	offset = id - (floor - sp->fileinfo[i].leng) ;

	switch(sp->fileinfo[i].desc)
	{
		case NOTMADE:
			if( (file_name = MBUILDNAME(sp->head_name,i)) == NULL )
				ERR_RET(WF02,ERROR)
			if(MCREATE(file_name,sp->mode) == ERROR)
				ERR_RET(WF03,ERROR)
			FREE(file_name) ;

		case CLOSED:
			if( (file_name = MBUILDNAME(sp->head_name,i)) == NULL )
				ERR_RET(WF04,ERROR)
			if( (fd = sp->fileinfo[i].desc = MOPEN(file_name,sp->perms)) == ERROR )
				ERR_RET(WF05,ERROR)
			FREE(file_name) ;
			break ;

		default:
			fd = sp->fileinfo[i].desc ;
			break ;
	}
	if(MSEEK(fd,offset) == ERROR)
		ERR_RET(WF06,ERROR)

	if(sp->maxpage-id < sp->environ->frame_size)
		bytewt = sp->maxpage-id ;
	else
		bytewt = sp->environ->frame_size ;

	if(MWRITE(fd,manager[frame].frame_pntr,bytewt) == ERROR )
		ERR_RET(WF07,ERROR)
	manager[frame].ref_chng = RNLY ;
	(sp->environ)->stats.writes++ ;

	return(SUCCESS) ;
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.