/*
- * Copyright (C) 2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2007-2008 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** -lv */
LS_MODE_VERBOSE,
/** -lm */
- LS_MODE_MBOX
+ LS_MODE_MBOX,
+ /** -lc */
+ LS_MODE_CHUNKS
};
/** The flags accepted by the ls command. */
AFTCOL_CHUNKS, &chunk_table_obj);
if (ret < 0)
return ret;
+ afd->afhi.chunk_table = NULL;
ret = mmap_full_file(path, O_RDONLY, &map.data,
&map.size, &afd->fd);
if (ret < 0)
aced.old_afsi = &old_afsi;
afs_event(AFSI_CHANGE, NULL, &aced);
ret = save_afd(afd);
- free(afd->afhi.chunk_table);
- if (ret < 0)
- goto err;
err:
+ free(afd->afhi.chunk_table);
osl_close_disk_object(&chunk_table_obj);
return ret;
}
static char *make_filename_lines(const char *path, unsigned flags)
{
- char *basename, *dirname;
- char *ret;
+ char *dirname, *ret;
+ const char *basename;
if (!(flags & LS_FLAG_FULL_PATH))
return make_message("%s: %s\n",
dirname = para_dirname(path);
ret = make_message("%s: %s\n%s: %s\n%s: %s\n",
status_item_list[SI_PATH], path,
- status_item_list[SI_DIRECTORY], dirname,
- status_item_list[SI_BASENAME], basename);
- free(basename);
+ status_item_list[SI_DIRECTORY], dirname? dirname : "?",
+ status_item_list[SI_BASENAME], basename? basename : "?");
free(dirname);
return ret;
}
+static int print_chunk_table(struct ls_data *d, struct para_buffer *b)
+{
+ struct osl_object chunk_table_obj;
+ struct osl_row *aft_row;
+ int ret, i;
+ char *buf;
+
+ ret = aft_get_row_of_hash(d->hash, &aft_row);
+ if (ret < 0)
+ return ret;
+ ret = osl_open_disk_object(audio_file_table, aft_row,
+ AFTCOL_CHUNKS, &chunk_table_obj);
+ if (ret < 0)
+ return ret;
+ para_printf(b, "%s\n"
+ "chunk_time: %lu:%lu\nchunk_offsets: ",
+ d->path,
+ (long unsigned) d->afhi.chunk_tv.tv_sec,
+ (long unsigned) d->afhi.chunk_tv.tv_usec
+ );
+ buf = chunk_table_obj.data;
+ for (i = 0; i <= d->afhi.chunks_total; i++)
+ para_printf(b, "%u ",
+ (unsigned) read_u32(buf + 4 * i));
+ osl_close_disk_object(&chunk_table_obj);
+ para_printf(b, "\n");
+ return 1;
+}
+
static int print_list_item(struct ls_data *d, struct ls_options *opts,
struct para_buffer *b, time_t current_time)
{
para_printf(b, "%s\n", d->path);
return 1;
}
+ if (opts->mode == LS_MODE_CHUNKS)
+ return print_chunk_table(d, b);
get_attribute_bitmap(&afsi->attributes, att_buf);
ret = get_local_time(&afsi->last_played, last_played_time,
sizeof(last_played_time), current_time, opts->mode);
lyrics_lines = make_lyrics_lines(afsi);
image_lines = make_image_lines(afsi);
filename_lines = make_filename_lines(d->path, opts->flags);
- if (opts->mode == LS_MODE_MBOX)
+ if (opts->mode == LS_MODE_MBOX) {
+ const char *bn = para_basename(d->path);
para_printf(b,
"From foo@localhost %s\n"
"Received: from\nTo: bar\nFrom: a\n"
"Subject: %s\n\n",
last_played_time,
- d->path);
+ bn? bn : "?");
+ }
para_printf(b,
"%s" /* filename stuff */
"%s%s%s%s" /* score */
case 'm':
mode = LS_MODE_MBOX;
continue;
+ case 'c':
+ mode = LS_MODE_CHUNKS;
+ continue;
default:
return -E_AFT_SYNTAX;
}
afs_event(AUDIO_FILE_ADD, &msg, aft_row);
out:
if (ret < 0)
- para_printf(&msg, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&msg, "%s\n", para_strerror(-ret));
if (!msg.buf)
return 0;
result->data = msg.buf;
out_free:
if (ret < 0 && send_ret >= 0)
send_ret = send_va_buffer(pad->fd, "failed to add %s (%s)\n", path,
- PARA_STRERROR(-ret));
+ para_strerror(-ret));
free(obj.data);
if (afhi_ptr)
free(afhi_ptr->chunk_table);
char *path;
ret = verify_path(argv[i], &path);
if (ret < 0) {
- ret = send_va_buffer(fd, "%s: %s\n", argv[i], PARA_STRERROR(-ret));
+ ret = send_va_buffer(fd, "%s: %s\n", argv[i],
+ para_strerror(-ret));
if (ret < 0)
return ret;
continue;
else
ret = add_one_audio_file(path, &pad);
if (ret < 0) {
- send_va_buffer(fd, "%s: %s\n", path, PARA_STRERROR(-ret));
+ send_va_buffer(fd, "%s: %s\n", path, para_strerror(-ret));
free(path);
return ret;
}
struct com_touch_options *cto;
/** Message buffer. */
struct para_buffer pb;
+ /** How many audio files matched the given pattern. */
+ unsigned num_matches;
};
static int touch_audio_file(__a_unused struct osl_table *table,
ret = get_afsi_object_of_row(row, &obj);
if (ret < 0) {
- para_printf(&tad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
+ para_printf(&tad->pb, "%s: %s\n", name, para_strerror(-ret));
return 1;
}
ret = load_afsi(&old_afsi, &obj);
if (ret < 0) {
- para_printf(&tad->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
+ para_printf(&tad->pb, "%s: %s\n", name, para_strerror(-ret));
return 1;
}
new_afsi = old_afsi;
if (tad->cto->last_played >= 0)
new_afsi.last_played = tad->cto->last_played;
}
+ tad->num_matches++;
save_afsi(&new_afsi, &obj); /* in-place update */
aced.aft_row = row;
aced.old_afsi = &old_afsi;
pmd.fnmatch_flags |= FNM_PATHNAME;
ret = for_each_matching_row(&pmd);
if (ret < 0)
- para_printf(&tad.pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&tad.pb, "%s\n", para_strerror(-ret));
+ else
+ if (!tad.num_matches)
+ para_printf(&tad.pb, "no matches\n");
if (tad.pb.buf) {
result->data = tad.pb.buf;
result->size = tad.pb.size;
return -E_AFT_SYNTAX;
ret = send_option_arg_callback_request(&query, argc - i,
argv + i, com_touch_callback, &result);
- if (ret > 0) {
- send_buffer(fd, (char *)result.data);
- free(result.data);
- } else if (ret < 0)
- send_va_buffer(fd, "%s\n", PARA_STRERROR(-ret));
+ if (!ret)
+ return 0;
+ if (ret < 0) {
+ send_va_buffer(fd, "%s\n", para_strerror(-ret));
+ return ret;
+ }
+ ret = send_buffer(fd, (char *)result.data);
+ free(result.data);
return ret;
}
afs_event(AUDIO_FILE_REMOVE, &crd->pb, row);
ret = osl_del_row(audio_file_table, row);
if (ret < 0)
- para_printf(&crd->pb, "%s: %s\n", name, PARA_STRERROR(-ret));
+ para_printf(&crd->pb, "%s: %s\n", name, para_strerror(-ret));
else
crd->num_removed++;
return 1;
pmd.fnmatch_flags |= FNM_PATHNAME;
ret = for_each_matching_row(&pmd);
if (ret < 0)
- para_printf(&crd.pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&crd.pb, "%s\n", para_strerror(-ret));
if (!crd.num_removed && !(crd.flags & RM_FLAG_FORCE))
para_printf(&crd.pb, "no matches -- nothing removed\n");
else {
return -E_AFT_SYNTAX;
ret = send_option_arg_callback_request(&query, argc - i, argv + i,
com_rm_callback, &result);
- if (ret > 0) {
- send_buffer(fd, (char *)result.data);
- free(result.data);
- } else if (ret < 0)
- send_va_buffer(fd, "%s\n", PARA_STRERROR(-ret));
+ if (!ret)
+ return 0;
+ if (ret < 0) {
+ send_va_buffer(fd, "%s\n", para_strerror(-ret));
+ return ret;
+ }
+ ret = send_buffer(fd, (char *)result.data);
+ free(result.data);
return ret;
}
ret = for_each_matching_row(&pmd);
out:
if (ret < 0)
- para_printf(&cad.pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(&cad.pb, "%s\n", para_strerror(-ret));
if (cad.flags & CPSI_FLAG_VERBOSE) {
if (cad.num_copied)
para_printf(&cad.pb, "copied requested afsi from %s "
flags = ~(unsigned)CPSI_FLAG_VERBOSE | flags;
ret = send_option_arg_callback_request(&options, argc - i, argv + i,
com_cpsi_callback, &result);
- if (ret > 0) {
- send_buffer(fd, (char *)result.data);
- free(result.data);
- } else
- send_va_buffer(fd, "%s\n", PARA_STRERROR(-ret));
+ if (!ret)
+ return 0;
+ if (ret < 0) {
+ send_va_buffer(fd, "%s\n", para_strerror(-ret));
+ return ret;
+ }
+ ret = send_buffer(fd, (char *)result.data);
+ free(result.data);
return ret;
}
char *blob_name;
if (ret < 0) {
- para_printf(pb, "%s\n", PARA_STRERROR(-ret));
+ para_printf(pb, "%s\n", para_strerror(-ret));
return 1;
}
if (stat(path, &statbuf) < 0)
}
ret = get_afsi_of_row(row, &afsi);
if (ret < 0) {
- para_printf(pb, "%s: %s\n", path, PARA_STRERROR(-ret));
+ para_printf(pb, "%s: %s\n", path, para_strerror(-ret));
return 1;
}
ret = lyr_get_name_by_id(afsi.lyrics_id, &blob_name);
if (ret < 0)
para_printf(pb, "%s lyrics id %u: %s\n", path, afsi.lyrics_id,
- PARA_STRERROR(-ret));
+ para_strerror(-ret));
ret = img_get_name_by_id(afsi.image_id, &blob_name);
if (ret < 0)
para_printf(pb, "%s image id %u: %s\n", path, afsi.image_id,
- PARA_STRERROR(-ret));
+ para_strerror(-ret));
return 1;
}