+ 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) {
+ menu->invalid = TRUE;
+ menu_clear(menu);
+
+ TIMED_MENU_DATA(menu)->buf[TIMED_MENU_DATA(menu)->buflen] = '\0';
+
+ xmlDocPtr doc = xmlParseMemory(TIMED_MENU_DATA(menu)->buf,
+ TIMED_MENU_DATA(menu)->buflen);
+
+ xmlNodePtr node = xmlDocGetRootElement(doc);
+
+ if (!xmlStrcasecmp(node->name, (const xmlChar*) "timed_menu")) {
+ if ((node = parse_find_node("item", node->xmlChildrenNode)))
+ parse_menu_full(doc, node, menu, FALSE);
+ }
+
+ 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(void *d)
+{
+ ObMenu *data = d;
+ if (!data->shown && TIMED_MENU_DATA(data)->fd == -1) {