⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 save.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
字号:
/* save (III)   J. Gillogly * save user core image for restarting * usage: save(<command file (argv[0] from main)>,<output file>) * bugs *   -  impure code (i.e. changes in instructions) is not handled *      (but people that do that get what they deserve) */static char sccsid[] = "	save.c	4.1	82/05/11	";#include <a.out.h>int filesize;                    /* accessible to caller         */char *sbrk();save(cmdfile,outfile)                   /* save core image              */char *cmdfile,*outfile;{       register char *c;	register int i,fd;	int fdaout;	struct exec header;	int counter;	char buff[512],pwbuf[120];	fdaout=getcmd(cmdfile);         /* open command wherever it is  */	if (fdaout<0) return(-1);       /* can do nothing without text  */	if ((fd=open(outfile,0))>0)     /* this restriction is so that  */	{       printf("Can't use an existing file\n"); /* we don't try */		close(fd);              /* to write over the commnd file*/		return(-1);	}	if ((fd=creat(outfile,0755))== -1)	{       printf("Cannot create %s\n",outfile);		return(-1);	}	/* can get the text segment from the command that we were	 * called with, and change all data from uninitialized to	 * initialized.  It will start at the top again, so the user	 * is responsible for checking whether it was restarted	 * could ignore sbrks and breaks for the first pass	 */	read(fdaout,&header,sizeof header);/* get the header       */	header.a_bss = 0;                  /* no data uninitialized        */	header.a_syms = 0;                 /* throw away symbol table      */	switch (header.a_magic)            /* find data segment            */	{   case 0407:                     /* non sharable code            */		c = (char *) header.a_text;/* data starts right after text */		header.a_data=sbrk(0)-c;   /* current size (incl allocs)   */		break;	    case 0410:                     /* sharable code                */		c = (char *)#ifdef pdp11		    (header.a_text	   /* starts after text            */		    & 0160000)             /* on an 8K boundary            */		    +  020000;             /* i.e. the next one up         */#endif#ifdef vax		    (header.a_text	   /* starts after text            */		    & 037777776000)        /* on an 1K boundary            */		    +        02000;        /* i.e. the next one up         */#endif#ifdef z8000		    (header.a_text	   /* starts after text            */		    & 0174000)             /* on an 2K boundary            */		    +  004000;             /* i.e. the next one up         */#endif		header.a_data=sbrk(0)-c;   /* current size (incl allocs)   */		break;	    case 0411:                     /* sharable with split i/d      */		c = 0;                     /* can't reach text             */		header.a_data=(int)sbrk(0);/* current size (incl allocs)   */		break;	    case 0413:		c = (char *) header.a_text;/* starts after text            */		lseek(fdaout, 1024L, 0);   /* skip unused part of 1st block*/	}	if (header.a_data<0)               /* data area very big           */		return(-1);                /* fail for now                 */	filesize=sizeof header+header.a_text+header.a_data;	write(fd,&header,sizeof header);   /* make the new header          */	if (header.a_magic==0413)		lseek(fd, 1024L, 0);       /* Start on 1K boundary	   */	counter=header.a_text;             /* size of text                 */	while (counter>512)                /* copy 512-byte blocks         */	{       read(fdaout,buff,512);     /* as long as possible          */		write(fd,buff,512);		counter -= 512;	}	read(fdaout,buff,counter);         /* then pick up the rest        */	write(fd,buff,counter);	write(fd,c,header.a_data);         /* write all data in 1 glob     */	close(fd);}#define	NULL	0char	*execat(), *getenv();getcmd(command)         /* get command name (wherever it is) like shell */char *command;{	char *pathstr;	register char *cp;	char fname[128];	int fd;	if ((pathstr = getenv("PATH")) == NULL)		pathstr = ":/bin:/usr/bin";	cp = index(command, '/')? "": pathstr;	do {		cp = execat(cp, command, fname);		if ((fd=open(fname,0))>0)			return(fd);	} while (cp);	printf("Couldn't open %s\n",command);	return(-1);}static char *execat(s1, s2, si)register char *s1, *s2;char *si;{	register char *s;	s = si;	while (*s1 && *s1 != ':' && *s1 != '-')		*s++ = *s1++;	if (si != s)		*s++ = '/';	while (*s2)		*s++ = *s2++;	*s = '\0';	return(*s1? ++s1: 0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -