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

📄 adv.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	if ((clist = (char **)malloc(NUM_MACHS * sizeof(char *))) == NULL) {		fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd);		exit(1);	}	/*	 *	If the alias table exists, replace names defined 	 *	as aliases, or else assume the names to be	 *	valid client names and form a client list.	 */	while ((clname = clients[index]) != NULL) {		if (*clname == '\0' || verify(clname)) {			clients[index++][0] = '\0';			continue;		}		if (aflag && isalias(clname,altptr)) {			old_pos = pos;			search_atbl(clname,aliases);			if (old_pos == pos)				clients[index][0] = '\0';		} else {			if (!invalid(clname) && !in_clist(clname))				add_client(clname);			else				clients[index][0] = '\0';		}		index++;	}	if (pos == (low_index + NUM_MACHS))		alloc_mem();	clist[pos] = NULL;}staticisalias(name,altbl)char	*name;struct	altab	*altbl;{	register int i;	for (i = 0; i < aliases; i++) {		if (strcmp(name,altbl->alname) == SAME)			return(1);		altbl++;	}	return(0);}staticsearch_atbl(name,index)char	*name;int	index;{	register int i, level;	register char *list, *curr_pos;	char	*realloc();	char	buffer[SZ_CLIENT + 1];	struct	altab	*altbl;	/*	 *	Search the alias table to determine if "name" is an	 *	alias. If it is an alias obtain its corresponding	 *	list of names, and determine if they are aliases by	 *	searching preceding entries in the alias table. This	 *	is done to eliminate loops. When "name" is no longer	 * 	an alias copy it into the client list.			 */	altbl = altptr;	level = 0;	for (i = 0; i < index; i++) {		if (strcmp(name,altbl->alname) == SAME) {			list = altbl->alist;			curr_pos = strpbrk(list," \t");			while (curr_pos != NULL) {				if (curr_pos-list <= SZ_CLIENT) {					strncpy(buffer,list,curr_pos-list);					buffer[curr_pos-list] = '\0';					search_atbl(buffer,level);				} else {					*curr_pos = '\0';					fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,list,SZ_CLIENT);					*curr_pos = ' ';				}				list = curr_pos + strspn(curr_pos," \t");				curr_pos = strpbrk(list," \t");			}			if (*list == '\0')				return;			if (strlen(list) <= SZ_CLIENT) {				strcpy(buffer,list);				search_atbl(buffer,level);			} else				fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,list,SZ_CLIENT);			return;		} else {			level++;			altbl++;		}	}	if (!invalid(name) && !in_clist(name))		add_client(name);	return;}staticin_clist(name)char	*name;{ 	register int i;	for (i = 0; i < pos; i++) {		if (strcmp(name,clist[i]) == SAME)			return(1);	}	return(0);}staticadd_client(name)char	*name;{	if (pos == (low_index + NUM_MACHS))		alloc_mem();	if ((clist[pos] = malloc((unsigned)strlen(name)+1)) == NULL ) {		fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd);		exit(1);	}	strcpy(clist[pos++],name);}staticverify(name)char	*name;{	register char *chr;	if (strlen(name) > SZ_CLIENT) {		fprintf(stderr,"%s: client/alias name <%s> exceeds <%d> characters, ignored\n",cmd,name,SZ_CLIENT);		return(1);	}	chr = name;	while (*chr != '\0') {		if (!isprint(*chr)) {			fprintf(stderr,"%s: client/alias name <%s> contains non-printable characters, ignored\n",cmd,name);			return(1);		}		chr++;	}	return(0);}staticalloc_mem(){	char   *realloc();	if ((clist = (char **)realloc((char *)clist,(NUM_MACHS + pos) * sizeof (char *))) == NULL) {		fprintf(stderr,"%s: cannot allocate memory for client list\n",cmd);		exit(1);	}	low_index = pos;}staticinvalid(name)char	*name;{	char	*mach;	char	*domain;	int	qname = 0, dname = 0;	if (name[strlen(name)-1] == SEPARATOR)		dname = 1;	if (*(domain = dompart(name)) != '\0') {		qname = 1;		if (strlen(domain) > SZ_DELEMENT) {			fprintf(stderr,"%s: domain name %s<%s> exceeds <%d> characters, ignored\n",cmd,dname ? "":"in ",name,SZ_DELEMENT);			return(1);		}		if (v_dname(domain) != 0) {			fprintf(stderr,"%s: domain name %s<%s> contains invalid characters, ignored\n",cmd,dname ? "":"in ",name);			return(1);		}	}	if (*(mach = namepart(name)) != '\0') {		if (strlen(mach) > SZ_MACH) {			fprintf(stderr,"%s: nodename %s<%s> exceeds <%d> characters, ignored\n",cmd,qname ? "in ":"",name,SZ_MACH);			return(1);		}		if (v_uname(mach) != 0) {			fprintf(stderr,"%s: nodename %s<%s> contains invalid characters, ignored\n",cmd,qname ? "in ":"",name);			return(1);		}	}	return(0);}staticupdate_entry(res,path,desc,rflag,clients)short	rflag;char	*res, *path, *desc;char	*clients[];{	register FILE  *fp, *fp1;	int	index = 0;	char	advbuf[BUFSIZE], buf[BUFSIZE];	if ((fp = fopen(ADVFILE, "r")) == NULL) {		add_entry(res,path,desc,rflag,clients);		return;	}	/*		 *	Update the client and/or description	 *	fields of an existing entry.	 */	stat(ADVFILE,&stbuf);	if ((fp1 = fopen(TEMPADV, "w")) == NULL) {		fprintf(stderr,"%s: cannot create temporary advertise file <%s>\n",cmd,TEMPADV);		exit(1);	}	while (fgets(advbuf,BUFSIZE,fp)) {		get_data(advbuf);		if (strcmp(res,fieldv[0]) == SAME) {			fprintf(fp1,"%s  %s",res,fieldv[1]);			if (dflag)				fprintf(fp1,"  \"%s\"",desc);			fprintf(fp1,"  %s ",fieldv[2]);			strncpy(buf, fieldv[3], strlen(fieldv[3])-1);                        strcpy(fieldv[3], buf);			fprintf(fp1,"  %s ",fieldv[3]);			if (clients[index] == NULL)				fprintf(fp1," %s",fieldv[4]);			else {				while (clients[index] != NULL) {					if (clients[index][0] != '\0')						fprintf(fp1," %s",clients[index]);					index++;				}					fprintf(fp1,"\n");			}		} else 			fprintf(fp1,"%s  %s  %s  %s  %s",fieldv[0],fieldv[1],fieldv[2],fieldv[3],fieldv[4]);	}	fclose(fp);	fclose(fp1);	unlink(ADVFILE);	link(TEMPADV,ADVFILE);	chmod(ADVFILE,MASK);	chown(ADVFILE,(int)stbuf.st_uid,(int)stbuf.st_gid);	unlink(TEMPADV);}staticadd_entry(res,path,desc,rflag,clients)short	rflag;char	*res, *path, *desc;char	*clients[];{	register FILE	*fp;	char	*comment = "unrestricted";	int	index = 0;	if ((fp = fopen(ADVFILE, "a")) == NULL) {		fprintf(stderr,"%s: cannot open <%s>\n",cmd,ADVFILE);		exit(1);	}	fprintf(fp,"%s  %s  \"%s\"  %s",res,path,desc,flg[rflag]);	if (clients[index] == NULL)		fprintf(fp," %s",comment);	else {		while (clients[index] != NULL) {			if (clients[index][0] != '\0')				fprintf(fp," %s",clients[index]);			index++;		}	}	fprintf(fp,"\n");	fclose(fp);}staticget_data(s)char	*s;{	register int fieldc = 0;	/* 	 *	This function parses an advertise entry from  	 *	/etc/advtab and sets the pointers appropriately. 	 */	while ((*s != '\n') && (*s != '\0') && (fieldc < 4)) {		while (isspace(*s))			s++;		fieldv[fieldc++] = s;		if (fieldc == 3) {		/*		 *	Now obtain the description associated with	 	 *	the resource.		 */			s = strpbrk(s + 1,"\"");			*(++s) = '\0';			s++;			while (isspace(*s))				s++;			fieldv[fieldc] = s;			break;		}		while (!isspace(*s))			s++;		*(s++) = '\0';	}}staticns_adv(req_type,path,res,desc,roflg,namelist)short	req_type, roflg;char	*path, *res, *desc;char	**namelist;{	struct	nssend	send;	struct	nssend	*ns_getblock();	/*		 *	Initialize structure with information to be sent	 *	to the name server.	 */	send.ns_code = req_type;	send.ns_type = 1;	send.ns_flag = roflg;	send.ns_name = res;	send.ns_path = path;	send.ns_desc = desc;	send.ns_mach = namelist;	/*	 *	Send the structure using the name server function	 *	ns_getblock().	 */	if (ns_getblock(&send) == NULL)		return(RFS_FAILURE);	return(RFS_SUCCESS);} staticrpterr(res,dir)char	*res;char	*dir;{	switch(errno) {	case EPERM:		fprintf(stderr,"%s: must be super-user\n",cmd);		break;	case ENOENT:		fprintf(stderr,"%s: <%s> no such file or directory\n",cmd,dir);		break;	case ENONET:		fprintf(stderr,"%s: machine not on the network\n",cmd);		break;	case ENOTDIR:		fprintf(stderr,"%s: <%s> not a directory\n",cmd,dir);		break;	case EREMOTE:		fprintf(stderr,"%s: <%s> is remote\n",cmd,dir);		break;	case EADV:		fprintf(stderr,"%s: <%s> already advertised\n",cmd,dir);		break;	case EROFS:		fprintf(stderr,"%s: <%s> write-protected\n",cmd,dir);		break;	case EINTR:		fprintf(stderr,"%s: system call interrupted\n",cmd);		break;	case EBUSY:		fprintf(stderr,"%s: resource <%s> currently advertises a different directory\n",cmd,res);		break;	case EEXIST:		fprintf(stderr,"%s: re-advertise error: <%s> was originally advertised under\n     a different resource name\n",cmd,dir);		break;	case ENOSPC:		fprintf(stderr,"%s: advertise table overflow\n",cmd);		break;	case EINVAL:		fprintf(stderr,"%s: invalid resource name\n",cmd);		break;	case EFAULT:		fprintf(stderr,"%s: bad user address\n",cmd);		break;	case ENOMEM:		fprintf(stderr,"%s: not enough memory\n",cmd);		break;	case ENODEV:		fprintf(stderr,"%s: <%s> not advertised\n",cmd,res);		break;	case ESRMNT:		fprintf(stderr,"%s: re-advertise error: a client that is not in the specified\n     client list currently has <%s> mounted\n",cmd,res);		break;	case EACCES:		fprintf(stderr,"%s: re-advertise error: resource <%s> originally advertised\n     with different permissions\n",cmd,res);		break;	default:		fprintf(stderr,"%s: errno <%d>, cannot advertise <%s>\n",cmd,errno,res);		break;	}}

⌨️ 快捷键说明

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