ebusctl improved for 'listen' command
This commit is contained in:
+129
-19
@@ -28,6 +28,10 @@
|
|||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
#include <poll.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
Appl& A = Appl::Instance("Command", "{Args...}");
|
Appl& A = Appl::Instance("Command", "{Args...}");
|
||||||
@@ -48,6 +52,119 @@ void define_args()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
string fetchData(TCPSocket* socket, bool& listening)
|
||||||
|
{
|
||||||
|
char data[1024];
|
||||||
|
ssize_t datalen;
|
||||||
|
ostringstream ss;
|
||||||
|
string message;
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
struct timespec tdiff;
|
||||||
|
|
||||||
|
// set timeout
|
||||||
|
tdiff.tv_sec = 0;
|
||||||
|
tdiff.tv_nsec = 100000;
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
int nfds = 2;
|
||||||
|
struct pollfd fds[nfds];
|
||||||
|
|
||||||
|
memset(fds, 0, sizeof(fds));
|
||||||
|
|
||||||
|
fds[0].fd = STDIN_FILENO;
|
||||||
|
fds[0].events = POLLIN;
|
||||||
|
|
||||||
|
fds[1].fd = socket->getFD();
|
||||||
|
fds[1].events = POLLIN;
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
int maxfd;
|
||||||
|
fd_set checkfds;
|
||||||
|
|
||||||
|
FD_ZERO(&checkfds);
|
||||||
|
FD_SET(STDIN_FILENO, &checkfds);
|
||||||
|
FD_SET(socket->getFD(), &checkfds);
|
||||||
|
|
||||||
|
(STDIN_FILENO > socket->getFD()) ?
|
||||||
|
(maxfd = notify.notifyFD()) : (maxfd = socket->getFD());
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
while(true) {
|
||||||
|
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
// wait for new fd event
|
||||||
|
ret = ppoll(fds, nfds, &tdiff, NULL);
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// set readfds to inital checkfds
|
||||||
|
fd_set readfds = checkfds;
|
||||||
|
// wait for new fd event
|
||||||
|
ret = pselect(maxfd + 1, &readfds, NULL, NULL, &tdiff, NULL);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool newData = false;
|
||||||
|
bool newInput = false;
|
||||||
|
if (ret != 0) {
|
||||||
|
#ifdef HAVE_PPOLL
|
||||||
|
// new data from notify
|
||||||
|
newInput = fds[0].revents & POLLIN;
|
||||||
|
|
||||||
|
// new data from socket
|
||||||
|
newData = fds[1].revents & POLLIN;
|
||||||
|
#else
|
||||||
|
#ifdef HAVE_PSELECT
|
||||||
|
// new data from notify
|
||||||
|
newInput = FD_ISSET(STDIN_FILENO, &readfds);
|
||||||
|
|
||||||
|
// new data from socket
|
||||||
|
newData = FD_ISSET(socket->getFD(), &readfds);
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newData == true) {
|
||||||
|
if (socket->isValid() == true) {
|
||||||
|
datalen = socket->recv(data, sizeof(data));
|
||||||
|
|
||||||
|
if (datalen < 0) {
|
||||||
|
perror("recv");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < datalen; i++)
|
||||||
|
ss << data[i];
|
||||||
|
|
||||||
|
if ((ss.str().length() >= 2
|
||||||
|
&& ss.str()[ss.str().length()-2] == '\n'
|
||||||
|
&& ss.str()[ss.str().length()-1] == '\n')
|
||||||
|
|| listening == true)
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (newInput == true) {
|
||||||
|
getline(cin, message);
|
||||||
|
message += '\n';
|
||||||
|
|
||||||
|
socket->send(message.c_str(), message.size());
|
||||||
|
|
||||||
|
if (strncasecmp(message.c_str(), "QUIT", 4) == 0
|
||||||
|
|| strncasecmp(message.c_str(), "STOP", 4) == 0)
|
||||||
|
exit(EXIT_SUCCESS);
|
||||||
|
|
||||||
|
message.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
bool connect(const char* host, int port, bool once)
|
bool connect(const char* host, int port, bool once)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -55,9 +172,9 @@ bool connect(const char* host, int port, bool once)
|
|||||||
TCPSocket* socket = client->connect(host, port);
|
TCPSocket* socket = client->connect(host, port);
|
||||||
|
|
||||||
if (socket != NULL) {
|
if (socket != NULL) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
string message;
|
string message;
|
||||||
|
bool listening = false;
|
||||||
|
|
||||||
if (once == false) {
|
if (once == false) {
|
||||||
cout << host << ": ";
|
cout << host << ": ";
|
||||||
@@ -73,29 +190,22 @@ bool connect(const char* host, int port, bool once)
|
|||||||
|
|
||||||
socket->send(message.c_str(), message.size());
|
socket->send(message.c_str(), message.size());
|
||||||
|
|
||||||
if (strncasecmp(message.c_str(), "QUIT", 4) != 0 && strncasecmp(message.c_str(), "STOP", 4) != 0) {
|
if (strncasecmp(message.c_str(), "QUIT", 4) != 0
|
||||||
char data[1024];
|
&& strncasecmp(message.c_str(), "STOP", 4) != 0)
|
||||||
ssize_t datalen;
|
|
||||||
string ss;
|
|
||||||
|
|
||||||
while(1) {
|
if (strncasecmp(message.c_str(), "L", 1) == 0
|
||||||
datalen = socket->recv(data, sizeof(data));
|
|| strncasecmp(message.c_str(), "LISTEN", 6) == 0) {
|
||||||
|
listening = true;
|
||||||
if (datalen < 0) {
|
while (listening) {
|
||||||
perror("send");
|
string result(fetchData(socket, listening));
|
||||||
|
cout << result;
|
||||||
|
if (strncasecmp(result.c_str(), "LISTEN STOPPED", 14) == 0)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < datalen; i++)
|
|
||||||
ss += data[i];
|
|
||||||
|
|
||||||
if (ss.length() >= 2 && ss[ss.length()-2] == '\n' && ss[ss.length()-1] == '\n')
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
cout << fetchData(socket, listening);
|
||||||
|
|
||||||
cout << ss;
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user