aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Benjamin Barenblat <bbaren@mit.edu>2016-02-12 23:02:57 -0500
committerGravatar Benjamin Barenblat <bbaren@mit.edu>2016-02-12 23:02:57 -0500
commitd9370d044e237df9df9336adad836956d42d7c85 (patch)
tree26d318f74a1467d1b46e792daa055e2ddbcef20e
parentb32be8ebf5e77c1ee9c8d6015a34e7e31b8423c8 (diff)
Link in FUSE
Start linking FUSE and jumping into FUSE on boot. Also define a couple of trivial operations, but don’t actually do filename encoding yet.
-rw-r--r--CMakeLists.txt1
-rw-r--r--src/CMakeLists.txt2
-rw-r--r--src/encoding.cc84
-rw-r--r--src/encoding.h39
-rw-r--r--src/operations.cc63
-rw-r--r--src/operations.h32
-rw-r--r--src/scoville.cc120
7 files changed, 239 insertions, 102 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 785bad0..a664713 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,5 +28,6 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftrapv")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector-strong --param=ssp-buffer-size=4")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Weverything -Wno-c++98-compat")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-weak-vtables")
add_subdirectory(src)
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 751bd39..5f1b286 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -32,6 +32,8 @@ set(
add_executable(
scoville
+ encoding.cc
+ operations.cc
scoville.cc
)
target_include_directories(
diff --git a/src/encoding.cc b/src/encoding.cc
new file mode 100644
index 0000000..93773a6
--- /dev/null
+++ b/src/encoding.cc
@@ -0,0 +1,84 @@
+// Copyright 2016 Benjamin Barenblat
+//
+// 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 "encoding.h"
+
+#include <array>
+#include <cstdlib>
+#include <sstream>
+#include <string>
+
+namespace scoville {
+
+namespace {
+
+void WriteAsciiAsHex(const char c, std::ostringstream* const out) {
+ if (1 < sizeof(c) && 0x100 <= c) {
+ // Not ASCII!
+ throw EncodingFailure("could not encode non-ASCII character '" +
+ std::string(1, c) + "'");
+ }
+ *out << std::hex << static_cast<int>(c);
+}
+
+char ReadHexAsAscii(std::istringstream* const in) {
+ std::array<char, 3> hex_str;
+ in->get(hex_str.data(), hex_str.size());
+ char* decoded_end;
+ const char result =
+ static_cast<char>(std::strtol(hex_str.data(), &decoded_end, 16));
+ if (decoded_end == hex_str.data()) {
+ throw DecodingFailure("could not decode invalid hex");
+ }
+ return result;
+}
+
+bool IsVfatBadCharacter(const char c) noexcept {
+ return (0 <= c && c < 0x20) || c == '*' || c == '?' || c == '<' || c == '>' ||
+ c == '|' || c == '"' || c == ':' || c == '/' || c == '\\';
+}
+
+} // namespace
+
+void Encode(std::istringstream* const in, std::ostringstream* const out) {
+ char c;
+ while (!in->get(c).eof()) {
+ if (IsVfatBadCharacter(c)) {
+ *out << '%';
+ WriteAsciiAsHex(c, out);
+ } else if (c == '%') {
+ *out << "%%";
+ } else {
+ *out << c;
+ }
+ }
+}
+
+void Decode(std::istringstream* const in, std::ostringstream* const out) {
+ char c;
+ while (!in->get(c).eof()) {
+ if (c == '%') {
+ if (in->peek() == '%') {
+ in->ignore();
+ *out << "%";
+ } else {
+ *out << ReadHexAsAscii(in);
+ }
+ } else {
+ *out << c;
+ }
+ }
+}
+
+} // scoville
diff --git a/src/encoding.h b/src/encoding.h
new file mode 100644
index 0000000..717d421
--- /dev/null
+++ b/src/encoding.h
@@ -0,0 +1,39 @@
+// Copyright 2016 Benjamin Barenblat
+//
+// 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.
+
+#ifndef ENCODING_H_
+#define ENCODING_H_
+
+#include <sstream>
+#include <stdexcept>
+
+namespace scoville {
+
+class EncodingFailure : public std::logic_error {
+ public:
+ using std::logic_error::logic_error;
+};
+
+class DecodingFailure : public std::logic_error {
+ public:
+ using std::logic_error::logic_error;
+};
+
+void Encode(std::istringstream*, std::ostringstream*);
+
+void Decode(std::istringstream*, std::ostringstream*);
+
+} // scoville
+
+#endif // ENCODING_H_
diff --git a/src/operations.cc b/src/operations.cc
new file mode 100644
index 0000000..a26b868
--- /dev/null
+++ b/src/operations.cc
@@ -0,0 +1,63 @@
+// Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
+// Copyright (C) 2011 Sebastian Pipping <sebastian@pipping.org>
+// Copyright (C) 2016 Benjamin Barenblat <benjamin@barenblat.name>
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details.
+//
+// You should have received a copy of the GNU General Public License along with
+// this program. If not, see <http://www.gnu.org/licenses/>.
+
+#include "operations.h"
+
+#include <cerrno>
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+#pragma clang diagnostic ignored "-Wdocumentation"
+#pragma clang diagnostic ignored "-Wpadded"
+#pragma clang diagnostic ignored "-Wunused-macros"
+#define FUSE_USE_VERSION 26
+#include <fuse.h>
+#pragma clang diagnostic pop
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+namespace scoville {
+
+namespace {
+
+int GetAttr(const char* const path, struct stat* output) {
+ if (lstat(path, output) == -1) {
+ return -errno;
+ }
+ return 0;
+}
+
+int ReadLink(const char* const path, char *const output, const size_t output_size) {
+ const ssize_t bytes_written = readlink(path, output, output_size);
+ if (bytes_written == -1) {
+ return -errno;
+ }
+ output[bytes_written] = '\0';
+ return 0;
+}
+
+} // namespace
+
+fuse_operations FuseOperations() {
+ fuse_operations result;
+ result.getattr = &GetAttr;
+ result.readlink = &ReadLink;
+ return result;
+}
+
+} // namespace scoville
diff --git a/src/operations.h b/src/operations.h
new file mode 100644
index 0000000..e4672eb
--- /dev/null
+++ b/src/operations.h
@@ -0,0 +1,32 @@
+// Copyright 2016 Benjamin Barenblat
+//
+// 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.
+
+#ifndef OPERATIONS_H_
+#define OPERATIONS_H_
+
+#pragma clang diagnostic push
+#pragma clang diagnostic ignored "-Wc++98-compat-pedantic"
+#pragma clang diagnostic ignored "-Wdocumentation"
+#pragma clang diagnostic ignored "-Wpadded"
+#define FUSE_USE_VERSION 26
+#include <fuse.h>
+#pragma clang diagnostic pop
+
+namespace scoville {
+
+fuse_operations FuseOperations();
+
+} // namespace scoville
+
+#endif // OPERATIONS_H_
diff --git a/src/scoville.cc b/src/scoville.cc
index c0d4d79..db39ee8 100644
--- a/src/scoville.cc
+++ b/src/scoville.cc
@@ -1,117 +1,33 @@
-// Copyright 2016 Benjamin Barenblat
+// Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
+// Copyright (C) 2011 Sebastian Pipping <sebastian@pipping.org>
+// Copyright (C) 2016 Benjamin Barenblat <benjamin@barenblat.name>
//
-// 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
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// This program is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details.
//
-// 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 <array>
-#include <cstdlib>
-#include <sstream>
-#include <stdexcept>
-#include <string>
+// You should have received a copy of the GNU General Public License along with
+// this program. If not, see <http://www.gnu.org/licenses/>.
#include <glog/logging.h>
-namespace {
-
-class EncodingFailure : public std::logic_error {
- public:
- using std::logic_error::logic_error;
-};
-
-class DecodingFailure : public std::logic_error {
- public:
- using std::logic_error::logic_error;
-};
-
-void WriteAsciiAsHex(const char c, std::ostringstream* const out) {
- if (1 < sizeof(c) && 0x100 <= c) {
- // Not ASCII!
- throw EncodingFailure("could not encode non-ASCII character '" +
- std::string(1, c) + "'");
- }
- *out << std::hex << static_cast<int>(c);
-}
-
-char ReadHexAsAscii(std::istringstream* const in) {
- std::array<char, 3> hex_str;
- in->get(hex_str.data(), hex_str.size());
- char* decoded_end;
- const char result =
- static_cast<char>(std::strtol(hex_str.data(), &decoded_end, 16));
- if (decoded_end == hex_str.data()) {
- throw DecodingFailure("could not decode invalid hex");
- }
- return result;
-}
-
-bool IsVfatBadCharacter(const char c) noexcept {
- return (0 <= c && c < 0x20) || c == '*' || c == '?' || c == '<' || c == '>' ||
- c == '|' || c == '"' || c == ':' || c == '/' || c == '\\';
-}
-
-void Encode(std::istringstream* const in, std::ostringstream* const out) {
- char c;
- while (!in->get(c).eof()) {
- if (IsVfatBadCharacter(c)) {
- *out << '%';
- WriteAsciiAsHex(c, out);
- } else if (c == '%') {
- *out << "%%";
- } else {
- *out << c;
- }
- }
-}
+#include "operations.h"
-void Decode(std::istringstream* const in, std::ostringstream* const out) {
- char c;
- while (!in->get(c).eof()) {
- if (c == '%') {
- if (in->peek() == '%') {
- in->ignore();
- *out << "%";
- } else {
- *out << ReadHexAsAscii(in);
- }
- } else {
- *out << c;
- }
- }
-}
+namespace {
} // namespace
-int main(int, char* const argv[]) {
+int main(const int argc, char* argv[]) {
FLAGS_logtostderr = true;
google::InstallFailureSignalHandler();
google::InitGoogleLogging(argv[0]);
- LOG(INFO) << "Got " << argv[1];
-
- std::string result;
- {
- std::istringstream in(argv[1]);
- std::ostringstream out;
- Encode(&in, &out);
- result = out.str();
- }
- LOG(INFO) << "Encoded to " << result;
-
- {
- std::istringstream in(result);
- std::ostringstream out;
- Decode(&in, &out);
- result = out.str();
- }
- LOG(INFO) << "Decoded to " << result;
- return 0;
+ const fuse_operations operations = scoville::FuseOperations();
+ return fuse_main(argc, argv, &operations, nullptr);
}