-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathremtask.cpp
98 lines (76 loc) · 2.21 KB
/
remtask.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "remtask.h"
#include <netdb.h>
RemoteTask::RemoteTask(TaskPool& taskPool, taskhandle_t handle, taskid_t id, pid_t pid,
uint16_t cmdPort, uint16_t dataPort, ipaddr_t remoteAddr) :
ExternalTask(taskPool, handle, id, pid, cmdPort, dataPort), receiving(false), remoteAddr(remoteAddr)
{
}
bool RemoteTask::rejectTask(taskhandle_t task)
{
if (::rejectTask(task)) {
syslog(LOG_ERR, "rejecting task %s from %s", task.str(), remoteAddr.str().c_str());
sendErrorToClient(ACNET_REQREJ);
return true;
}
return false;
}
void RemoteTask::handleReceiveRequests()
{
receiving = true;
Ack ack;
if (!sendAckToClient(&ack, sizeof(ack)))
taskPool().removeTask(this);
}
void RemoteTask::handleBlockRequests()
{
receiving = false;
while (!replies.empty())
taskPool().rpyPool.endRpyId(*replies.begin(), ACNET_DISCONNECTED);
Ack ack;
if (!sendAckToClient(&ack, sizeof(ack)))
taskPool().removeTask(this);
}
void RemoteTask::handleSend(SendCommand const *cmd, size_t const len)
{
if (!rejectTask(cmd->task()))
ExternalTask::handleSend(cmd, len);
}
void RemoteTask::handleSendRequest(SendRequestCommand const *cmd, size_t const len)
{
if (!rejectTask(cmd->task()))
ExternalTask::handleSendRequest(cmd, len);
}
void RemoteTask::handleSendRequestWithTimeout(SendRequestWithTimeoutCommand const* cmd, size_t const len)
{
if (!rejectTask(cmd->task()))
ExternalTask::handleSendRequestWithTimeout(cmd, len);
}
size_t RemoteTask::totalProp() const
{
return ExternalTask::totalProp() + 1;
}
char const* RemoteTask::propName(size_t ii) const
{
if (ii < ExternalTask::totalProp())
return ExternalTask::propName(ii);
if (ii == (ExternalTask::totalProp()))
return "Remote Address";
return 0;
}
std::string RemoteTask::propVal(size_t ii) const
{
if (ii < ExternalTask::totalProp())
return ExternalTask::propVal(ii);
if (ii == (ExternalTask::totalProp())) {
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = 0;
addr.sin_addr.s_addr = htonl(remoteAddr.value());
char host[1024];
if (getnameinfo((sockaddr *) &addr, sizeof(addr), host, sizeof(host), 0, 0, 0) == 0)
return std::string(host);
else
return remoteAddr.str();
}
return "";
}