PRIVATE ObjectStoreItem *read_item(FILE *f) { ObjectStoreItem *item = safe_malloc(sizeof(ObjectStoreItem)); BUFFER varname; char str[1024]; /* %%% Yuck, a fixed-size buffer. */ int key; if (fscanf(f, "%s %d [", str, &key) < 2) { free(item); return NULL; } item->tag = safe_string_dup(str); item->key = key; item->object = NULL; item->db = NULL; item->fields = g_hash_table_new(g_str_hash, g_str_equal); varname = newbuf(128); while (!feof(f)) { int ch; /* Strip leading whitespace (there _should_ always be some). */ do { ch = fgetc(f); } while (isspace(ch) && (ch != ']') && (ch != EOF)); if (ch == ']' || ch == EOF) { /* That's it. We're done with this item. */ /* Empty line signals no more fields. */ break; } /* Read the field name */ do { buf_append(varname, ch); ch = fgetc(f); } while (!isspace(ch)); /* Skip the whitespace and equals-sign */ do { ch = fgetc(f); } while (isspace(ch) || ch == '='); ungetc(ch, f); /* Now we have the complete variable name in varname, and we are about to read the first character of the variable value. */ buf_append(varname, '\0'); objectstore_item_set(item, varname->buf, read_item_field_value(f)); varname->pos = 0; /* reset varname for next round */ /* Trailing whitespace, if any, is dealt with at the top of the loop. */ } killbuf(varname); return item; }
static void close_conn(Connection *conn, int closing_fd) { if (conn->txfer_buf->pos != 0) { dump_buffer(conn); } event_del(&conn->read_event[0]); event_del(&conn->read_event[1]); close(conn->fd[0]); close(conn->fd[1]); log_fmt("connection to %s between I fd %d and O fd %d closed by fd %d\n", conn->name[0], conn->fd[0], conn->fd[1], closing_fd); free(conn->name[0]); killbuf(conn->txfer_buf); free(conn); }