File.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Error.h>
  8. #include <AK/String.h>
  9. #include <LibCore/IODevice.h>
  10. #include <sys/stat.h>
  11. // FIXME: Make this a bit prettier.
  12. #define DEFAULT_PATH "/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"
  13. #define DEFAULT_PATH_SV "/usr/local/sbin:/usr/local/bin:/usr/bin:/bin"sv
  14. namespace Core {
  15. class File final : public IODevice {
  16. C_OBJECT(File)
  17. public:
  18. virtual ~File() override;
  19. static ErrorOr<NonnullRefPtr<File>> open(String filename, OpenMode, mode_t = 0644);
  20. String filename() const { return m_filename; }
  21. void set_filename(const String filename) { m_filename = move(filename); }
  22. bool is_directory() const;
  23. static bool is_directory(String const& filename);
  24. bool is_device() const;
  25. static bool is_device(String const& filename);
  26. bool is_block_device() const;
  27. static bool is_block_device(String const& filename);
  28. bool is_char_device() const;
  29. static bool is_char_device(String const& filename);
  30. bool is_link() const;
  31. static bool is_link(String const& filename);
  32. bool looks_like_shared_library() const;
  33. static bool looks_like_shared_library(String const& filename);
  34. static bool exists(String const& filename);
  35. static ErrorOr<size_t> size(String const& filename);
  36. static String current_working_directory();
  37. static String absolute_path(String const& path);
  38. enum class RecursionMode {
  39. Allowed,
  40. Disallowed
  41. };
  42. enum class LinkMode {
  43. Allowed,
  44. Disallowed
  45. };
  46. enum class AddDuplicateFileMarker {
  47. Yes,
  48. No,
  49. };
  50. enum class PreserveMode {
  51. Nothing = 0,
  52. Permissions = (1 << 0),
  53. Ownership = (1 << 1),
  54. Timestamps = (1 << 2),
  55. };
  56. struct CopyError : public Error {
  57. CopyError(int error_code, bool t)
  58. : Error(error_code)
  59. , tried_recursing(t)
  60. {
  61. }
  62. bool tried_recursing;
  63. };
  64. static ErrorOr<void, CopyError> copy_file(String const& dst_path, struct stat const& src_stat, File& source, PreserveMode = PreserveMode::Nothing);
  65. static ErrorOr<void, CopyError> copy_directory(String const& dst_path, String const& src_path, struct stat const& src_stat, LinkMode = LinkMode::Disallowed, PreserveMode = PreserveMode::Nothing);
  66. static ErrorOr<void, CopyError> copy_file_or_directory(String const& dst_path, String const& src_path, RecursionMode = RecursionMode::Allowed, LinkMode = LinkMode::Disallowed, AddDuplicateFileMarker = AddDuplicateFileMarker::Yes, PreserveMode = PreserveMode::Nothing);
  67. static String real_path_for(String const& filename);
  68. static ErrorOr<String> read_link(String const& link_path);
  69. static ErrorOr<void> link_file(String const& dst_path, String const& src_path);
  70. struct RemoveError : public Error {
  71. RemoveError(String f, int error_code)
  72. : Error(error_code)
  73. , file(move(f))
  74. {
  75. }
  76. String file;
  77. };
  78. static ErrorOr<void, RemoveError> remove(String const& path, RecursionMode, bool force);
  79. virtual bool open(OpenMode) override;
  80. enum class ShouldCloseFileDescriptor {
  81. No = 0,
  82. Yes
  83. };
  84. bool open(int fd, OpenMode, ShouldCloseFileDescriptor);
  85. [[nodiscard]] int leak_fd();
  86. static NonnullRefPtr<File> standard_input();
  87. static NonnullRefPtr<File> standard_output();
  88. static NonnullRefPtr<File> standard_error();
  89. private:
  90. File(Object* parent = nullptr)
  91. : IODevice(parent)
  92. {
  93. }
  94. explicit File(String filename, Object* parent = nullptr);
  95. bool open_impl(OpenMode, mode_t);
  96. String m_filename;
  97. ShouldCloseFileDescriptor m_should_close_file_descriptor { ShouldCloseFileDescriptor::Yes };
  98. };
  99. AK_ENUM_BITWISE_OPERATORS(File::PreserveMode);
  100. }