int upgrade_file_read_buffer (struct t_upgrade_file *upgrade_file, void **buffer, int *size) { if (buffer && *buffer) { free (*buffer); *buffer = NULL; } if (!upgrade_file_read_integer (upgrade_file, size)) return 0; if (*size > 0) { upgrade_file->last_read_pos = ftell (upgrade_file->file); upgrade_file->last_read_length = *size; *buffer = malloc (*size); if (buffer && *buffer) { if (fread (*buffer, *size, 1, upgrade_file->file) <= 0) return 0; } else { if (fseek (upgrade_file->file, *size, SEEK_CUR) < 0) return 0; } } return 1; }
int upgrade_file_read_string (struct t_upgrade_file *upgrade_file, char **string) { int length; if (string && *string) { free (*string); *string = NULL; } if (!upgrade_file_read_integer (upgrade_file, &length)) return 0; upgrade_file->last_read_pos = ftell (upgrade_file->file); upgrade_file->last_read_length = length; if (string) { if (length == 0) return 1; (*string) = malloc (length + 1); if (!(*string)) return 0; if (fread ((void *)(*string), length, 1, upgrade_file->file) <= 0) { free (*string); *string = NULL; return 0; } (*string)[length] = '\0'; } else { if (fseek (upgrade_file->file, length, SEEK_CUR) < 0) return 0; } return 1; }
int upgrade_file_read_object (struct t_upgrade_file *upgrade_file) { struct t_infolist *infolist; struct t_infolist_item *item; int rc, object_id, type, type_var, value, size; char *name, *value_str; void *buffer; time_t time; rc = 0; infolist = NULL; name = NULL; value_str = NULL; buffer = NULL; if (!upgrade_file_read_integer (upgrade_file, &type)) { if (feof (upgrade_file->file)) rc = 1; else UPGRADE_ERROR(_("read - object type"), ""); goto end; } if (type != UPGRADE_TYPE_OBJECT_START) { UPGRADE_ERROR(_("read - bad object type ('object start' expected)"), ""); goto end; } if (!upgrade_file_read_integer (upgrade_file, &object_id)) { UPGRADE_ERROR(_("read - object id"), ""); goto end; } infolist = infolist_new (NULL); if (!infolist) { UPGRADE_ERROR(_("read - infolist creation"), ""); goto end; } item = infolist_new_item (infolist); if (!item) { UPGRADE_ERROR(_("read - infolist item creation"), ""); goto end; } while (1) { if (!upgrade_file_read_integer (upgrade_file, &type)) { UPGRADE_ERROR(_("read - object type"), ""); goto end; } if (type == UPGRADE_TYPE_OBJECT_END) break; if (type == UPGRADE_TYPE_OBJECT_VAR) { if (!upgrade_file_read_string (upgrade_file, &name)) { UPGRADE_ERROR(_("read - variable name"), ""); goto end; } if (!name) { UPGRADE_ERROR(_("read - variable name"), ""); goto end; } if (!upgrade_file_read_integer (upgrade_file, &type_var)) { UPGRADE_ERROR(_("read - variable type"), ""); goto end; } switch (type_var) { case INFOLIST_INTEGER: if (!upgrade_file_read_integer (upgrade_file, &value)) { UPGRADE_ERROR(_("read - variable"), "integer"); goto end; } infolist_new_var_integer (item, name, value); break; case INFOLIST_STRING: if (!upgrade_file_read_string (upgrade_file, &value_str)) { UPGRADE_ERROR(_("read - variable"), "string"); goto end; } infolist_new_var_string (item, name, value_str); break; case INFOLIST_POINTER: break; case INFOLIST_BUFFER: if (!upgrade_file_read_buffer (upgrade_file, &buffer, &size)) { UPGRADE_ERROR(_("read - variable"), "buffer"); goto end; } infolist_new_var_buffer (item, name, buffer, size); break; case INFOLIST_TIME: if (!upgrade_file_read_time (upgrade_file, &time)) { UPGRADE_ERROR(_("read - variable"), "time"); goto end; } infolist_new_var_time (item, name, time); break; } } } rc = 1; if (upgrade_file->callback_read) { if ((int)(upgrade_file->callback_read) (upgrade_file->callback_read_data, upgrade_file, object_id, infolist) == WEECHAT_RC_ERROR) rc = 0; } end: if (infolist) infolist_free (infolist); if (name) free (name); if (value_str) free (value_str); if (buffer) free (buffer); return rc; }