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

📄 sys_info.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
字号:
#ifndef lint#ifdef SunB1static  char    sccsid[] = 	"@(#)sys_info.c 1.1 92/07/30 SMI; SunOS MLS";#elsestatic  char    sccsid[] = 	"@(#)sys_info.c 1.1 92/07/30 SMI";#endif /* SunB1 */#endif lint/* *	Copyright (c) 1989 Sun Microsystems, Inc. *//* *	Name:		sys_info.c * *	Description:	This file contains the routines necessary for *		interfacing with the 'sys_info' structure file.  The *		layout of a 'sys_info' file is as follows (order is no *		longer important): * *			hostname=	(comma-separated list of hostnames) *			ether_name=	(comma-separated list of ethernet *						 interface names) *			ip=		(comma-separated list of internet *						 addresses) *			hostname0=	(only for backward compatibility) *					( replaced by hostname= above ) *			hostname1=	(		"		) *			sys_type= *			ether_name0=	(		"		) *			ether_name1=	(		"		) *			ip0=		(		"		) *			ip0_minlab= (SunB1) *			ip0_maxlab= (SunB1) *			ip1=		(		"		) *			ip1_minlab= (SunB1) *			ip1_maxlab= (SunB1) *			yp_type= *			domainname= *			op_type= *			reboot= *			rewind= *			arch_str= *			root= *			user= *			termtype= *			timezone= *			server= *			server_ip= *			exec_path= *			kvm_path= */#include <stdio.h>#include <string.h>#include "install.h"#include "menu.h"/* *	Local functions: */static	char *	out_std();static	char *	cv_op_to_str();static	int	cv_str_to_op();static	int	cv_str_to_sys();static	char *	cv_sys_to_str();static	int	inp_hostname();static	int	inp_ethername();static	int	inp_ip();static	char	*out_hostname();static	char	*out_ethername();static	char	*out_ip();static	struct key_xlat_t	*lookup();/* *	Local variables: */static	sys_info	sys;			/* local copy of sys_info *//* *	Key translation table: *//* * The meaning of this table has been modified slightly because of the * structure change of sys_info required by multiple ethernet requirements. * The first field is the keyword name appearing to the left of the equal * sign in the sys_info file.  The next field is the input handling routine, * called when reading the sys_info file -- if this is 0, data is copied as * characters to the data_p field (the last field).  The third field is the * output handling routine which returns a string to be inserted after the * "=" in the output sys_info file.  If this field is zero, nothing is * written (indicates backward compatibility keywords -- can be read, but * the save routine does not write it out. */static	key_xlat	key_list[] = {	{ "hostname",	inp_hostname,	out_hostname,	(char*) sys.ethers },	{ "sys_type",	cv_str_to_sys,	cv_sys_to_str,	(char *)&sys.sys_type},	{ "ether_name",	inp_ethername,	out_ethername,	(char *) sys.ethers },	{ "ip",		inp_ip,		out_ip,		(char *) sys.ethers },	{ "hostname0",	0,		0,		sys.hostname0 },	{ "hostname1",	0,		0,		sys.hostname1 },	{ "ether_name0",	0,	0,		sys.ether_name0 },	{ "ether_name1",	0,	0,		sys.ether_name1 },	{ "ip0",	0,		0,		sys.ip0 },	{ "ip1",	0,		0,		sys.ip1 },#ifdef SunB1	{ "ip0_minlab",	cv_str_to_lab, cv_lab_to_str,(char *)&sys.ip0_minlab },	{ "ip0_maxlab",	cv_str_to_lab, cv_lab_to_str,(char *)&sys.ip0_maxlab },	{ "ip1_minlab",	cv_str_to_lab, cv_lab_to_str,(char *)&sys.ip1_minlab },	{ "ip1_maxlab",	cv_str_to_lab, cv_lab_to_str,(char *)&sys.ip1_maxlab },#endif /* SunB1 */	{ "yp_type",	cv_str_to_yp,	cv_yp_to_str,	(char *)&sys.yp_type },	{ "domainname",	0,		out_std,	sys.domainname },	{ "op_type",	cv_str_to_op,	cv_op_to_str,	(char *)&sys.op_type },	{ "reboot",	cv_str_to_ans,	cv_ans_to_str,	(char *) &sys.reboot },	{ "rewind",	cv_str_to_ans,	cv_ans_to_str,	(char *) &sys.rewind },	{ "arch_str",	0,		out_std,	sys.arch_str },	{ "root",	0,		out_std,	sys.root },	{ "user",	0,		out_std,	sys.user },	{ "termtype",	0,		out_std,	sys.termtype },	{ "timezone",	0,		out_std,	sys.timezone },	{ "server",	0,		out_std,	sys.server },	{ "server_ip",	0,		out_std,	sys.server_ip },	{ "exec_path",	0,		out_std,	sys.exec_path },	{ "kvm_path",	0,		out_std,	sys.kvm_path },	{ "static_sizing", cv_str_to_ans, cv_ans_to_str, (char *) &sys.static_sizing},	{ NULL }};static struct key_xlat_t *lookup(p)	char *p;{	struct key_xlat_t *sysx;	for (sysx = key_list; sysx->key_name != 0; sysx++)		if (strcmp(sysx->key_name, p) == 0)			return sysx;	return 0;}/* *	Name:		read_sys_info() * *	Description:	Read system information from 'name' into 'sys_p'. *		Returns 1 if the file was saved successfully, and -1 if *		there was an error. */intread_sys_info(name, sys_p)	char *		name;	sys_info *	sys_p;{	char		buf[BUFSIZ];		/* buffer for I/O */	FILE *		fp;			/* file pointer for name */	struct key_xlat_t *sysx;	/*	 *	Always zero out the information buffer.	 */	bzero((char *) sys_p, sizeof(*sys_p));	fp = fopen(name, "r");	if (fp == NULL)		return(0);	bzero((char *) &sys, sizeof(sys));	bzero(buf, sizeof(buf));	while (fgets(buf, sizeof(buf), fp) != NULL) {		char *cp;		char *cp1;		if ((cp = strchr(buf, '=')) == 0)			continue;		*cp++ = 0;		if ((cp1 = strchr(cp,'\n'))  != 0) {			*cp1 = 0;		}		if ((sysx = lookup(buf)) != 0) {			if (sysx->key_func == 0) {				(void) strcpy(sysx->data_p, cp);			} else {				(*sysx->key_func)(cp, sysx->data_p);			}		}	}				*sys_p = sys;				/* copy valid sys_info */	(void) fclose(fp);	return(1);} /* end read_sys_info() *//* *	Name:		save_sys_info() * *	Description:	Save system information pointed to by 'sys_p' *		into 'name'. * *		Returns 1 if the file was saved successfully, and -1 if *		there was an error. */intsave_sys_info(name, sys_p)	char *		name;	sys_info *	sys_p;{	FILE *		fp;			/* file pointer for name */	struct key_xlat_t *sysx;	sys = *sys_p;				/* copy valid sys_info */	fp = fopen(name, "w");	if (fp == NULL) {		menu_log("%s: %s: cannot open file for writing.", progname,			 name);		return(-1);	}	for (sysx = key_list; sysx->key_name != 0; sysx++) {		if (sysx->code_func != 0) {			(void) fprintf(fp, "%s=%s\n", sysx->key_name, (sysx->code_func)(sysx->data_p));		}	}	(void) fclose(fp);	return(1);} /* end save_sys_info() */static char*out_std(p)	char *p;{	return p;}static intinp_hostname(name, e)	char *name;	struct ether_interface *e;{	int i = 0;	while (name != 0 && i < MAX_ETHER_INTERFACES) {		char *p = strchr(name,',');		char *newname = 0;		if (p != 0) {			*p = 0;			newname = p+1;		}		(void) strcpy(e->hostname,name);		name = newname;		i++;		e++;	}	return 1;}		static intinp_ethername(name, e)	char *name;	struct ether_interface *e;{	int i = 0;	while (name != 0 && i < MAX_ETHER_INTERFACES) {		char *p = strchr(name,',');		char *newname = 0;		if (p != 0) {			*p = 0;			newname = p+1;		}		(void) strcpy(e->interface_name,name);		name = newname;		i++;		e++;	}	return 1;}static intinp_ip(name, e)	char *name;	struct ether_interface *e;{	int i = 0;	while (name != 0 && i < MAX_ETHER_INTERFACES) {		char *p = strchr(name,',');		char *newname = 0;		if (p != 0) {			*p = 0;			newname = p+1;		}		(void) strcpy(e->internet_addr,name);		name = newname;		i++;		e++;	}	return 1;}static char buff[BUFSIZ];static char *out_hostname(e)	struct ether_interface *e;{	char *cp = buff;	int nbr_nulls = 0;	int i;	*cp = 0;	for (i = 0; i < MAX_ETHER_INTERFACES; i++, e++) {		if (*e->hostname != 0) {			while (nbr_nulls > 0) {				*cp++ = ',';				nbr_nulls--;			}			(void) strcpy(cp, e->hostname);			cp += strlen(cp);		}		nbr_nulls++;	}	return buff;}static char *out_ethername(e)	struct ether_interface *e;{	char *cp = buff;	int nbr_nulls = 0;	int i;	*cp = 0;	for (i = 0; i < MAX_ETHER_INTERFACES; i++, e++) {		if (*e->interface_name != 0) {			while (nbr_nulls > 0) {				*cp++ = ',';				nbr_nulls--;			}			(void) strcpy(cp, e->interface_name);			cp += strlen(cp);		}		nbr_nulls++;	}	return buff;}static char *out_ip(e)	struct ether_interface *e;{	char *cp = buff;	int nbr_nulls = 0;	int i;	*cp = 0;	for (i = 0; i < MAX_ETHER_INTERFACES; i++, e++) {		if (*e->internet_addr != 0) {			while (nbr_nulls > 0) {				*cp++ = ',';				nbr_nulls--;			}			(void) strcpy(cp, e->internet_addr);			cp += strlen(cp);		}		nbr_nulls++;	}	return buff;}static	conv		op_list[] = {	"install",	OP_INSTALL,	"upgrade",	OP_UPGRADE,	(char *) 0,	0};/* *	Name:		cv_op_to_str() * *	Description:	Convert an operation code into a string.  If the *		operation code cannot be converted, then NULL is returned. */static char *cv_op_to_str(op_p)	int *		op_p;{	conv *		cv;			/* conversion pointer */	for (cv = op_list; cv->conv_text; cv++)		if (cv->conv_value == *op_p)			return(cv->conv_text);	return("");} /* end cv_op_to_str() *//* *	Name:		cv_str_to_op() * *	Description:	Convert a string into an operation code.  If the *		string cannot be converted, then 0 is returned. */static intcv_str_to_op(str, data_p)	char *		str;	int *		data_p;{	conv *		cv;			/* conversion pointer */	for (cv = op_list; cv->conv_text; cv++)		if (strcmp(cv->conv_text, str) == 0) {			*data_p = cv->conv_value;			return(1);		}	*data_p = 0;	return(0);} /* end cv_str_to_op() */static	conv		sys_list[] = {	"standalone",	SYS_STANDALONE,	"server",	SYS_SERVER,	"dataless",	SYS_DATALESS,	(char *) 0,	0};/* *	Name:		cv_sys_to_str() * *	Description:	Convert a system type into a string.  If the system *		type cannot be converted, then NULL is returned. */static char *cv_sys_to_str(sys_p)	int *		sys_p;{	conv *		cv;			/* conversion pointer */	for (cv = sys_list; cv->conv_text; cv++)		if (cv->conv_value == *sys_p)			return(cv->conv_text);	return("");} /* end cv_sys_to_str() *//* *	Name:		cv_str_to_sys() * *	Description:	Convert a string into a system type.  If the string *		cannot be converted, then 0 is returned. */static intcv_str_to_sys(str, data_p)	char *		str;	int *		data_p;{	conv *		cv;			/* conversion pointer */	for (cv = sys_list; cv->conv_text; cv++)		if (strcmp(cv->conv_text, str) == 0) {			*data_p = cv->conv_value;			return(1);		}	*data_p = 0;	return(0);} /* end cv_str_to_sys() *//* *	Name:		read_sys_release() * *	Description:	Read the system RELEASE file and put it into buffer. * *	Return Value: 	0 : if the reads went ok *			-1: if the reads failed */intread_sys_release(buffer)	char *		buffer;		/* buffer to store realease in */{	FILE *	fp;			/* scratch file pointer */	if ((fp = fopen(RELEASE, "r")) == (FILE *)NULL) {		menu_mesg("%s: failed to open %s", progname, RELEASE);		return(-1);	}		if (fgets(buffer, MEDIUM_STR, fp ) == (char *)NULL) {		menu_mesg("%s: failed to read release from %s", progname,			  RELEASE);		(void) fclose(fp);		return(-1);	}		/*	 *	Strip the newline off the end of the string	 */	buffer[strlen(buffer) - 1] = '\0';	(void) fclose(fp);	return(0);} /* end read_sys_release() */

⌨️ 快捷键说明

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