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

📄 update_bytes.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef SunB1static	char		mls_sccsid[] = "@(#)update_bytes.c 1.1 92/07/30 SMI; SunOS MLS";#elsestatic	char		sccsid[] = "@(#)update_bytes.c 1.1 92/07/30 SMI";#endif /* SunB1 */#endif lint/* *	Copyright (c) 1989 Sun Microsystems, Inc. *//* *	Name:		update_bytes() * *	Description:	Update the bytes available field associated with *		the partition 'disk_name'.  'size' is decremented from *		the available bytes field.  If there is insufficient space *		in that partition, then space is taken from the free hog. *		If there is no space left in the free hog or the requested *		partition is the free hog, then 0 is returned.  If space *		is available, then 1 is returned.  If 'size' is a negative *		number, then the space available is incremented.  Returns *		-1 if an error occurs. */#include <string.h>#include "install.h"#include "menu.h"extern	char *		sprintf();intupdate_bytes(disk_name, size)	char *		disk_name;	long		size;{	disk_info	disk;			/* disk information */	disk_info *	disk_p = &disk;		/* needed for macros */	part_info *	hog_p;			/* ptr to free hog partition */	long		need_blocks;		/* number of blocks needed */	long		need_bytes;		/* number of bytes needed */	char		part;			/* target partition */	part_info *	part_p;			/* ptr to target partition */	char		pathname[MAXPATHLEN];	/* pathname buffer */	int		ret_code;		/* return code */	int		i,j;			/* indexes */	char		preserved_part[TINY_STR]; /* preserved partition */	bzero(disk_p->disk_name, sizeof(disk_p->disk_name));	(void) strncpy(disk_p->disk_name, disk_name, strlen(disk_name) - 1);	(void) sprintf(pathname, "%s.%s", DISK_INFO, disk_p->disk_name);	ret_code = read_disk_info(pathname, disk_p);	/*	 *      Only a return of 1 is okay here.  This file is not optional.	 *	read_disk_info() prints the error message for ret_code == -1	 *	so we have to print one for ret_code == 0.	 */	if (ret_code != 1) {		if (ret_code == 0)			menu_log("%s: cannot read file.", pathname);		return(-1);	}	if (get_disk_config(disk_p) != 1)		return(-1);	/*	 *	Set up all the shorthand pointers.	 */	hog_p = &disk_p->partitions[disk_p->free_hog - 'a'];	part = disk_name[strlen(disk_name) - 1];	part_p = &disk_p->partitions[part - 'a'];	/*	 *	This is the FREE HOG partitition	 */	if (part == disk_p->free_hog) {		if (size > hog_p->avail_bytes) {			menu_mesg("Not enough space in free hog partition.");			return(0);		}		part_p->avail_bytes -= size;	}	/*	 *	Partition has enough space	 */	else if (size <= part_p->avail_bytes) {		part_p->avail_bytes -= size;	}	/*	 *	Partition needs space from the FREE HOG	 */	else {		/*		 *	If we are not on the miniroot or if we are supposed		 *      to use the existing partition table or if the free		 *	hog is preserved or if the partition is preserved,		 *	then we cannot allow changes.		 */		if (!is_miniroot() || disk_p->label_source == DKL_EXISTING ) {			menu_mesg("Not enough space in %s.", disk_name);			return(0);		}		if ( hog_p->preserve_flag == 'y' ) {			menu_mesg("Not enough space in %s.  Can't use a preserved free hog.", disk_name);			return(0);		}		if (part_p->preserve_flag == 'y') {			menu_mesg("Not enough space in %s.  Can't modify a preserved partition.", disk_name);			return(0);		}		/*		 * Can't use the free hog if there is a preserved partition		 * between the partion in question and the free hog		 */		i = disk_name[strlen(disk_name) - 1] - 'a';		j = disk_p->free_hog - 'a';		if ( i > j) {			i = j;			j = disk_name[strlen(disk_name) - 1] - 'a';		}		for ( ; i < j ; i++) {			if (disk_p->partitions[i].preserve_flag != 'y')				continue;			strcpy(preserved_part,disk_name);			preserved_part[strlen(preserved_part) -1] = 'a' + i;			menu_mesg("Not enough space in %s.  Can't use freehog because %s is preserved", disk_name, preserved_part);			return(0);		}		/*		 *	Calculate the number of bytes needed and round up to		 *	the next block boundary.		 */		need_bytes = size - part_p->avail_bytes;		need_blocks = bytes_to_blocks(need_bytes, disk_p->geom_buf);		need_bytes = blocks_to_bytes(need_blocks);		/*		 *	Not enough space		 */		if (need_bytes > hog_p->avail_bytes) {			menu_mesg("Not enough space in free hog partition.");			return(0);		}		/*		 *	Update the FREE HOG partition		 */		map_blk(disk_p->free_hog) -= need_blocks;		hog_p->avail_bytes -= need_bytes;		/*		 *	If we have zeroed out the free hog,		 *	then there is no need for the mount point.		 */		if (map_blk(disk_p->free_hog) == 0)			hog_p->mount_pt[0] = NULL;		/*		 *	Update the target partition with the needed space		 */		map_blk(part) += need_blocks;		part_p->avail_bytes += need_bytes;		/*		 *	Now grab the space		 */		part_p->avail_bytes -= size;		update_parts(disk_p);	}	if (save_disk_info(pathname, disk_p) != 1)		return(-1);	(void) sprintf(pathname, "%s.%s", CMDFILE, disk_p->disk_name);	if (save_cmdfile(pathname, disk_p) != 1)		return(-1);	return(1);} /* end update_bytes() */

⌨️ 快捷键说明

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