platform_bootable_recovery/minadbd/fuse_adb_provider.c
Doug Zongker 18a78e0a16 refactor fuse sideloading code
Split the adb-specific portions (fetching a block from the adb host
and closing the connections) out from the rest of the FUSE filesystem
code, so that we can reuse the fuse stuff for installing off sdcards
as well.

Change-Id: I0ba385fd35999c5f5cad27842bc82024a264dd14
2014-07-10 10:55:07 -07:00

67 lines
1.8 KiB
C

/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include "adb.h"
#include "fuse_sideload.h"
struct adb_data {
int sfd; // file descriptor for the adb channel
uint64_t file_size;
uint32_t block_size;
};
static int read_block_adb(void* cookie, uint32_t block, uint8_t* buffer, uint32_t fetch_size) {
struct adb_data* ad = (struct adb_data*)cookie;
char buf[10];
snprintf(buf, sizeof(buf), "%08u", block);
if (writex(ad->sfd, buf, 8) < 0) {
fprintf(stderr, "failed to write to adb host: %s\n", strerror(errno));
return -EIO;
}
if (readx(ad->sfd, buffer, fetch_size) < 0) {
fprintf(stderr, "failed to read from adb host: %s\n", strerror(errno));
return -EIO;
}
return 0;
}
static void close_adb(void* cookie) {
struct adb_data* ad = (struct adb_data*)cookie;
writex(ad->sfd, "DONEDONE", 8);
}
int run_adb_fuse(int sfd, uint64_t file_size, uint32_t block_size) {
struct adb_data ad;
struct provider_vtab vtab;
ad.sfd = sfd;
ad.file_size = file_size;
ad.block_size = block_size;
vtab.read_block = read_block_adb;
vtab.close = close_adb;
return run_fuse_sideload(&vtab, &ad, file_size, block_size);
}