pos += afhi_size;
PARA_DEBUG_LOG("size: %zu, chunks start at %d\n", size, pos);
write_u16(buf + AFTROW_CHUNKS_OFFSET_POS, pos);
- save_chunk_table(afhi, buf + pos);
+ if (afhi)
+ save_chunk_table(afhi, buf + pos);
PARA_DEBUG_LOG("last byte in buf: %p\n", buf + size - 1);
obj->data = buf;
obj->size = size;
static int add_one_audio_file(const char *path, const void *private_data)
{
- int ret, ret2;
+ int ret, send_ret = 1;
uint8_t format_num = -1;
const struct private_add_data *pad = private_data;
struct afh_info afhi, *afhi_ptr = NULL;
ret = 1;
if (pb && (pad->flags & ADD_FLAG_LAZY)) { /* lazy is really cheap */
if (pad->flags & ADD_FLAG_VERBOSE)
- ret = send_va_buffer(pad->fd, "lazy-ignore: %s\n", path);
+ send_ret = send_va_buffer(pad->fd, "lazy-ignore: %s\n", path);
goto out_free;
}
/* We still want to add this file. Compute its hash. */
goto out_free;
hash_function(map.data, map.size, hash);
- /* Check whether database contains file with the same hash. */
+ /* Check whether the database contains a file with the same hash. */
query.data = hash;
query.size = HASH_SIZE;
ret = send_callback_request(hash_sister_callback, &query, &result);
if (ret < 0 && ret != -E_RB_KEY_NOT_FOUND)
- goto out_free;
+ goto out_unmap;
if (ret >= 0) {
hs = *(struct osl_row **)result.data;
free(result.data);
}
/* Return success if we already know this file. */
ret = 1;
- if (pb && hs && hs == pb && (!(pad->flags & ADD_FLAG_FORCE))) {
+ if (pb && hs && hs == pb && !(pad->flags & ADD_FLAG_FORCE)) {
if (pad->flags & ADD_FLAG_VERBOSE)
- ret = send_va_buffer(pad->fd,
+ send_ret = send_va_buffer(pad->fd,
"%s exists, not forcing update\n", path);
goto out_unmap;
}
/*
- * we won't recalculate the audio format info and the chunk table if
- * there is a hash sister unless in FORCE mode.
+ * We won't recalculate the audio format info and the chunk table if
+ * there is a hash sister and FORCE was not given.
*/
if (!hs || (pad->flags & ADD_FLAG_FORCE)) {
ret = compute_afhi(path, map.data, map.size, &afhi);
format_num = ret;
afhi_ptr = &afhi;
}
+ munmap(map.data, map.size);
if (pad->flags & ADD_FLAG_VERBOSE) {
- ret = send_va_buffer(pad->fd, "adding %s\n", path);
- if (ret < 0)
- goto out_unmap;
+ send_ret = send_va_buffer(pad->fd, "adding %s\n", path);
+ if (send_ret < 0)
+ goto out_free;
}
- munmap(map.data, map.size);
save_audio_file_info(hash, path, afhi_ptr, pad->flags, format_num, &obj);
/* Ask afs to consider this entry for adding. */
ret = send_callback_request(com_add_callback, &obj, &result);
if (ret > 0) {
- ret2 = send_va_buffer(pad->fd, "%s", (char *)result.data);
+ send_ret = send_va_buffer(pad->fd, "%s", (char *)result.data);
free(result.data);
- if (ret >= 0 && ret2 < 0)
- ret = ret2;
}
goto out_free;
out_unmap:
munmap(map.data, map.size);
out_free:
- if (ret < 0 && ret != -E_SEND)
- send_va_buffer(pad->fd, "failed to add %s (%s)\n", path,
+ if (ret < 0 && send_ret >= 0)
+ send_ret = send_va_buffer(pad->fd, "failed to add %s (%s)\n", path,
PARA_STRERROR(-ret));
free(obj.data);
if (afhi_ptr)
free(afhi_ptr->chunk_table);
- /* it's not an error if not all files could be added */
- return ret == -E_SEND? ret : 1;
+ /* Stop adding files only on send errors. */
+ return send_ret;
}
int com_add(int fd, int argc, char * const * const argv)