+void timed_menu_clean_up(Menu *m) {
+ if (TIMED_MENU_DATA(m)->buf != NULL) {
+ fprintf(stderr, "%s", TIMED_MENU_DATA(m)->buf);
+ g_free(TIMED_MENU_DATA(m)->buf);
+ TIMED_MENU_DATA(m)->buf = NULL;
+ }
+
+ TIMED_MENU_DATA(m)->buflen = 0;
+
+ if (TIMED_MENU_DATA(m)->fd != -1) {
+ event_remove_fd(TIMED_MENU_DATA(m)->fd);
+ close(TIMED_MENU_DATA(m)->fd);
+ TIMED_MENU_DATA(m)->fd = -1;
+ }
+
+ /* child is reaped by glib ? */
+}
+
+void timed_menu_read_pipe(int fd, Menu *menu)
+{
+ char *tmpbuf = NULL;
+ unsigned long num_read;
+#ifdef DEBUG
+ Timed_Menu_Data *d = TIMED_MENU_DATA(menu);
+#endif
+
+ unsigned long num_realloc;
+ /* if we have less than a quarter BUFSIZ left, allocate more */
+ num_realloc = (BUFSIZ - (TIMED_MENU_DATA(menu)->buflen % BUFSIZ) <
+ BUFSIZ >> 2) ?
+ 0 : BUFSIZ;
+
+ tmpbuf = g_try_realloc(TIMED_MENU_DATA(menu)->buf,
+ TIMED_MENU_DATA(menu)->buflen + num_realloc);
+
+ if (tmpbuf == NULL) {
+ g_warning("Unable to allocate memory for read()");
+ return;
+ }
+
+ TIMED_MENU_DATA(menu)->buf = tmpbuf;
+
+ num_read = read(fd,
+ TIMED_MENU_DATA(menu)->buf + TIMED_MENU_DATA(menu)->buflen,
+ num_realloc);
+ if (num_read == 0) {
+ unsigned long count = 0;
+ char *found = NULL;
+ menu->invalid = TRUE;
+ menu_clear(menu);
+
+ /* TEMP: list them */
+ while (NULL !=
+ (found = strchr(&TIMED_MENU_DATA(menu)->buf[count], '\n'))) {
+ TIMED_MENU_DATA(menu)->buf
+ [found - TIMED_MENU_DATA(menu)->buf] = '\0';
+ menu_add_entry(menu,
+ menu_entry_new_separator
+ (&TIMED_MENU_DATA(menu)->buf[count]));
+ count = found - TIMED_MENU_DATA(menu)->buf + 1;
+ }
+
+
+ TIMED_MENU_DATA(menu)->buf[TIMED_MENU_DATA(menu)->buflen] = '\0';
+ timed_menu_clean_up(menu);
+ } else if (num_read > 0) {
+ TIMED_MENU_DATA(menu)->buflen += num_read;
+ TIMED_MENU_DATA(menu)->buf[TIMED_MENU_DATA(menu)->buflen] = '\0';
+ } else { /* num_read < 1 */
+ g_warning("Error on read %s", strerror(errno));
+ timed_menu_clean_up(menu);
+ }
+}
+
+void timed_menu_timeout_handler(Menu *data)