示例#1
0
文件: db.c 项目: Distrotech/mcelog
static int read_db(struct database *db)
{
	char *line = NULL;
	size_t linesz = 0;
	struct group *group = NULL, **pgroup = &db->groups;
	int linenr = 0;

	while (getline(&line, &linesz, db->fh) > 0) {
		char *s;
		s = strchr(line, '#');
		if (s) {
			struct group *cmt;
			DB_NEW(cmt);
			*pgroup = cmt;
			pgroup = &cmt->next;
			cmt->comment = xstrdup(s + 1);
			*s = 0;
		} 	
		s = cleanline(line);
		linenr++;
		if (!s) 	
			continue;
		if (*s == '[') {
			int n;
			char *name;
			++s;
			n = strcspn(s, "]");
			if (s[n] == 0)
				goto parse_error;
			name = xalloc(n + 1);
			memcpy(name, s, n);
			group = alloc_group(name);
			*pgroup = group;
			pgroup = &group->next;
		} else {
			char *p;
			if (!group)
				goto parse_error;
			p = s + strcspn(s, ":");
			if (*p != ':')
				goto parse_error;
			*p++ = 0;
			if (*p == ' ')
				p++;
			else
				goto parse_error;
			change_entry(db, group, line, p);
		}
	}								

	if (ferror(db->fh)) {
		DBerror("IO error while reading database %s: %s\n", db->fn,
			strerror(errno));
		goto error;
	}	
		
	free(line);
	return 0;

parse_error:
	DBerror("Parse error in database %s at line %d\n", db->fn, linenr);
error: 	
	free(line);
	return -1;
}
示例#2
0
int get_stdin(char *args[])
{
	char buf[2], sbuf[ARGLEN], dbuf[ARGLEN], *arg1, *arg2;
	int x, y, z, argmax;

	memset(buf, 0, sizeof(buf));

	argmax = ARGLEN - 1;
	arg1 = (char *)calloc(1, ARGLEN);
	arg2 = (char *)calloc(1, ARGLEN);
	memset(sbuf, 0, sizeof(sbuf));
	memset(dbuf, 0, sizeof(dbuf));

	while (!sbuf[0]) {
		x = 0;
		y = 0;
		memset(sbuf, 0, sizeof(sbuf));
		do {
			x = read(0, buf, 1);
			if (x == 1)
				sbuf[y] = buf[0];
			y++;
		} while (x > 0 && buf[0] != '\n' && y < ((int)sizeof(sbuf) - 1));
		if (x < 0) {
			free(arg1);
			free(arg2);
			return -1;
		}
		if (!x)
			break;

		while (buf[0] != '\n' && x == 1)
			x = read(0, buf, 1);
		if (x < 0) {
			free(arg1);
			free(arg2);
			return -1;
		}
		if (!x)
			break;
	};
	if (!sbuf[0]) {
		free(arg1);
		free(arg2);
		return -2;
	}

	x = cleanline(sbuf, dbuf);
	if (x < 1) {
		free(arg1);
		free(arg2);
		return x;
	}

	y = 0;
	while (y < (int)strlen(dbuf) && y < argmax && dbuf[y] != ' ') {
		arg1[y] = dbuf[y];
		y++;
	}
	y++;
	z = 0;
	while (y < (int)strlen(dbuf) && z < argmax && dbuf[y] != ' ') {
		arg2[z] = dbuf[y];
		y++;
		z++;
	}

	strlcpy(args[0], arg1, ARGLEN);
	strlcpy(args[1], arg2, ARGLEN);

	free(arg1);
	free(arg2);

	return x;
}