Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit de21fbb3 authored by Daichi Hirono's avatar Daichi Hirono Committed by android-build-merger
Browse files

Merge "Add FuseBridgeLoop to libappfuse."

am: b5ce6f02

Change-Id: I61d931b7f9b21cad7c5702c1ca362ac10ea91e00
parents 62fd68bb b5ce6f02
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -15,12 +15,12 @@ cc_library_shared {
    name: "libappfuse",
    defaults: ["libappfuse_defaults"],
    export_include_dirs: ["include"],
    srcs: ["AppFuse.cc"]
    srcs: ["FuseBuffer.cc", "FuseBridgeLoop.cc"]
}

cc_test {
    name: "libappfuse_test",
    defaults: ["libappfuse_defaults"],
    shared_libs: ["libappfuse"],
    srcs: ["tests/AppFuseTest.cc"]
    srcs: ["tests/FuseBridgeLoopTest.cc", "tests/FuseBufferTest.cc"]
}
+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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 specic language governing permissions and
 * limitations under the License.
 */

#include "libappfuse/FuseBridgeLoop.h"

#include <android-base/logging.h>
#include <android-base/unique_fd.h>

namespace android {

bool FuseBridgeLoop::Start(
    int raw_dev_fd, int raw_proxy_fd, FuseBridgeLoop::Callback* callback) {
  base::unique_fd dev_fd(raw_dev_fd);
  base::unique_fd proxy_fd(raw_proxy_fd);

  LOG(DEBUG) << "Start fuse loop.";
  while (true) {
    if (!buffer_.request.Read(dev_fd)) {
      return false;
    }

    const uint32_t opcode = buffer_.request.header.opcode;
    LOG(VERBOSE) << "Read a fuse packet, opcode=" << opcode;
    switch (opcode) {
      case FUSE_FORGET:
        // Do not reply to FUSE_FORGET.
        continue;

      case FUSE_LOOKUP:
      case FUSE_GETATTR:
      case FUSE_OPEN:
      case FUSE_READ:
      case FUSE_WRITE:
      case FUSE_RELEASE:
      case FUSE_FLUSH:
        if (!buffer_.request.Write(proxy_fd)) {
          LOG(ERROR) << "Failed to write a request to the proxy.";
          return false;
        }
        if (!buffer_.response.Read(proxy_fd)) {
          LOG(ERROR) << "Failed to read a response from the proxy.";
          return false;
        }
        break;

      case FUSE_INIT:
        buffer_.HandleInit();
        break;

      default:
        buffer_.HandleNotImpl();
        break;
    }

    if (!buffer_.response.Write(dev_fd)) {
      LOG(ERROR) << "Failed to write a response to the device.";
      return false;
    }

    if (opcode == FUSE_INIT) {
      callback->OnMount();
    }
  }
}

}  // namespace android
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
 * limitations under the License.
 */

#include "libappfuse/AppFuse.h"
#include "libappfuse/FuseBuffer.h"

#include <inttypes.h>
#include <string.h>
+40 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2016 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 specic language governing permissions and
 * limitations under the License.
 */

#ifndef ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_
#define ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_

#include "libappfuse/FuseBuffer.h"

namespace android {

class FuseBridgeLoop {
 public:
  class Callback {
   public:
    virtual void OnMount() = 0;
    virtual ~Callback() = default;
  };

  bool Start(int dev_fd, int proxy_fd, Callback* callback);

 private:
  FuseBuffer buffer_;
};

}  // namespace android

#endif  // ANDROID_LIBAPPFUSE_FUSEBRIDGELOOP_H_
+17 −4
Original line number Diff line number Diff line
@@ -14,8 +14,8 @@
 * limitations under the License.
 */

#ifndef ANDROID_LIBAPPFUSE_APPFUSE_H_
#define ANDROID_LIBAPPFUSE_APPFUSE_H_
#ifndef ANDROID_LIBAPPFUSE_FUSEBUFFER_H_
#define ANDROID_LIBAPPFUSE_FUSEBUFFER_H_

#include <linux/fuse.h>

@@ -46,7 +46,7 @@ struct FuseRequest : public FuseMessage<FuseRequest, fuse_in_header> {
    fuse_open_in open_in;
    fuse_init_in init_in;
    fuse_read_in read_in;
    char lookup_name[];
    char lookup_name[0];
  };
};

@@ -71,6 +71,19 @@ union FuseBuffer {
  void HandleNotImpl();
};

class FuseProxyLoop {
  class IFuseProxyLoopCallback {
   public:
    virtual void OnMount() = 0;
    virtual ~IFuseProxyLoopCallback() = default;
  };

  bool Start(int dev_fd, int proxy_fd, IFuseProxyLoopCallback* callback);

 private:
  FuseBuffer buffer_;
};

}  // namespace android

#endif  // ANDROID_LIBAPPFUSE_APPFUSE_H_
#endif  // ANDROID_LIBAPPFUSE_FUSEBUFFER_H_
Loading