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

Commit b5ce6f02 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "Add FuseBridgeLoop to libappfuse."

parents cd368c64 c6134762
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