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

📄 savecore.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
	char *rawp, path[MAXPATHLEN];	/*	 * Get the current number and update the bounds file.  Do the update	 * now, because may fail later and don't want to overwrite anything.	 */	(void)snprintf(path, sizeof(path), "%s/bounds", dirname);	if ((fp = fopen(path, "r")) == NULL)		goto err1;	if (fgets(buf, sizeof(buf), fp) == NULL) {		if (ferror(fp))err1:			syslog(LOG_WARNING, "%s: %s", path, strerror(errno));		bounds = 0;	} else		bounds = atoi(buf);	if (fp != NULL)		(void)fclose(fp);	if ((fp = fopen(path, "w")) == NULL)		syslog(LOG_ERR, "%s: %m", path);	else {		(void)fprintf(fp, "%d\n", bounds + 1);		(void)fclose(fp);	}	(void)fclose(fp);	/* Create the core file. */	(void)snprintf(path, sizeof(path), "%s/vmcore.%d%s",	    dirname, bounds, compress ? ".Z" : "");	if (compress) {		if ((fp = zopen(path, "w", 0)) == NULL) {			syslog(LOG_ERR, "%s: %s", path, strerror(errno));			exit(1);		}	} else		ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);	/* Open the raw device. */	rawp = rawname(ddname);	if ((ifd = open(rawp, O_RDONLY)) == -1) {		syslog(LOG_WARNING, "%s: %m; using block device", rawp);		ifd = dumpfd;	}	/* Read the dump size. */	Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_DUMPSIZE].n_value)), L_SET);	(void)Read(dumpfd, &dumpsize, sizeof(dumpsize));	/* Seek to the start of the core. */	Lseek(ifd, (off_t)dumplo, L_SET);	/* Copy the core file. */	dumpsize *= NBPG;	syslog(LOG_NOTICE, "writing %score to %s",	    compress ? "compressed " : "", path);	for (; dumpsize > 0; dumpsize -= nr) {		(void)printf("%6dK\r", dumpsize / 1024);		(void)fflush(stdout);		nr = read(ifd, buf, MIN(dumpsize, sizeof(buf)));		if (nr <= 0) {			if (nr == 0)				syslog(LOG_WARNING,				    "WARNING: EOF on dump device");			else				syslog(LOG_ERR, "%s: %m", rawp);			goto err2;		}		if (compress)			nw = fwrite(buf, 1, nr, fp);		else			nw = write(ofd, buf, nr);		if (nw != nr) {			syslog(LOG_ERR, "%s: %s",			    path, strerror(nw == 0 ? EIO : errno));err2:			syslog(LOG_WARNING,			    "WARNING: vmcore may be incomplete");			(void)printf("\n");			exit(1);		}	}	(void)printf("\n");	(void)close(ifd);	if (compress)		(void)fclose(fp);	else 		(void)close(ofd);	/* Copy the kernel. */	ifd = Open(vmunix ? vmunix : _PATH_UNIX, O_RDONLY);	(void)snprintf(path, sizeof(path), "%s/vmunix.%d%s",	    dirname, bounds, compress ? ".Z" : "");	if (compress) {		if ((fp = zopen(path, "w", 0)) == NULL) {			syslog(LOG_ERR, "%s: %s", path, strerror(errno));			exit(1);		}	} else		ofd = Create(path, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);	syslog(LOG_NOTICE, "writing %skernel to %s",	    compress ? "compressed " : "", path);	while ((nr = read(ifd, buf, sizeof(buf))) > 0) {		if (compress)			nw = fwrite(buf, 1, nr, fp);		else			nw = write(ofd, buf, nr);		if (nw != nr) {			syslog(LOG_ERR, "%s: %s",			    path, strerror(nw == 0 ? EIO : errno));			syslog(LOG_WARNING,			    "WARNING: vmunix may be incomplete");			exit(1);		}	}	if (nr < 0) {		syslog(LOG_ERR, "%s: %s",		    vmunix ? vmunix : _PATH_UNIX, strerror(errno));		syslog(LOG_WARNING,		    "WARNING: vmunix may be incomplete");		exit(1);	}	if (compress)		(void)fclose(fp);	else		(void)close(ofd);}char *find_dev(dev, type)	register dev_t dev;	register int type;{	register DIR *dfd;	struct dirent *dir;	struct stat sb;	char *dp, devname[MAXPATHLEN + 1];	if ((dfd = opendir(_PATH_DEV)) == NULL) {		syslog(LOG_ERR, "%s: %s", _PATH_DEV, strerror(errno));		exit(1);	}	(void)strcpy(devname, _PATH_DEV);	while ((dir = readdir(dfd))) {		(void)strcpy(devname + sizeof(_PATH_DEV) - 1, dir->d_name);		if (lstat(devname, &sb)) {			syslog(LOG_ERR, "%s: %s", devname, strerror(errno));			continue;		}		if ((sb.st_mode & S_IFMT) != type)			continue;		if (dev == sb.st_rdev) {			closedir(dfd);			if ((dp = strdup(devname)) == NULL) {				syslog(LOG_ERR, "%s", strerror(errno));				exit(1);			}			return (dp);		}	}	closedir(dfd);	syslog(LOG_ERR, "can't find device %d/%d", major(dev), minor(dev));	exit(1);}char *rawname(s)	char *s;{	char *sl, name[MAXPATHLEN];	if ((sl = rindex(s, '/')) == NULL || sl[1] == '0') {		syslog(LOG_ERR,		    "can't make raw dump device name from %s", s);		return (s);	}	(void)snprintf(name, sizeof(name), "%.*s/r%s", sl - s, s, sl + 1);	if ((sl = strdup(name)) == NULL) {		syslog(LOG_ERR, "%s", strerror(errno));		exit(1);	}	return (sl);}intget_crashtime(){	time_t dumptime;			/* Time the dump was taken. */	Lseek(dumpfd, (off_t)(dumplo + ok(dump_nl[X_TIME].n_value)), L_SET);	(void)Read(dumpfd, &dumptime, sizeof(dumptime));	if (dumptime == 0) {		if (verbose)			syslog(LOG_ERR, "dump time is zero");		return (0);	}	(void)printf("savecore: system went down at %s", ctime(&dumptime));#define	LEEWAY	(7 * SECSPERDAY)	if (dumptime < now - LEEWAY || dumptime > now + LEEWAY) {		(void)printf("dump time is unreasonable\n");		return (0);	}	return (1);}intcheck_space(){	register FILE *fp;	char *tvmunix;	off_t minfree, spacefree, vmunixsize, needed;	struct stat st;	struct statfs fsbuf;	char buf[100], path[MAXPATHLEN];	tvmunix = vmunix ? vmunix : _PATH_UNIX;	if (stat(tvmunix, &st) < 0) {		syslog(LOG_ERR, "%s: %m", tvmunix);		exit(1);	}	vmunixsize = st.st_blocks * S_BLKSIZE;	if (statfs(dirname, &fsbuf) < 0) {		syslog(LOG_ERR, "%s: %m", dirname);		exit(1);	} 	spacefree = (fsbuf.f_bavail * fsbuf.f_bsize) / 1024;	(void)snprintf(path, sizeof(path), "%s/minfree", dirname);	if ((fp = fopen(path, "r")) == NULL)		minfree = 0;	else {		if (fgets(buf, sizeof(buf), fp) == NULL)			minfree = 0;		else			minfree = atoi(buf);		(void)fclose(fp);	}	needed = (dumpsize + vmunixsize) / 1024; 	if (minfree > 0 && spacefree - needed < minfree) {		syslog(LOG_WARNING,		    "no dump, not enough free space on device");		return (0);	}	if (spacefree - needed < minfree)		syslog(LOG_WARNING,		    "dump performed, but free space threshold crossed");	return (1);}intOpen(name, rw)	char *name;	int rw;{	int fd;	if ((fd = open(name, rw, 0)) < 0) {		syslog(LOG_ERR, "%s: %m", name);		exit(1);	}	return (fd);}intRead(fd, bp, size)	int fd, size;	void *bp;{	int nr;	nr = read(fd, bp, size);	if (nr != size) {		syslog(LOG_ERR, "read: %m");		exit(1);	}	return (nr);}voidLseek(fd, off, flag)	int fd, flag;	off_t off;{	off_t ret;	ret = lseek(fd, off, flag);	if (ret == -1) {		syslog(LOG_ERR, "lseek: %m");		exit(1);	}}intCreate(file, mode)	char *file;	int mode;{	register int fd;	fd = creat(file, mode);	if (fd < 0) {		syslog(LOG_ERR, "%s: %m", file);		exit(1);	}	return (fd);}voidWrite(fd, bp, size)	int fd, size;	void *bp;{	int n;	if ((n = write(fd, bp, size)) < size) {		syslog(LOG_ERR, "write: %s", strerror(n == -1 ? errno : EIO));		exit(1);	}}voidusage(){	(void)syslog(LOG_ERR, "usage: savecore [-cfvz] [-N system] directory");	exit(1);}

⌨️ 快捷键说明

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