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)); }
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; }
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)); }
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); }
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; }
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; }
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; }
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; }