/*
 * Copyright (C) 2007 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 <errno.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include <functional>
#include <string>
#include <thread>

#include "adb.h"
#include "adb_unique_fd.h"
#include "fdevent.h"
#include "fuse_adb_provider.h"
#include "services.h"
#include "sysdeps.h"

static void sideload_host_service(unique_fd sfd, const std::string& args) {
  int64_t file_size;
  int block_size;
  if ((sscanf(args.c_str(), "%" SCNd64 ":%d", &file_size, &block_size) != 2) || file_size <= 0 ||
      block_size <= 0) {
    printf("bad sideload-host arguments: %s\n", args.c_str());
    exit(1);
  }

  printf("sideload-host file size %" PRId64 " block size %d\n", file_size, block_size);

  int result = run_adb_fuse(sfd, file_size, block_size);

  printf("sideload_host finished\n");
  exit(result == 0 ? 0 : 1);
}

unique_fd daemon_service_to_fd(const char* name, atransport* /* transport */) {
  if (!strncmp(name, "sideload:", 9)) {
    // this exit status causes recovery to print a special error
    // message saying to use a newer adb (that supports
    // sideload-host).
    exit(3);
  } else if (!strncmp(name, "sideload-host:", 14)) {
    std::string arg(name + 14);
    return create_service_thread("sideload-host",
                                 std::bind(sideload_host_service, std::placeholders::_1, arg));
  }
  return unique_fd{};
}
