Merge "Define GIDs for internal media file types."
diff --git a/adb/adb_client.cpp b/adb/adb_client.cpp
index 0b1ba32..ef52189 100644
--- a/adb/adb_client.cpp
+++ b/adb/adb_client.cpp
@@ -46,21 +46,11 @@
static const char* __adb_server_socket_spec;
-void adb_set_transport(TransportType type, const char* serial)
-{
+void adb_set_transport(TransportType type, const char* serial) {
__adb_transport = type;
__adb_serial = serial;
}
-void adb_get_transport(TransportType* type, const char** serial) {
- if (type) {
- *type = __adb_transport;
- }
- if (serial) {
- *serial = __adb_serial;
- }
-}
-
void adb_set_socket_spec(const char* socket_spec) {
if (__adb_server_socket_spec) {
LOG(FATAL) << "attempted to reinitialize adb_server_socket_spec " << socket_spec << " (was " << __adb_server_socket_spec << ")";
diff --git a/adb/adb_client.h b/adb/adb_client.h
index d35d705..d07c1e9 100644
--- a/adb/adb_client.h
+++ b/adb/adb_client.h
@@ -40,9 +40,6 @@
// Set the preferred transport to connect to.
void adb_set_transport(TransportType type, const char* _Nullable serial);
-// Get the preferred transport to connect to.
-void adb_get_transport(TransportType* _Nullable type, const char* _Nullable* _Nullable serial);
-
// Set the socket specification for the adb server.
// This function can only be called once, and the argument must live to the end of the process.
void adb_set_socket_spec(const char* _Nonnull socket_spec);
diff --git a/libsparse/include/sparse/sparse.h b/libsparse/include/sparse/sparse.h
index 42d4adb..356f65f 100644
--- a/libsparse/include/sparse/sparse.h
+++ b/libsparse/include/sparse/sparse.h
@@ -176,6 +176,13 @@
int64_t sparse_file_len(struct sparse_file *s, bool sparse, bool crc);
/**
+ * sparse_file_block_size
+ *
+ * @s - sparse file cookie
+ */
+unsigned int sparse_file_block_size(struct sparse_file *s);
+
+/**
* sparse_file_callback - call a callback for blocks in sparse file
*
* @s - sparse file cookie
@@ -197,6 +204,24 @@
int (*write)(void *priv, const void *data, int len), void *priv);
/**
+ * sparse_file_foreach_chunk - call a callback for data blocks in sparse file
+ *
+ * @s - sparse file cookie
+ * @sparse - write in the Android sparse file format
+ * @crc - append a crc chunk
+ * @write - function to call for each block
+ * @priv - value that will be passed as the first argument to write
+ *
+ * The function has the same behavior as 'sparse_file_callback', except it only
+ * iterates on blocks that contain data.
+ *
+ * Returns 0 on success, negative errno on error.
+ */
+int sparse_file_foreach_chunk(struct sparse_file *s, bool sparse, bool crc,
+ int (*write)(void *priv, const void *data, int len, unsigned int block,
+ unsigned int nr_blocks),
+ void *priv);
+/**
* sparse_file_read - read a file into a sparse file cookie
*
* @s - sparse file cookie
diff --git a/libsparse/sparse.c b/libsparse/sparse.c
index 311678a..b175860 100644
--- a/libsparse/sparse.c
+++ b/libsparse/sparse.c
@@ -199,6 +199,57 @@
return ret;
}
+struct chunk_data {
+ void *priv;
+ unsigned int block;
+ unsigned int nr_blocks;
+ int (*write)(void *priv, const void *data, int len, unsigned int block,
+ unsigned int nr_blocks);
+};
+
+static int foreach_chunk_write(void *priv, const void *data, int len)
+{
+ struct chunk_data *chk = priv;
+
+ return chk->write(chk->priv, data, len, chk->block, chk->nr_blocks);
+}
+
+int sparse_file_foreach_chunk(struct sparse_file *s, bool sparse, bool crc,
+ int (*write)(void *priv, const void *data, int len, unsigned int block,
+ unsigned int nr_blocks),
+ void *priv)
+{
+ int ret;
+ int chunks;
+ struct chunk_data chk;
+ struct output_file *out;
+ struct backed_block *bb;
+
+ chk.priv = priv;
+ chk.write = write;
+ chk.block = chk.nr_blocks = 0;
+ chunks = sparse_count_chunks(s);
+ out = output_file_open_callback(foreach_chunk_write, &chk,
+ s->block_size, s->len, false, sparse,
+ chunks, crc);
+
+ if (!out)
+ return -ENOMEM;
+
+ for (bb = backed_block_iter_new(s->backed_block_list); bb;
+ bb = backed_block_iter_next(bb)) {
+ chk.block = backed_block_block(bb);
+ chk.nr_blocks = (backed_block_len(bb) - 1) / s->block_size + 1;
+ ret = sparse_file_write_block(out, bb);
+ if (ret)
+ return ret;
+ }
+
+ output_file_close(out);
+
+ return ret;
+}
+
static int out_counter_write(void *priv, const void *data __unused, int len)
{
int64_t *count = priv;
@@ -230,6 +281,11 @@
return count;
}
+unsigned int sparse_file_block_size(struct sparse_file *s)
+{
+ return s->block_size;
+}
+
static struct backed_block *move_chunks_up_to_len(struct sparse_file *from,
struct sparse_file *to, unsigned int len)
{