tg_cli works under posix
GitOrigin-RevId: 632e05de183a55b045f74e09ca8d41060f55ad41
This commit is contained in:
parent
180de003a6
commit
bf15a5ac12
@ -30,6 +30,7 @@
|
|||||||
#include "td/utils/port/FileFd.h"
|
#include "td/utils/port/FileFd.h"
|
||||||
#include "td/utils/port/signals.h"
|
#include "td/utils/port/signals.h"
|
||||||
#include "td/utils/port/Stat.h"
|
#include "td/utils/port/Stat.h"
|
||||||
|
#include "td/utils/port/StdStreams.h"
|
||||||
#include "td/utils/port/thread_local.h"
|
#include "td/utils/port/thread_local.h"
|
||||||
#include "td/utils/ScopeGuard.h"
|
#include "td/utils/ScopeGuard.h"
|
||||||
#include "td/utils/Slice.h"
|
#include "td/utils/Slice.h"
|
||||||
@ -183,6 +184,9 @@ class CliLog : public LogInterface {
|
|||||||
void append(CSlice slice, int log_level) override {
|
void append(CSlice slice, int log_level) override {
|
||||||
#ifdef USE_READLINE
|
#ifdef USE_READLINE
|
||||||
deactivate_readline();
|
deactivate_readline();
|
||||||
|
SCOPE_EXIT {
|
||||||
|
reactivate_readline();
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
if (log_level == VERBOSITY_NAME(PLAIN)) {
|
if (log_level == VERBOSITY_NAME(PLAIN)) {
|
||||||
#if TD_WINDOWS
|
#if TD_WINDOWS
|
||||||
@ -193,9 +197,6 @@ class CliLog : public LogInterface {
|
|||||||
} else {
|
} else {
|
||||||
default_log_interface->append(slice, log_level);
|
default_log_interface->append(slice, log_level);
|
||||||
}
|
}
|
||||||
#ifdef USE_READLINE
|
|
||||||
reactivate_readline();
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
void rotate() override {
|
void rotate() override {
|
||||||
}
|
}
|
||||||
@ -634,13 +635,14 @@ class CliClient final : public Actor {
|
|||||||
#if TD_WINDOWS
|
#if TD_WINDOWS
|
||||||
stdin_reader_.reset();
|
stdin_reader_.reset();
|
||||||
#else
|
#else
|
||||||
|
unsubscribe(stdin_.get_poll_info().get_pollable_fd_ref());
|
||||||
is_stdin_reader_stopped_ = true;
|
is_stdin_reader_stopped_ = true;
|
||||||
#endif
|
#endif
|
||||||
yield();
|
yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_READLINE
|
#ifdef USE_READLINE
|
||||||
Fd stdin_;
|
FileFd stdin_;
|
||||||
#else
|
#else
|
||||||
using StreamConnection = BufferedFd<Fd>;
|
using StreamConnection = BufferedFd<Fd>;
|
||||||
StreamConnection stdin_;
|
StreamConnection stdin_;
|
||||||
@ -787,19 +789,18 @@ class CliClient final : public Actor {
|
|||||||
};
|
};
|
||||||
stdin_reader_ = create_actor_on_scheduler<StdinReader>("stdin_reader", stdin_id, actor_shared(this, 1));
|
stdin_reader_ = create_actor_on_scheduler<StdinReader>("stdin_reader", stdin_id, actor_shared(this, 1));
|
||||||
#else
|
#else
|
||||||
Fd::Stdin().set_is_blocking(false).ensure();
|
detail::set_native_socket_is_blocking(Stdin().get_native_fd(), false).ensure();
|
||||||
#ifdef USE_READLINE
|
#ifdef USE_READLINE
|
||||||
deactivate_readline();
|
deactivate_readline();
|
||||||
rl_callback_handler_install(prompt, cb_linehandler);
|
rl_callback_handler_install(prompt, cb_linehandler);
|
||||||
rl_attempted_completion_function = tg_cli_completion;
|
rl_attempted_completion_function = tg_cli_completion;
|
||||||
reactivate_readline();
|
reactivate_readline();
|
||||||
|
|
||||||
stdin_ = Fd::Stdin().clone();
|
stdin_ = std::move(Stdin());
|
||||||
#else
|
#else
|
||||||
stdin_ = StreamConnection(Fd::Stdin().clone());
|
stdin_ = StreamConnection(std::move(Stdin()));
|
||||||
#endif
|
#endif
|
||||||
stdin_.get_fd().set_observer(this);
|
subscribe(stdin_.get_poll_info().extract_pollable_fd(this), PollFlags::Read());
|
||||||
subscribe(stdin_, Fd::Read);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (get_chat_list_) {
|
if (get_chat_list_) {
|
||||||
@ -3405,7 +3406,7 @@ class CliClient final : public Actor {
|
|||||||
#ifdef USE_READLINE
|
#ifdef USE_READLINE
|
||||||
if (can_read(stdin_)) {
|
if (can_read(stdin_)) {
|
||||||
rl_callback_read_char();
|
rl_callback_read_char();
|
||||||
stdin_.get_fd().clear_flags(Fd::Read);
|
stdin_.get_poll_info().clear_flags(PollFlags::Read());
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
auto r = stdin_.flush_read();
|
auto r = stdin_.flush_read();
|
||||||
|
@ -42,6 +42,7 @@ set(TDUTILS_SOURCE
|
|||||||
td/utils/port/sleep.cpp
|
td/utils/port/sleep.cpp
|
||||||
td/utils/port/SocketFd.cpp
|
td/utils/port/SocketFd.cpp
|
||||||
td/utils/port/Stat.cpp
|
td/utils/port/Stat.cpp
|
||||||
|
td/utils/port/StdStreams.cpp
|
||||||
td/utils/port/thread_local.cpp
|
td/utils/port/thread_local.cpp
|
||||||
td/utils/port/wstring_convert.cpp
|
td/utils/port/wstring_convert.cpp
|
||||||
|
|
||||||
@ -104,6 +105,7 @@ set(TDUTILS_SOURCE
|
|||||||
td/utils/port/sleep.h
|
td/utils/port/sleep.h
|
||||||
td/utils/port/SocketFd.h
|
td/utils/port/SocketFd.h
|
||||||
td/utils/port/Stat.h
|
td/utils/port/Stat.h
|
||||||
|
td/utils/port/StdStreams.h
|
||||||
td/utils/port/thread.h
|
td/utils/port/thread.h
|
||||||
td/utils/port/thread_local.h
|
td/utils/port/thread_local.h
|
||||||
td/utils/port/UdpSocketFd.h
|
td/utils/port/UdpSocketFd.h
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include "td/utils/logging.h"
|
#include "td/utils/logging.h"
|
||||||
|
|
||||||
#include "td/utils/port/Clocks.h"
|
#include "td/utils/port/Clocks.h"
|
||||||
#include "td/utils/port/FileFd.h"
|
#include "td/utils/port/StdStreams.h"
|
||||||
#include "td/utils/port/thread_local.h"
|
#include "td/utils/port/thread_local.h"
|
||||||
#include "td/utils/Slice.h"
|
#include "td/utils/Slice.h"
|
||||||
#include "td/utils/Time.h"
|
#include "td/utils/Time.h"
|
||||||
@ -119,18 +119,6 @@ TsCerr::TsCerr() {
|
|||||||
TsCerr::~TsCerr() {
|
TsCerr::~TsCerr() {
|
||||||
exitCritical();
|
exitCritical();
|
||||||
}
|
}
|
||||||
namespace {
|
|
||||||
FileFd &Stderr() {
|
|
||||||
static FileFd res = FileFd::from_native_fd(NativeFd(
|
|
||||||
#if TD_PORT_POSIX
|
|
||||||
2
|
|
||||||
#elif TD_PORT_WINDOWS
|
|
||||||
GetStdHandle(STD_ERROR_HANDLE)
|
|
||||||
#endif
|
|
||||||
, true)).move_as_ok();
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
} // namespace
|
|
||||||
TsCerr &TsCerr::operator<<(Slice slice) {
|
TsCerr &TsCerr::operator<<(Slice slice) {
|
||||||
auto &fd = Stderr();
|
auto &fd = Stderr();
|
||||||
if (fd.empty()) {
|
if (fd.empty()) {
|
||||||
|
47
tdutils/td/utils/port/StdStreams.cpp
Normal file
47
tdutils/td/utils/port/StdStreams.cpp
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
#include "td/utils/port/StdStreams.h"
|
||||||
|
|
||||||
|
namespace td {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
template <class T>
|
||||||
|
FileFd create(T handle) {
|
||||||
|
return FileFd::from_native_fd(NativeFd(handle, true)).move_as_ok();
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
FileFd &Stdin() {
|
||||||
|
static FileFd res = create(
|
||||||
|
#if TD_PORT_POSIX
|
||||||
|
0
|
||||||
|
#elif TD_PORT_WINDOWS
|
||||||
|
GetStdHandle(STD_INPUT_HANDLE)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
FileFd &Stdout() {
|
||||||
|
static FileFd res = create(
|
||||||
|
#if TD_PORT_POSIX
|
||||||
|
1
|
||||||
|
#elif TD_PORT_WINDOWS
|
||||||
|
GetStdHandle(STD_OUTPUT_HANDLE)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
FileFd &Stderr() {
|
||||||
|
static FileFd res = create(
|
||||||
|
#if TD_PORT_POSIX
|
||||||
|
2
|
||||||
|
#elif TD_PORT_WINDOWS
|
||||||
|
GetStdHandle(STD_ERROR_HANDLE)
|
||||||
|
#endif
|
||||||
|
);
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
} // namespace td
|
16
tdutils/td/utils/port/StdStreams.h
Normal file
16
tdutils/td/utils/port/StdStreams.h
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//
|
||||||
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2018
|
||||||
|
//
|
||||||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||||||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||||
|
//
|
||||||
|
#pragma once
|
||||||
|
#include "td/utils/port/FileFd.h"
|
||||||
|
|
||||||
|
namespace td {
|
||||||
|
|
||||||
|
FileFd &Stdin();
|
||||||
|
FileFd &Stdout();
|
||||||
|
FileFd &Stderr();
|
||||||
|
|
||||||
|
} // namespace td
|
Loading…
Reference in New Issue
Block a user