mirror of
https://github.com/libretro/RetroArch.git
synced 2025-12-28 05:24:00 +00:00
Reduce gotos in command.c/core_backup.c
This commit is contained in:
parent
3aa8db2c08
commit
57cf4011ec
181
command.c
181
command.c
@ -294,42 +294,42 @@ static void stdin_command_free(command_t *handle)
|
||||
|
||||
static void command_stdin_poll(command_t *handle)
|
||||
{
|
||||
ptrdiff_t msg_len;
|
||||
char *last_newline = NULL;
|
||||
command_stdin_t *stdincmd = (command_stdin_t*)handle->userptr;
|
||||
ssize_t ret = read_stdin(
|
||||
stdincmd->stdin_buf + stdincmd->stdin_buf_ptr,
|
||||
CMD_BUF_SIZE - stdincmd->stdin_buf_ptr - 1);
|
||||
|
||||
if (ret == 0)
|
||||
return;
|
||||
|
||||
stdincmd->stdin_buf_ptr += ret;
|
||||
stdincmd->stdin_buf[stdincmd->stdin_buf_ptr] = '\0';
|
||||
|
||||
last_newline = strrchr(stdincmd->stdin_buf, '\n');
|
||||
|
||||
if (!last_newline)
|
||||
if (ret != 0)
|
||||
{
|
||||
/* We're receiving bogus data in pipe
|
||||
* (no terminating newline), flush out the buffer. */
|
||||
if (stdincmd->stdin_buf_ptr + 1 >= CMD_BUF_SIZE)
|
||||
char *last_newline = NULL;
|
||||
stdincmd->stdin_buf_ptr += ret;
|
||||
stdincmd->stdin_buf[stdincmd->stdin_buf_ptr] = '\0';
|
||||
|
||||
last_newline = strrchr(stdincmd->stdin_buf, '\n');
|
||||
|
||||
if (!last_newline)
|
||||
{
|
||||
stdincmd->stdin_buf_ptr = 0;
|
||||
stdincmd->stdin_buf[0] = '\0';
|
||||
/* We're receiving bogus data in pipe
|
||||
* (no terminating newline), flush out the buffer. */
|
||||
if (stdincmd->stdin_buf_ptr + 1 >= CMD_BUF_SIZE)
|
||||
{
|
||||
stdincmd->stdin_buf_ptr = 0;
|
||||
stdincmd->stdin_buf[0] = '\0';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ptrdiff_t msg_len;
|
||||
*last_newline++ = '\0';
|
||||
msg_len = last_newline - stdincmd->stdin_buf;
|
||||
|
||||
return;
|
||||
command_parse_msg(handle, stdincmd->stdin_buf);
|
||||
|
||||
memmove(stdincmd->stdin_buf, last_newline,
|
||||
stdincmd->stdin_buf_ptr - msg_len);
|
||||
stdincmd->stdin_buf_ptr -= msg_len;
|
||||
}
|
||||
}
|
||||
|
||||
*last_newline++ = '\0';
|
||||
msg_len = last_newline - stdincmd->stdin_buf;
|
||||
|
||||
command_parse_msg(handle, stdincmd->stdin_buf);
|
||||
|
||||
memmove(stdincmd->stdin_buf, last_newline,
|
||||
stdincmd->stdin_buf_ptr - msg_len);
|
||||
stdincmd->stdin_buf_ptr -= msg_len;
|
||||
}
|
||||
|
||||
command_t* command_stdin_new(void)
|
||||
@ -386,9 +386,8 @@ static void command_emscripten_poll(command_t *handle)
|
||||
{
|
||||
command_emscripten_t *emscriptencmd = (command_emscripten_t*)handle->userptr;
|
||||
ptrdiff_t msg_len = platform_emscripten_command_read((char **)(&emscriptencmd->command_buf), CMD_BUF_SIZE);
|
||||
if (msg_len == 0)
|
||||
return;
|
||||
command_parse_msg(handle, emscriptencmd->command_buf);
|
||||
if (msg_len != 0)
|
||||
command_parse_msg(handle, emscriptencmd->command_buf);
|
||||
}
|
||||
|
||||
command_t* command_emscripten_new(void)
|
||||
@ -419,9 +418,9 @@ bool command_get_config_param(command_t *cmd, const char* arg)
|
||||
{
|
||||
size_t _len;
|
||||
char reply[8192];
|
||||
#ifdef HAVE_BSV_MOVIE
|
||||
#ifdef HAVE_BSV_MOVIE
|
||||
char value_dynamic[256];
|
||||
#endif
|
||||
#endif
|
||||
const char *value = "unsupported";
|
||||
settings_t *settings = config_get_ptr();
|
||||
bool video_fullscreen = settings->bools.video_fullscreen;
|
||||
@ -590,13 +589,8 @@ command_t* command_uds_new(void)
|
||||
strcpy(&addr.sun_path[1], "retroarch/cmd");
|
||||
|
||||
if ( bind(fd, (struct sockaddr*)&addr, addrsz) < 0
|
||||
|| listen(fd, MAX_USER_CONNECTIONS) < 0)
|
||||
{
|
||||
socket_close(fd);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!socket_nonblock(fd))
|
||||
|| listen(fd, MAX_USER_CONNECTIONS) < 0
|
||||
|| !socket_nonblock(fd))
|
||||
{
|
||||
socket_close(fd);
|
||||
return NULL;
|
||||
@ -624,8 +618,7 @@ command_t* command_uds_new(void)
|
||||
#ifdef HAVE_NETWORK_CMD
|
||||
static bool command_verify(const char *cmd)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
size_t i;
|
||||
if (command_get_arg(cmd, NULL, NULL))
|
||||
return true;
|
||||
|
||||
@ -842,38 +835,37 @@ bool command_load_savefiles(command_t *cmd, const char* arg)
|
||||
#if defined(HAVE_CHEEVOS)
|
||||
bool command_read_ram(command_t *cmd, const char *arg)
|
||||
{
|
||||
unsigned i;
|
||||
char *reply = NULL;
|
||||
const uint8_t *data = NULL;
|
||||
char *reply_at = NULL;
|
||||
unsigned int nbytes = 0;
|
||||
unsigned int alloc_size = 0;
|
||||
unsigned int addr = -1;
|
||||
size_t _len = 0;
|
||||
unsigned int nbytes = 0;
|
||||
unsigned int addr = -1;
|
||||
|
||||
if (sscanf(arg, "%x %u", &addr, &nbytes) != 2)
|
||||
return true;
|
||||
/* We allocate more than needed, saving 20 bytes is not really relevant */
|
||||
alloc_size = 40 + nbytes * 3;
|
||||
reply = (char*)malloc(alloc_size);
|
||||
reply[0] = '\0';
|
||||
reply_at = reply + snprintf(
|
||||
reply, alloc_size - 1, "READ_CORE_RAM" " %x", addr);
|
||||
if (sscanf(arg, "%x %u", &addr, &nbytes) == 2)
|
||||
{
|
||||
size_t _len = 0;
|
||||
char *reply_at = NULL;
|
||||
const uint8_t *data = NULL;
|
||||
/* We allocate more than needed, saving 20 bytes is not really relevant */
|
||||
unsigned int alloc_size = 40 + nbytes * 3;
|
||||
char *reply = (char*)malloc(alloc_size);
|
||||
reply[0] = '\0';
|
||||
reply_at = reply + snprintf(
|
||||
reply, alloc_size - 1, "READ_CORE_RAM" " %x", addr);
|
||||
|
||||
if ((data = rcheevos_patch_address(addr)))
|
||||
{
|
||||
for (i = 0; i < nbytes; i++)
|
||||
snprintf(reply_at + 3 * i, 4, " %.2X", data[i]);
|
||||
reply_at[3 * nbytes] = '\n';
|
||||
_len = reply_at + 3 * nbytes + 1 - reply;
|
||||
if ((data = rcheevos_patch_address(addr)))
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < nbytes; i++)
|
||||
snprintf(reply_at + 3 * i, 4, " %.2X", data[i]);
|
||||
reply_at[3 * nbytes] = '\n';
|
||||
_len = reply_at + 3 * nbytes + 1 - reply;
|
||||
}
|
||||
else
|
||||
{
|
||||
strlcpy(reply_at, " -1\n", sizeof(reply) - strlen(reply));
|
||||
_len = reply_at + STRLEN_CONST(" -1\n") - reply;
|
||||
}
|
||||
cmd->replier(cmd, reply, _len);
|
||||
free(reply);
|
||||
}
|
||||
else
|
||||
{
|
||||
strlcpy(reply_at, " -1\n", sizeof(reply) - strlen(reply));
|
||||
_len = reply_at + STRLEN_CONST(" -1\n") - reply;
|
||||
}
|
||||
cmd->replier(cmd, reply, _len);
|
||||
free(reply);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -1080,7 +1072,8 @@ bool command_write_memory(command_t *cmd, const char *arg)
|
||||
const rarch_system_info_t
|
||||
*sys_info = &runloop_st->system;
|
||||
char *reply_at = reply + snprintf(reply, sizeof(reply) - 1, "WRITE_CORE_MEMORY %x", address);
|
||||
uint8_t *data = command_memory_get_pointer(sys_info, address, &max_bytes, 1, reply_at, sizeof(reply) - strlen(reply) - 1);
|
||||
uint8_t *data = command_memory_get_pointer(sys_info, address, &max_bytes, 1,
|
||||
reply_at, sizeof(reply) - strlen(reply) - 1);
|
||||
|
||||
if (data)
|
||||
{
|
||||
@ -1123,15 +1116,10 @@ void command_event_set_volume(
|
||||
configuration_set_float(settings, settings->floats.audio_volume, new_volume);
|
||||
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
sizeof(msg));
|
||||
msg[_len ] = ':';
|
||||
msg[++_len] = ' ';
|
||||
msg[++_len] = '\0';
|
||||
_len += strlcpy(msg + _len, ": ", sizeof(msg) - _len);
|
||||
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
|
||||
new_volume);
|
||||
msg[_len ] = ' ';
|
||||
msg[++_len] = 'd';
|
||||
msg[++_len] = 'B';
|
||||
msg[++_len] = '\0';
|
||||
_len += strlcpy(msg + _len, " dB", sizeof(msg) - _len);
|
||||
|
||||
#if defined(HAVE_GFX_WIDGETS)
|
||||
if (widgets_active)
|
||||
@ -1166,15 +1154,10 @@ void command_event_set_mixer_volume(
|
||||
configuration_set_float(settings, settings->floats.audio_mixer_volume, new_volume);
|
||||
_len = strlcpy(msg, msg_hash_to_str(MSG_AUDIO_VOLUME),
|
||||
sizeof(msg));
|
||||
msg[_len ] = ':';
|
||||
msg[++_len] = ' ';
|
||||
msg[++_len] = '\0';
|
||||
_len += strlcpy(msg + _len, ": ", sizeof(msg) - _len);
|
||||
_len += snprintf(msg + _len, sizeof(msg) - _len, "%.1f",
|
||||
new_volume);
|
||||
msg[_len ] = ' ';
|
||||
msg[++_len] = 'd';
|
||||
msg[++_len] = 'B';
|
||||
msg[++_len] = '\0';
|
||||
_len += strlcpy(msg + _len, " dB", sizeof(msg) - _len);
|
||||
runloop_msg_queue_push(msg, _len, 1, 180, true, NULL,
|
||||
MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO);
|
||||
|
||||
@ -1191,7 +1174,7 @@ void command_event_init_controllers(rarch_system_info_t *sys_info,
|
||||
|
||||
for (port = 0; port < num_core_ports; port++)
|
||||
{
|
||||
unsigned i;
|
||||
size_t i;
|
||||
retro_ctx_controller_info_t pad;
|
||||
unsigned device = RETRO_DEVICE_NONE;
|
||||
const struct retro_controller_description *desc = NULL;
|
||||
@ -1314,8 +1297,8 @@ static size_t command_event_undo_load_state(char *s, size_t len)
|
||||
bool command_event_resize_windowed_scale(settings_t *settings,
|
||||
unsigned window_scale)
|
||||
{
|
||||
unsigned idx = 0;
|
||||
bool video_fullscreen = settings->bools.video_fullscreen;
|
||||
unsigned idx = 0;
|
||||
bool video_fullscreen = settings->bools.video_fullscreen;
|
||||
|
||||
if (window_scale == 0)
|
||||
return false;
|
||||
@ -1702,20 +1685,20 @@ void command_event_set_savestate_auto_index(settings_t *settings)
|
||||
{
|
||||
unsigned max_idx = 0;
|
||||
bool savestate_auto_index = settings->bools.savestate_auto_index;
|
||||
if (!savestate_auto_index)
|
||||
if (savestate_auto_index)
|
||||
{
|
||||
command_scan_states(
|
||||
settings->bools.show_hidden_files,
|
||||
settings->uints.savestate_max_keep,
|
||||
settings->ints.state_slot, &max_idx, NULL);
|
||||
configuration_set_int(settings, settings->ints.state_slot, max_idx);
|
||||
RARCH_LOG("[State] %s: #%d.\n",
|
||||
msg_hash_to_str(MSG_FOUND_LAST_STATE_SLOT),
|
||||
max_idx);
|
||||
}
|
||||
else
|
||||
/* Reset savestate index to 0 when loading content. */
|
||||
configuration_set_int(settings, settings->ints.state_slot, 0);
|
||||
return;
|
||||
}
|
||||
command_scan_states(
|
||||
settings->bools.show_hidden_files,
|
||||
settings->uints.savestate_max_keep,
|
||||
settings->ints.state_slot, &max_idx, NULL);
|
||||
configuration_set_int(settings, settings->ints.state_slot, max_idx);
|
||||
RARCH_LOG("[State] %s: #%d.\n",
|
||||
msg_hash_to_str(MSG_FOUND_LAST_STATE_SLOT),
|
||||
max_idx);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2154,8 +2137,6 @@ bool command_event_main_state(unsigned cmd)
|
||||
then and now (not yet implemented); if the state is not part of
|
||||
the replay, do nothing and log a warning.
|
||||
*/
|
||||
|
||||
|
||||
if (savestates_enabled)
|
||||
{
|
||||
switch (cmd)
|
||||
|
||||
193
core_backup.c
193
core_backup.c
@ -173,67 +173,62 @@ enum core_backup_type core_backup_get_backup_type(const char *backup_path)
|
||||
{
|
||||
char core_ext[16];
|
||||
const char *backup_ext = NULL;
|
||||
struct string_list *metadata_list = NULL;
|
||||
|
||||
if (string_is_empty(backup_path) || !path_is_valid(backup_path))
|
||||
goto error;
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
|
||||
/* Get backup file extension */
|
||||
backup_ext = path_get_extension(backup_path);
|
||||
|
||||
if (string_is_empty(backup_ext))
|
||||
goto error;
|
||||
|
||||
/* Get platform-specific dynamic library extension */
|
||||
if (!frontend_driver_get_core_extension(core_ext, sizeof(core_ext)))
|
||||
goto error;
|
||||
|
||||
/* Check if this is an archived backup */
|
||||
if (string_is_equal_noncase(backup_ext,
|
||||
FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT))
|
||||
if (!string_is_empty(backup_ext))
|
||||
{
|
||||
const char *backup_filename = NULL;
|
||||
const char *src_ext = NULL;
|
||||
/* Get platform-specific dynamic library extension */
|
||||
if (frontend_driver_get_core_extension(core_ext, sizeof(core_ext)))
|
||||
{
|
||||
/* Check if this is an archived backup */
|
||||
if (string_is_equal_noncase(backup_ext,
|
||||
FILE_PATH_CORE_BACKUP_EXTENSION_NO_DOT))
|
||||
{
|
||||
bool ret = false;
|
||||
struct string_list *metadata_list = NULL;
|
||||
const char *backup_filename = NULL;
|
||||
const char *src_ext = NULL;
|
||||
|
||||
/* Split the backup filename into its various
|
||||
* metadata components */
|
||||
backup_filename = path_basename(backup_path);
|
||||
/* Split the backup filename into its various
|
||||
* metadata components */
|
||||
backup_filename = path_basename(backup_path);
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
if (string_is_empty(backup_filename))
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
|
||||
metadata_list = string_split(backup_filename, ".");
|
||||
metadata_list = string_split(backup_filename, ".");
|
||||
|
||||
if (!metadata_list || (metadata_list->size != 6))
|
||||
goto error;
|
||||
if (!metadata_list)
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
|
||||
/* Get extension of source core file */
|
||||
src_ext = metadata_list->elems[1].data;
|
||||
if (metadata_list->size != 6)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
}
|
||||
|
||||
if (string_is_empty(src_ext))
|
||||
goto error;
|
||||
|
||||
/* Check whether extension is valid */
|
||||
if (!string_is_equal_noncase(src_ext, core_ext))
|
||||
goto error;
|
||||
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
|
||||
return CORE_BACKUP_TYPE_ARCHIVE;
|
||||
/* Get extension of source core file */
|
||||
src_ext = metadata_list->elems[1].data;
|
||||
ret = string_is_empty(src_ext)
|
||||
|| !string_is_equal_noncase(src_ext, core_ext);
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
/* Check whether extension is valid */
|
||||
if (ret)
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
return CORE_BACKUP_TYPE_ARCHIVE;
|
||||
}
|
||||
/* Check if this is a plain dynamic library file */
|
||||
if (string_is_equal_noncase(backup_ext, core_ext))
|
||||
return CORE_BACKUP_TYPE_LIB;
|
||||
}
|
||||
}
|
||||
|
||||
/* Check if this is a plain dynamic library file */
|
||||
if (string_is_equal_noncase(backup_ext, core_ext))
|
||||
return CORE_BACKUP_TYPE_LIB;
|
||||
|
||||
error:
|
||||
if (metadata_list)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
}
|
||||
|
||||
return CORE_BACKUP_TYPE_INVALID;
|
||||
}
|
||||
|
||||
@ -242,7 +237,6 @@ error:
|
||||
bool core_backup_get_backup_crc(char *s, uint32_t *crc)
|
||||
{
|
||||
enum core_backup_type backup_type;
|
||||
struct string_list *metadata_list = NULL;
|
||||
|
||||
if (string_is_empty(s) || !crc)
|
||||
return false;
|
||||
@ -254,32 +248,39 @@ bool core_backup_get_backup_crc(char *s, uint32_t *crc)
|
||||
{
|
||||
case CORE_BACKUP_TYPE_ARCHIVE:
|
||||
{
|
||||
uint32_t val;
|
||||
struct string_list *metadata_list = NULL;
|
||||
bool ret = false;
|
||||
const char *crc_str = NULL;
|
||||
/* Split the backup filename into its various
|
||||
* metadata components */
|
||||
const char *backup_filename = path_basename(s);
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
return false;
|
||||
|
||||
metadata_list = string_split(backup_filename, ".");
|
||||
|
||||
if (!metadata_list || (metadata_list->size != 6))
|
||||
goto error;
|
||||
if (!metadata_list)
|
||||
return false;
|
||||
if (metadata_list->size != 6)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get crc string */
|
||||
crc_str = metadata_list->elems[3].data;
|
||||
|
||||
if (string_is_empty(crc_str))
|
||||
goto error;
|
||||
|
||||
ret = string_is_empty(crc_str);
|
||||
/* Convert to an integer */
|
||||
if ((*crc = (uint32_t)string_hex_to_unsigned(crc_str)) == 0)
|
||||
goto error;
|
||||
val = (uint32_t)string_hex_to_unsigned(crc_str);
|
||||
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
|
||||
if (ret || ((*crc = val) == 0))
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
case CORE_BACKUP_TYPE_LIB:
|
||||
@ -315,13 +316,6 @@ bool core_backup_get_backup_crc(char *s, uint32_t *crc)
|
||||
break;
|
||||
}
|
||||
|
||||
error:
|
||||
if (metadata_list)
|
||||
{
|
||||
string_list_free(metadata_list);
|
||||
metadata_list = NULL;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -421,11 +415,14 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
|
||||
backup_filename = strdup(path_basename(backup_path));
|
||||
|
||||
if (string_is_empty(backup_filename))
|
||||
goto error;
|
||||
return false;
|
||||
|
||||
/* Ensure base backup filename matches core */
|
||||
if (!string_starts_with(backup_filename, core_filename))
|
||||
goto error;
|
||||
{
|
||||
free(backup_filename);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Remove backup file extension */
|
||||
path_remove_extension(backup_filename);
|
||||
@ -440,7 +437,10 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
|
||||
&entry->date.year, &entry->date.month, &entry->date.day,
|
||||
&entry->date.hour, &entry->date.minute, &entry->date.second,
|
||||
&crc, &backup_mode) != 8)
|
||||
goto error;
|
||||
{
|
||||
free(backup_filename);
|
||||
return false;
|
||||
}
|
||||
|
||||
entry->crc = (uint32_t)crc;
|
||||
entry->backup_mode = (enum core_backup_mode)backup_mode;
|
||||
@ -452,12 +452,6 @@ static bool core_backup_add_entry(core_backup_list_t *backup_list,
|
||||
free(backup_filename);
|
||||
|
||||
return true;
|
||||
|
||||
error:
|
||||
if (backup_filename)
|
||||
free(backup_filename);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Creates a new core backup list containing entries
|
||||
@ -480,22 +474,22 @@ core_backup_list_t *core_backup_list_init(
|
||||
|
||||
/* Get core filename and parent directory */
|
||||
if (string_is_empty(core_path))
|
||||
goto error;
|
||||
return NULL;
|
||||
|
||||
core_filename = path_basename(core_path);
|
||||
|
||||
if (string_is_empty(core_filename))
|
||||
goto error;
|
||||
return NULL;
|
||||
|
||||
fill_pathname_parent_dir(core_dir, core_path, sizeof(core_dir));
|
||||
|
||||
if (string_is_empty(core_dir))
|
||||
goto error;
|
||||
return NULL;
|
||||
|
||||
/* Get backup directory */
|
||||
if (!core_backup_get_backup_dir(core_dir, dir_core_assets, core_filename,
|
||||
backup_dir, sizeof(backup_dir)))
|
||||
goto error;
|
||||
return NULL;
|
||||
|
||||
/* Get backup file list */
|
||||
dir_list = dir_list_new(
|
||||
@ -509,30 +503,39 @@ core_backup_list_t *core_backup_list_init(
|
||||
|
||||
/* Sanity check */
|
||||
if (!dir_list)
|
||||
goto error;
|
||||
return NULL;
|
||||
|
||||
if (dir_list->size < 1)
|
||||
goto error;
|
||||
{
|
||||
string_list_free(dir_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Ensure list is sorted in alphabetical order
|
||||
* > This corresponds to 'timestamp' order */
|
||||
dir_list_sort(dir_list, true);
|
||||
|
||||
/* Create core backup list */
|
||||
if (!(backup_list = (core_backup_list_t*)malloc(sizeof(*backup_list))))
|
||||
goto error;
|
||||
|
||||
backup_list->entries = NULL;
|
||||
backup_list->capacity = 0;
|
||||
backup_list->size = 0;
|
||||
|
||||
/* Create entries array
|
||||
* (Note: Set this to the full size of the directory
|
||||
* list - this may be larger than we need, but saves
|
||||
* many inefficiencies later) */
|
||||
if (!(entries = (core_backup_list_entry_t*)
|
||||
calloc(dir_list->size, sizeof(*entries))))
|
||||
goto error;
|
||||
{
|
||||
string_list_free(dir_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Create core backup list */
|
||||
if (!(backup_list = (core_backup_list_t*)malloc(sizeof(*backup_list))))
|
||||
{
|
||||
string_list_free(dir_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
backup_list->entries = NULL;
|
||||
backup_list->capacity = 0;
|
||||
backup_list->size = 0;
|
||||
|
||||
backup_list->entries = entries;
|
||||
backup_list->capacity = dir_list->size;
|
||||
@ -544,20 +547,12 @@ core_backup_list_t *core_backup_list_init(
|
||||
core_backup_add_entry(backup_list, core_filename, backup_path);
|
||||
}
|
||||
|
||||
if (backup_list->size == 0)
|
||||
goto error;
|
||||
|
||||
string_list_free(dir_list);
|
||||
|
||||
return backup_list;
|
||||
|
||||
error:
|
||||
if (dir_list)
|
||||
string_list_free(dir_list);
|
||||
|
||||
if (backup_list)
|
||||
core_backup_list_free(backup_list);
|
||||
if (backup_list->size != 0)
|
||||
return backup_list;
|
||||
|
||||
core_backup_list_free(backup_list);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user