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

Commit c6134762 authored by Daichi Hirono's avatar Daichi Hirono
Browse files

Add FuseBridgeLoop to libappfuse.

The CL adds FuseBridgeLoop class to libappfuse, which is used in the
system service to proxy fuse commands to applications.

Bug: 29970149
Test: libappfuse_test
Change-Id: I0708f608b3868721ab16ba4028fd2c17a6735af7
parent 7f8e819d
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