Critical server errors are now communicated back to client
Этот коммит содержится в:
родитель
02a35f07e3
Коммит
2c206d5456
@ -199,6 +199,7 @@ enum
|
|||||||
IPERF_START = 15,
|
IPERF_START = 15,
|
||||||
IPERF_DONE = 16,
|
IPERF_DONE = 16,
|
||||||
ACCESS_DENIED = -1,
|
ACCESS_DENIED = -1,
|
||||||
|
SERVER_ERROR = -2,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SEC_TO_NS 1000000000 /* too big for enum on some platforms */
|
#define SEC_TO_NS 1000000000 /* too big for enum on some platforms */
|
||||||
|
@ -673,7 +673,8 @@ parse_parameters(struct iperf_test *test)
|
|||||||
int
|
int
|
||||||
iperf_exchange_parameters(struct iperf_test * test)
|
iperf_exchange_parameters(struct iperf_test * test)
|
||||||
{
|
{
|
||||||
int s;
|
int s, msg;
|
||||||
|
char state;
|
||||||
|
|
||||||
if (test->role == 'c') {
|
if (test->role == 'c') {
|
||||||
|
|
||||||
@ -685,8 +686,24 @@ iperf_exchange_parameters(struct iperf_test * test)
|
|||||||
if (parse_parameters(test) < 0)
|
if (parse_parameters(test) < 0)
|
||||||
return (-1);
|
return (-1);
|
||||||
|
|
||||||
if ((s = test->protocol->listen(test)) < 0)
|
if ((s = test->protocol->listen(test)) < 0) {
|
||||||
|
state = SERVER_ERROR;
|
||||||
|
if (Nwrite(test->ctrl_sck, &state, sizeof(state), Ptcp) < 0) {
|
||||||
|
i_errno = IESENDMESSAGE;
|
||||||
return (-1);
|
return (-1);
|
||||||
|
}
|
||||||
|
msg = htonl(i_errno);
|
||||||
|
if (Nwrite(test->ctrl_sck, &msg, sizeof(msg), Ptcp) < 0) {
|
||||||
|
i_errno = IECTRLWRITE;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
msg = htonl(errno);
|
||||||
|
if (Nwrite(test->ctrl_sck, &msg, sizeof(msg), Ptcp) < 0) {
|
||||||
|
i_errno = IECTRLWRITE;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
FD_SET(s, &test->read_set);
|
FD_SET(s, &test->read_set);
|
||||||
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
|
test->max_fd = (s > test->max_fd) ? s : test->max_fd;
|
||||||
test->prot_listener = s;
|
test->prot_listener = s;
|
||||||
|
@ -47,7 +47,7 @@ iperf_create_streams(struct iperf_test *test)
|
|||||||
int
|
int
|
||||||
iperf_handle_message_client(struct iperf_test *test)
|
iperf_handle_message_client(struct iperf_test *test)
|
||||||
{
|
{
|
||||||
int rval;
|
int rval, perr;
|
||||||
|
|
||||||
if ((rval = read(test->ctrl_sck, &test->state, sizeof(char))) <= 0) {
|
if ((rval = read(test->ctrl_sck, &test->state, sizeof(char))) <= 0) {
|
||||||
if (rval == 0) {
|
if (rval == 0) {
|
||||||
@ -93,6 +93,18 @@ iperf_handle_message_client(struct iperf_test *test)
|
|||||||
case ACCESS_DENIED:
|
case ACCESS_DENIED:
|
||||||
i_errno = IEACCESSDENIED;
|
i_errno = IEACCESSDENIED;
|
||||||
return (-1);
|
return (-1);
|
||||||
|
case SERVER_ERROR:
|
||||||
|
if (Nread(test->ctrl_sck, &i_errno, sizeof(i_errno), Ptcp) < 0) {
|
||||||
|
i_errno = IECTRLREAD;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
i_errno = ntohl(i_errno);
|
||||||
|
if (Nread(test->ctrl_sck, &perr, sizeof(perr), Ptcp) < 0) {
|
||||||
|
i_errno = IECTRLREAD;
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
errno = ntohl(perr);
|
||||||
|
return (-1);
|
||||||
default:
|
default:
|
||||||
i_errno = IEMESSAGE;
|
i_errno = IEMESSAGE;
|
||||||
return (-1);
|
return (-1);
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user