shithub: riscv

ref: 485a3301e6119f0c85d7869d469fc0a0888e49c1
dir: /sys/src/cmd/upas/send/skipequiv.c/

View raw version
#include "common.h"
#include "send.h"

#define isspace(c) ((c)==' ' || (c)=='\t' || (c)=='\n')

static int
okfile(char *s, Biobuf *b)
{
	char *buf, *p, *e;
	int len, c;

	len = strlen(s);
	Bseek(b, 0, 0);
	
	/* one iteration per system name in the file */
	while(buf = Brdline(b, '\n')) {
		e = buf + Blinelen(b);
		for(p = buf; p < e;){
			while(isspace(*p) || *p==',')
				p++;
			if(strncmp(p, s, len) == 0) {
				c = p[len];
				if(isspace(c) || c==',')
					return 1;
			}
			while(p < e && (!isspace(*p)) && *p!=',')
				p++;
		}
	}
	/* didn't find it, prohibit forwarding */
	return 0;
}

/* return 1 if name found in file
 *	  0 if name not found
 *	  -1 if
 */
static int
lookup(char *s, char *local, Biobuf **b)
{
	char file[Pathlen];

	snprint(file, sizeof file, "%s/%s", UPASLIB, local);
	if(*b != nil || (*b = sysopen(file, "r", 0)) != nil)
		return okfile(s, *b);
	return 0;
}

/*
 *  skip past all systems in equivlist
 */
char*
skipequiv(char *base)
{
	char *sp;
	static Biobuf *fp;

	while(*base){
		sp = strchr(base, '!');
		if(sp==0)
			break;
		*sp = '\0';
		if(lookup(base, "equivlist", &fp)==1){
			/* found or us, forget this system */
			*sp='!';
			base=sp+1;
		} else {
			/* no files or system is not found, and not us */
			*sp='!';
			break;
		}
	}
	return base;
}