示例#1
0
int				get_next_line(int const fd, char **line)
{
	static char	*tmp;
	t_gnl		gnl;

	if (get_err(fd, line) == -1)
		return (-1);
	if (tmp && ft_strchr(tmp, '\n'))
		return (get_eol(&tmp, line));
	while ((gnl.ret = read(fd, gnl.buf, BUFF_SIZE)) > 0)
	{
		gnl.buf[gnl.ret] = '\0';
		tmp = ft_strjoin_free(tmp, gnl.buf, 1);
		if (ft_strchr(gnl.buf, '\n'))
			break ;
	}
	if (gnl.ret == -1)
		return (-1);
	if (get_pos(tmp, '\n') == -1)
	{
		*line = ft_strdup(tmp);
		ft_strdel(&tmp);
		if (*line)
			return (1);
		return (0);
	}
	return (get_eol(&tmp, line));
}
示例#2
0
static char *find_line(char *p, char *e, char *u, char *t, char *l)
{
	char *p1, *p2, *ret;
	
	while (p<e  && (p1 = get_eol(p, e)) < e) {
		ret = p;
		if (*p == '#')
			goto next;
		while (p<e && isblank(*p)) p++;
		p2 = get_eow(p, e);
		if (!p2 || p2-p != strlen(u) || strncmp(p, u, strlen(u)) != 0)
			goto next;
		p = p2+1;
		while (p<e && isblank(*p)) p++;
		p2 = get_eow(p, e);
		if (!p2 || p2-p != strlen(t) || strncmp(p, t, strlen(t)) != 0)
			goto next;
		p = p2+1;
		while (p<e && isblank(*p)) p++;
		p2 = get_eow(p, e);
		if (!p2 || p2-p != strlen(l) || strncmp(p, l, strlen(l)) != 0)
			goto next;
		return ret;
next:
		p = p1 + 1;
	}

	return NULL;
}
示例#3
0
int			get_next_line(const int fd, char **line)
{
	static char		*start[256];
	t_gnl			e;
	long			eol_i;

	if (!line || fd < 0 || fd > 255 || !(*line = malloc(sizeof(**line))))
		return (-1);
	*line[0] = '\0';
	if (start[fd] && ft_strlen(start[fd]) > 0)
	{
		if ((eol_i = get_eol(start[fd])) != -1)
		{
			*line = ft_strsub(start[fd], 0, eol_i);
			start[fd] = ft_strsub(start[fd], eol_i + 1
					, ft_strlen(start[fd]) - 1 - eol_i);
			return (1);
		}
		*line = ft_strdup(start[fd]);
		free(start[fd]);
		start[fd] = NULL;
	}
	e.line = line;
	e.start = &(start[fd]);
	e.fd = fd;
	return (get_next_line_main(&e));
}
示例#4
0
static int	get_next_line_main(t_gnl *e)
{
	long			eol_i;
	int				readed;
	char			*buffer;
	int				has_readed;

	has_readed = 0;
	if (!(buffer = malloc(sizeof(*buffer) * BUFF_SIZE + 1)))
		return (-1);
	while ((readed = read(e->fd, buffer, BUFF_SIZE)) != -1)
	{
		if (readed == 0 && !has_readed)
			return (0);
		has_readed = 1;
		buffer[readed] = '\0';
		if ((eol_i = get_eol(buffer)) != -1 || readed < BUFF_SIZE)
		{
			return (get_next_line_main_part(e, buffer, eol_i, readed));
		}
		if (!(*(e->line) = ft_strjoin_free1(*(e->line), buffer)))
			return (-1);
	}
	free(buffer);
	return (-1);
}
示例#5
0
bool cull_entries(int fd, char *me, char *t, char *br)
{
	struct stat sb;
	char *buf, *p, *e, *nic;
	off_t len;

	nic = alloca(100);

	fstat(fd, &sb);
	len = sb.st_size;
	if (len == 0)
		return true;
	buf = mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
	if (buf == MAP_FAILED) {
		fprintf(stderr, "Failed to create mapping: error %d\n", errno);
		return false;
	}

	p = buf;
	e = buf + len;
	while ((p = find_line(p, e, me, t, br)) != NULL) {
		if (!get_nic_from_line(p, &nic))
			continue;
		if (nic && !nic_exists(nic)) {
			// copy from eol(p)+1..e to p
			char *src = get_eol(p) + 1, *dest = p;
			int diff = src - p;
			while (src < e)
				*(dest++) = *(src)++;
			e -= diff;
		} else
			p = get_eol(p) + 1;
		if (p >= e)
			break;
	}
	munmap(buf, sb.st_size);
	if (ftruncate(fd, e-buf))
		fprintf(stderr, "Failed to set new file size\n");
	return true;
}
示例#6
0
int count_entries(char *buf, off_t len, char *me, char *t, char *br)
{
	char *e = &buf[len];
	int count = 0;
	while ((buf = find_line(buf, e, me, t, br)) != NULL) {
		count++;
		buf = get_eol(buf)+1;
		if (buf >= e)
			break;
	}

	return count;
}
示例#7
0
文件: lxc_user_nic.c 项目: d4s/lxc
static char *find_line(char *buf_start, char *buf_end, char *name,
		       char *net_type, char *net_link, char *net_dev,
		       bool *owner, bool *found, bool *keep)
{
	char *end_of_line, *end_of_word, *line;

	while (buf_start < buf_end) {
		size_t len;
		char netdev_name[IFNAMSIZ];

		*found = false;
		*keep = true;
		*owner = false;

		end_of_line = get_eol(buf_start, buf_end);
		if (end_of_line >= buf_end)
			return NULL;

		line = buf_start;
		if (*buf_start == '#')
			goto next;

		while ((buf_start < buf_end) && isblank(*buf_start))
			buf_start++;

		/* Check whether the line contains the caller's name. */
		end_of_word = get_eow(buf_start, buf_end);
		/* corrupt db */
		if (!end_of_word)
			return NULL;

		if (strncmp(buf_start, name, strlen(name)))
			*found = false;

		*owner = true;

		buf_start = end_of_word + 1;
		while ((buf_start < buf_end) && isblank(*buf_start))
			buf_start++;

		/* Check whether line is of the right network type. */
		end_of_word = get_eow(buf_start, buf_end);
		/* corrupt db */
		if (!end_of_word)
			return NULL;

		if (strncmp(buf_start, net_type, strlen(net_type)))
			*found = false;

		buf_start = end_of_word + 1;
		while ((buf_start < buf_end) && isblank(*buf_start))
			buf_start++;

		/* Check whether line is contains the right link. */
		end_of_word = get_eow(buf_start, buf_end);
		/* corrupt db */
		if (!end_of_word)
			return NULL;

		if (strncmp(buf_start, net_link, strlen(net_link)))
			*found = false;

		buf_start = end_of_word + 1;
		while ((buf_start < buf_end) && isblank(*buf_start))
			buf_start++;

		/* Check whether line contains the right network device. */
		end_of_word = get_eow(buf_start, buf_end);
		/* corrupt db */
		if (!end_of_word)
			return NULL;

		len = end_of_word - buf_start;
		/* corrupt db */
		if (len >= IFNAMSIZ)
			return NULL;

		memcpy(netdev_name, buf_start, len);
		netdev_name[len] = '\0';
		*keep = lxc_nic_exists(netdev_name);

		if (net_dev && !strcmp(netdev_name, net_dev))
			*found = true;

		return line;

	next:
		buf_start = end_of_line + 1;
	}

	return NULL;
}
示例#8
0
static gboolean
cmdline_key_pressed(GtkWidget *widget, GdkEventKey *event,
		    gpointer user_data)
{
	bool is_shift	= event->state & GDK_SHIFT_MASK;
	bool is_ctl	= event->state & GDK_CONTROL_MASK;

#ifdef DEBUG
	g_printf("KEY \"%s\" (%d) SHIFT=%d CNTRL=%d\n",
		 event->string, *event->string,
		 event->state & GDK_SHIFT_MASK, event->state & GDK_CONTROL_MASK);
#endif

	switch (event->keyval) {
	case GDK_BackSpace:
		cmdline_keypress('\b');
		break;
	case GDK_Tab:
		cmdline_keypress('\t');
		break;
	case GDK_Return:
		cmdline_keypress(get_eol());
		break;

	/*
	 * Function key macros
	 */
#define FN(KEY, MACRO) \
	case GDK_##KEY: cmdline_fnmacro(#MACRO); break
#define FNS(KEY, MACRO) \
	case GDK_##KEY: cmdline_fnmacro(is_shift ? "S" #MACRO : #MACRO); break
	FN(Down, DOWN); FN(Up, UP);
	FNS(Left, LEFT); FNS(Right, RIGHT);
	FN(KP_Down, DOWN); FN(KP_Up, UP);
	FNS(KP_Left, LEFT); FNS(KP_Right, RIGHT);
	FNS(Home, HOME);
	case GDK_F1...GDK_F35: {
		gchar macro_name[3+1];

		g_snprintf(macro_name, sizeof(macro_name),
			   "F%d", event->keyval - GDK_F1 + 1);
		cmdline_fnmacro(macro_name);
		break;
	}
	FNS(Delete, DC);
	FNS(Insert, IC);
	FN(Page_Down, NPAGE); FN(Page_Up, PPAGE);
	FNS(Print, PRINT);
	FN(KP_Home, A1); FN(KP_Prior, A3);
	FN(KP_Begin, B2);
	FN(KP_End, C1); FN(KP_Next, C3);
	FNS(End, END);
	FNS(Help, HELP);
#undef FNS
#undef FN

	/*
	 * Control keys and keys with printable representation
	 */
	default:
		gunichar u = gdk_keyval_to_unicode(event->keyval);

		if (u && g_unichar_to_utf8(u, NULL) == 1) {
			gchar key;

			g_unichar_to_utf8(u, &key);
			if (key > 0x7F)
				break;
			if (is_ctl)
				key = CTL_KEY(g_ascii_toupper(key));

			cmdline_keypress(key);
		}
	}

	return TRUE;
}